| 
									
										
										
										
											2020-11-22 08:17:45 +08:00
										 |  |  | <?php namespace BookStack\Entities\Models; | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | use BookStack\Actions\Activity; | 
					
						
							|  |  |  | use BookStack\Actions\Comment; | 
					
						
							| 
									
										
										
										
											2018-09-25 23:58:03 +08:00
										 |  |  | use BookStack\Actions\Tag; | 
					
						
							|  |  |  | use BookStack\Actions\View; | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  | use BookStack\Auth\Permissions\EntityPermission; | 
					
						
							|  |  |  | use BookStack\Auth\Permissions\JointPermission; | 
					
						
							| 
									
										
										
										
											2020-11-22 08:17:45 +08:00
										 |  |  | use BookStack\Entities\Tools\SearchIndex; | 
					
						
							|  |  |  | use BookStack\Entities\Tools\SlugGenerator; | 
					
						
							| 
									
										
										
										
											2019-09-20 07:18:28 +08:00
										 |  |  | use BookStack\Facades\Permissions; | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  | use BookStack\Ownable; | 
					
						
							| 
									
										
										
										
											2018-09-26 01:00:40 +08:00
										 |  |  | use Carbon\Carbon; | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | use Illuminate\Database\Eloquent\Builder; | 
					
						
							|  |  |  | use Illuminate\Database\Eloquent\Collection; | 
					
						
							| 
									
										
										
										
											2017-09-03 23:37:51 +08:00
										 |  |  | use Illuminate\Database\Eloquent\Relations\MorphMany; | 
					
						
							| 
									
										
										
										
											2020-09-28 06:24:33 +08:00
										 |  |  | use Illuminate\Database\Eloquent\SoftDeletes; | 
					
						
							| 
									
										
										
										
											2017-09-03 23:37:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-26 01:00:40 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Class Entity | 
					
						
							|  |  |  |  * The base class for book-like items such as pages, chapters & books. | 
					
						
							|  |  |  |  * This is not a database model in itself but extended. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-09-20 01:03:17 +08:00
										 |  |  |  * @property int $id | 
					
						
							| 
									
										
										
										
											2018-09-26 01:00:40 +08:00
										 |  |  |  * @property string $name | 
					
						
							|  |  |  |  * @property string $slug | 
					
						
							|  |  |  |  * @property Carbon $created_at | 
					
						
							|  |  |  |  * @property Carbon $updated_at | 
					
						
							|  |  |  |  * @property int $created_by | 
					
						
							|  |  |  |  * @property int $updated_by | 
					
						
							|  |  |  |  * @property boolean $restricted | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |  * @property Collection $tags | 
					
						
							|  |  |  |  * @method static Entity|Builder visible() | 
					
						
							|  |  |  |  * @method static Entity|Builder hasPermission(string $permission) | 
					
						
							|  |  |  |  * @method static Builder withLastView() | 
					
						
							|  |  |  |  * @method static Builder withViewCount() | 
					
						
							| 
									
										
										
										
											2018-09-26 01:00:40 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  | abstract class Entity extends Ownable | 
					
						
							| 
									
										
										
										
											2015-08-16 21:51:45 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-09-28 06:24:33 +08:00
										 |  |  |     use SoftDeletes; | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 02:46:31 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @var string - Name of property where the main text content is found | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2017-03-27 18:57:33 +08:00
										 |  |  |     public $textField = 'description'; | 
					
						
							| 
									
										
										
										
											2017-01-02 00:57:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 02:46:31 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @var float - Multiplier for search indexing. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public $searchFactor = 1.0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * Get the entities that are visible to the current user. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  |     public function scopeVisible(Builder $query): Builder | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         return $this->scopeHasPermission($query, 'view'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Scope the query to those entities that the current user has the given permission for. | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function scopeHasPermission(Builder $query, string $permission) | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         return Permissions::restrictEntityQuery($query, $permission); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Query scope to get the last view from the current user. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function scopeWithLastView(Builder $query) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $viewedAtQuery = View::query()->select('updated_at') | 
					
						
							|  |  |  |             ->whereColumn('viewable_id', '=', $this->getTable() . '.id') | 
					
						
							|  |  |  |             ->where('viewable_type', '=', $this->getMorphClass()) | 
					
						
							|  |  |  |             ->where('user_id', '=', user()->id) | 
					
						
							|  |  |  |             ->take(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $query->addSelect(['last_viewed_at' => $viewedAtQuery]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Query scope to get the total view count of the entities. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function scopeWithViewCount(Builder $query) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $viewCountQuery = View::query()->selectRaw('SUM(views) as view_count') | 
					
						
							|  |  |  |             ->whereColumn('viewable_id', '=', $this->getTable() . '.id') | 
					
						
							|  |  |  |             ->where('viewable_type', '=', $this->getMorphClass())->take(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $query->addSelect(['view_count' => $viewCountQuery]); | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-16 21:51:45 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Compares this entity to another given entity. | 
					
						
							|  |  |  |      * Matches by comparing class and id. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  |     public function matches(Entity $entity): bool | 
					
						
							| 
									
										
										
										
											2015-08-16 21:51:45 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         return [get_class($this), $this->id] === [get_class($entity), $entity->id]; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-08-17 01:59:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-30 02:06:55 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  |      * Checks if the current entity matches or contains the given. | 
					
						
							| 
									
										
										
										
											2015-11-30 02:06:55 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  |     public function matchesOrContains(Entity $entity): bool | 
					
						
							| 
									
										
										
										
											2015-11-30 02:06:55 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  |         if ($this->matches($entity)) { | 
					
						
							| 
									
										
										
										
											2018-01-29 00:58:52 +08:00
										 |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-11-30 02:06:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-02 22:48:35 +08:00
										 |  |  |         if (($entity->isA('chapter') || $entity->isA('page')) && $this->isA('book')) { | 
					
						
							| 
									
										
										
										
											2015-11-30 02:06:55 +08:00
										 |  |  |             return $entity->book_id === $this->id; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($entity->isA('page') && $this->isA('chapter')) { | 
					
						
							|  |  |  |             return $entity->chapter_id === $this->id; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-17 01:59:23 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |      * Gets the activity objects for this entity. | 
					
						
							| 
									
										
										
										
											2015-08-17 01:59:23 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  |     public function activity(): MorphMany | 
					
						
							| 
									
										
										
										
											2015-08-17 01:59:23 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-09-20 07:18:28 +08:00
										 |  |  |         return $this->morphMany(Activity::class, 'entity') | 
					
						
							|  |  |  |             ->orderBy('created_at', 'desc'); | 
					
						
							| 
									
										
										
										
											2015-08-17 01:59:23 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get View objects for this entity. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  |     public function views(): MorphMany | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         return $this->morphMany(View::class, 'viewable'); | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-07 03:33:08 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |      * Get the Tag models that have been user assigned to this entity. | 
					
						
							| 
									
										
										
										
											2016-05-07 03:33:08 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  |     public function tags(): MorphMany | 
					
						
							| 
									
										
										
										
											2016-05-07 03:33:08 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-05-15 03:02:00 +08:00
										 |  |  |         return $this->morphMany(Tag::class, 'entity')->orderBy('order', 'asc'); | 
					
						
							| 
									
										
										
										
											2016-05-07 03:33:08 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-03 23:37:51 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get the comments for an entity | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  |     public function comments(bool $orderByCreated = true): MorphMany | 
					
						
							| 
									
										
										
										
											2017-09-03 23:37:51 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-09-09 22:56:24 +08:00
										 |  |  |         $query = $this->morphMany(Comment::class, 'entity'); | 
					
						
							|  |  |  |         return $orderByCreated ? $query->orderBy('created_at', 'asc') : $query; | 
					
						
							| 
									
										
										
										
											2017-09-03 23:37:51 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-19 20:48:44 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get the related search terms. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  |     public function searchTerms(): MorphMany | 
					
						
							| 
									
										
										
										
											2017-03-19 20:48:44 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         return $this->morphMany(SearchTerm::class, 'entity'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-31 18:43:28 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-02-28 18:49:41 +08:00
										 |  |  |      * Get this entities restrictions. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  |     public function permissions(): MorphMany | 
					
						
							| 
									
										
										
										
											2016-02-28 18:49:41 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         return $this->morphMany(EntityPermission::class, 'restrictable'); | 
					
						
							| 
									
										
										
										
											2016-02-28 18:49:41 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Check if this entity has a specific restriction set against it. | 
					
						
							| 
									
										
										
										
											2015-08-31 18:43:28 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  |     public function hasRestriction(int $role_id, string $action): bool | 
					
						
							| 
									
										
										
										
											2015-08-31 18:43:28 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         return $this->permissions()->where('role_id', '=', $role_id) | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |             ->where('action', '=', $action)->count() > 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-24 01:14:26 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |      * Get the entity jointPermissions this is connected to. | 
					
						
							| 
									
										
										
										
											2016-04-24 01:14:26 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-09-28 06:24:33 +08:00
										 |  |  |     public function jointPermissions(): MorphMany | 
					
						
							| 
									
										
										
										
											2016-04-24 01:14:26 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         return $this->morphMany(JointPermission::class, 'entity'); | 
					
						
							| 
									
										
										
										
											2016-04-24 01:14:26 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-28 06:24:33 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get the related delete records for this entity. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-10-04 01:44:12 +08:00
										 |  |  |     public function deletions(): MorphMany | 
					
						
							| 
									
										
										
										
											2020-09-28 06:24:33 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-10-04 01:44:12 +08:00
										 |  |  |         return $this->morphMany(Deletion::class, 'deletable'); | 
					
						
							| 
									
										
										
										
											2020-09-28 06:24:33 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2020-09-27 00:00:17 +08:00
										 |  |  |      * Check if this instance or class is a certain type of entity. | 
					
						
							|  |  |  |      * Examples of $type are 'page', 'book', 'chapter' | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-09-27 00:00:17 +08:00
										 |  |  |     public static function isA(string $type): bool | 
					
						
							| 
									
										
										
										
											2015-08-31 18:43:28 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-04-24 01:14:26 +08:00
										 |  |  |         return static::getType() === strtolower($type); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2020-12-09 07:46:38 +08:00
										 |  |  |      * Get the entity type as a simple lowercase word. | 
					
						
							| 
									
										
										
										
											2016-04-24 01:14:26 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-12-09 07:46:38 +08:00
										 |  |  |     public static function getType(): string | 
					
						
							| 
									
										
										
										
											2016-04-24 01:14:26 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-12-09 07:46:38 +08:00
										 |  |  |         $className = array_slice(explode('\\', static::class), -1, 1)[0]; | 
					
						
							|  |  |  |         return strtolower($className); | 
					
						
							| 
									
										
										
										
											2015-08-31 18:43:28 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 22:41:51 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |      * Gets a limited-length version of the entities name. | 
					
						
							| 
									
										
										
										
											2015-12-05 22:41:51 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-09-19 19:06:45 +08:00
										 |  |  |     public function getShortName(int $length = 25): string | 
					
						
							| 
									
										
										
										
											2015-12-05 22:41:51 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-09-12 02:42:25 +08:00
										 |  |  |         if (mb_strlen($this->name) <= $length) { | 
					
						
							| 
									
										
										
										
											2018-01-29 00:58:52 +08:00
										 |  |  |             return $this->name; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-09-12 02:42:25 +08:00
										 |  |  |         return mb_substr($this->name, 0, $length - 3) . '...'; | 
					
						
							| 
									
										
										
										
											2015-12-05 22:41:51 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-19 20:48:44 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get the body text of this entity. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  |     public function getText(): string | 
					
						
							| 
									
										
										
										
											2017-03-19 20:48:44 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  |         return $this->{$this->textField} ?? ''; | 
					
						
							| 
									
										
										
										
											2017-03-19 20:48:44 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-17 01:49:16 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get an excerpt of this entity's descriptive content to the specified length. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  |     public function getExcerpt(int $length = 100): string | 
					
						
							| 
									
										
										
										
											2018-10-17 01:49:16 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $text = $this->getText(); | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-17 01:49:16 +08:00
										 |  |  |         if (mb_strlen($text) > $length) { | 
					
						
							|  |  |  |             $text = mb_substr($text, 0, $length-3) . '...'; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-07 01:47:27 +08:00
										 |  |  |         return trim($text); | 
					
						
							| 
									
										
										
										
											2018-10-17 01:49:16 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 05:01:43 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get the url of this entity | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  |     abstract public function getUrl(string $path = '/'): string; | 
					
						
							| 
									
										
										
										
											2019-09-20 07:18:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-03 06:47:48 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get the parent entity if existing. | 
					
						
							|  |  |  |      * This is the "static" parent and does not include dynamic | 
					
						
							|  |  |  |      * relations such as shelves to books. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getParent(): ?Entity | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($this->isA('page')) { | 
					
						
							| 
									
										
										
										
											2020-11-06 20:54:39 +08:00
										 |  |  |             return $this->chapter_id ? $this->chapter()->withTrashed()->first() : $this->book()->withTrashed()->first(); | 
					
						
							| 
									
										
										
										
											2020-11-03 06:47:48 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |         if ($this->isA('chapter')) { | 
					
						
							| 
									
										
										
										
											2020-11-07 23:05:13 +08:00
										 |  |  |             return $this->book()->withTrashed()->first(); | 
					
						
							| 
									
										
										
										
											2020-11-03 06:47:48 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |         return null; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-20 07:18:28 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Rebuild the permissions for this entity. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function rebuildPermissions() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         /** @noinspection PhpUnhandledExceptionInspection */ | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  |         Permissions::buildJointPermissionsForEntity(clone $this); | 
					
						
							| 
									
										
										
										
											2019-09-20 07:18:28 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Index the current entity for search | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function indexForSearch() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-11-22 08:17:45 +08:00
										 |  |  |         app(SearchIndex::class)->indexEntity(clone $this); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-20 07:18:28 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Generate and set a new URL slug for this model. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function refreshSlug(): string | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-11-22 07:20:54 +08:00
										 |  |  |         $this->slug = (new SlugGenerator)->generate($this); | 
					
						
							| 
									
										
										
										
											2019-09-20 07:18:28 +08:00
										 |  |  |         return $this->slug; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-08-16 21:51:45 +08:00
										 |  |  | } |