| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace BookStack\Entities\Models; | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | use BookStack\Actions\Activity; | 
					
						
							|  |  |  | use BookStack\Actions\Comment; | 
					
						
							| 
									
										
										
										
											2021-05-16 07:29:56 +08:00
										 |  |  | use BookStack\Actions\Favourite; | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							| 
									
										
										
										
											2021-11-20 22:03:56 +08:00
										 |  |  | use BookStack\Interfaces\Deletable; | 
					
						
							| 
									
										
										
										
											2021-05-16 07:29:56 +08:00
										 |  |  | use BookStack\Interfaces\Favouritable; | 
					
						
							| 
									
										
										
										
											2021-12-12 01:29:33 +08:00
										 |  |  | use BookStack\Interfaces\Loggable; | 
					
						
							| 
									
										
										
										
											2021-03-09 06:34:22 +08:00
										 |  |  | use BookStack\Interfaces\Sluggable; | 
					
						
							| 
									
										
										
										
											2021-05-16 17:49:37 +08:00
										 |  |  | use BookStack\Interfaces\Viewable; | 
					
						
							| 
									
										
										
										
											2020-12-31 02:25:35 +08:00
										 |  |  | use BookStack\Model; | 
					
						
							|  |  |  | use BookStack\Traits\HasCreatorAndUpdater; | 
					
						
							|  |  |  | use BookStack\Traits\HasOwner; | 
					
						
							| 
									
										
										
										
											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. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |  * @property int        $id | 
					
						
							|  |  |  |  * @property string     $name | 
					
						
							|  |  |  |  * @property string     $slug | 
					
						
							|  |  |  |  * @property Carbon     $created_at | 
					
						
							|  |  |  |  * @property Carbon     $updated_at | 
					
						
							|  |  |  |  * @property int        $created_by | 
					
						
							|  |  |  |  * @property int        $updated_by | 
					
						
							|  |  |  |  * @property bool       $restricted | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |  * @property Collection $tags | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |  * @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
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2021-12-12 01:29:33 +08:00
										 |  |  | abstract class Entity extends Model implements Sluggable, Favouritable, Viewable, Deletable, Loggable | 
					
						
							| 
									
										
										
										
											2015-08-16 21:51:45 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-09-28 06:24:33 +08:00
										 |  |  |     use SoftDeletes; | 
					
						
							| 
									
										
										
										
											2020-12-31 02:25:35 +08:00
										 |  |  |     use HasCreatorAndUpdater; | 
					
						
							|  |  |  |     use HasOwner; | 
					
						
							| 
									
										
										
										
											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. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-10-27 05:04:18 +08:00
										 |  |  |     public function matches(self $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
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-10-27 05:04:18 +08:00
										 |  |  |     public function matchesOrContains(self $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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-23 07:33:55 +08:00
										 |  |  |         if (($entity instanceof BookChild) && $this instanceof Book) { | 
					
						
							| 
									
										
										
										
											2015-11-30 02:06:55 +08:00
										 |  |  |             return $entity->book_id === $this->id; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-23 07:33:55 +08:00
										 |  |  |         if ($entity instanceof Page && $this instanceof Chapter) { | 
					
						
							| 
									
										
										
										
											2015-11-30 02:06:55 +08:00
										 |  |  |             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
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * Get the comments for an entity. | 
					
						
							| 
									
										
										
										
											2017-09-03 23:37:51 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											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'); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-09 22:56:24 +08:00
										 |  |  |         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. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * Examples of $type are 'page', 'book', 'chapter'. | 
					
						
							| 
									
										
										
										
											2021-11-23 06:22:31 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-11-20 22:03:56 +08:00
										 |  |  |      * @deprecated Use instanceof instead. | 
					
						
							| 
									
										
										
										
											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]; | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-09 07:46:38 +08:00
										 |  |  |         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; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 02:42:25 +08:00
										 |  |  |         return mb_substr($this->name, 0, $length - 3) . '...'; | 
					
						
							| 
									
										
										
										
											2015-12-05 22:41:51 +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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-11-12 21:47:23 +08:00
										 |  |  |         $text = $this->{$this->textField} ?? ''; | 
					
						
							| 
									
										
										
										
											2020-11-22 09:20:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-17 01:49:16 +08:00
										 |  |  |         if (mb_strlen($text) > $length) { | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             $text = mb_substr($text, 0, $length - 3) . '...'; | 
					
						
							| 
									
										
										
										
											2018-10-17 01:49:16 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * Get the url of this entity. | 
					
						
							| 
									
										
										
										
											2017-04-30 05:01:43 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											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. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-10-27 05:04:18 +08:00
										 |  |  |     public function getParent(): ?self | 
					
						
							| 
									
										
										
										
											2020-11-03 06:47:48 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-06-26 19:12:11 +08:00
										 |  |  |         if ($this instanceof 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
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-06-26 19:12:11 +08:00
										 |  |  |         if ($this instanceof Chapter) { | 
					
						
							| 
									
										
										
										
											2020-11-07 23:05:13 +08:00
										 |  |  |             return $this->book()->withTrashed()->first(); | 
					
						
							| 
									
										
										
										
											2020-11-03 06:47:48 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * Index the current entity for search. | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      */ | 
					
						
							|  |  |  |     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
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2021-10-27 05:04:18 +08:00
										 |  |  |      * {@inheritdoc} | 
					
						
							| 
									
										
										
										
											2019-09-20 07:18:28 +08:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function refreshSlug(): string | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-03-10 07:06:12 +08:00
										 |  |  |         $this->slug = app(SlugGenerator::class)->generate($this); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-20 07:18:28 +08:00
										 |  |  |         return $this->slug; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-05-16 07:29:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2021-10-27 05:04:18 +08:00
										 |  |  |      * {@inheritdoc} | 
					
						
							| 
									
										
										
										
											2021-05-16 07:29:56 +08:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function favourites(): MorphMany | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->morphMany(Favourite::class, 'favouritable'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Check if the entity is a favourite of the current user. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function isFavourite(): bool | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->favourites() | 
					
						
							|  |  |  |             ->where('user_id', '=', user()->id) | 
					
						
							|  |  |  |             ->exists(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-12-12 01:29:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * {@inheritdoc} | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function logDescriptor(): string | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return "({$this->id}) {$this->name}"; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-08-16 21:51:45 +08:00
										 |  |  | } |