| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace BookStack\Entities\Models; | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | use BookStack\Activity\Models\Activity; | 
					
						
							|  |  |  | use BookStack\Activity\Models\Comment; | 
					
						
							|  |  |  | use BookStack\Activity\Models\Favouritable; | 
					
						
							|  |  |  | use BookStack\Activity\Models\Favourite; | 
					
						
							|  |  |  | use BookStack\Activity\Models\Loggable; | 
					
						
							|  |  |  | use BookStack\Activity\Models\Tag; | 
					
						
							|  |  |  | use BookStack\Activity\Models\View; | 
					
						
							|  |  |  | use BookStack\Activity\Models\Viewable; | 
					
						
							| 
									
										
										
										
											2023-09-03 21:19:43 +08:00
										 |  |  | use BookStack\Activity\Models\Watch; | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | use BookStack\App\Model; | 
					
						
							|  |  |  | use BookStack\App\Sluggable; | 
					
						
							| 
									
										
										
										
											2020-11-22 08:17:45 +08:00
										 |  |  | use BookStack\Entities\Tools\SlugGenerator; | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | use BookStack\Permissions\JointPermissionBuilder; | 
					
						
							|  |  |  | use BookStack\Permissions\Models\EntityPermission; | 
					
						
							|  |  |  | use BookStack\Permissions\Models\JointPermission; | 
					
						
							|  |  |  | use BookStack\Permissions\PermissionApplicator; | 
					
						
							| 
									
										
										
										
											2022-08-17 21:39:53 +08:00
										 |  |  | use BookStack\References\Reference; | 
					
						
							| 
									
										
										
										
											2022-08-16 18:27:22 +08:00
										 |  |  | use BookStack\Search\SearchIndex; | 
					
						
							|  |  |  | use BookStack\Search\SearchTerm; | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | use BookStack\Users\Models\HasCreatorAndUpdater; | 
					
						
							|  |  |  | use BookStack\Users\Models\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 | 
					
						
							| 
									
										
										
										
											2022-01-11 01:04:01 +08:00
										 |  |  |  * @property Carbon     $deleted_at | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |  * @property int        $created_by | 
					
						
							|  |  |  |  * @property int        $updated_by | 
					
						
							| 
									
										
										
										
											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 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 | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-12-19 00:23:40 +08:00
										 |  |  |     public string $textField = 'description'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @var string - Name of the property where the main HTML content is found | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public string $htmlField = 'description_html'; | 
					
						
							| 
									
										
										
										
											2017-01-02 00:57:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 02:46:31 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @var float - Multiplier for search indexing. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-12-19 00:23:40 +08:00
										 |  |  |     public float $searchFactor = 1.0; | 
					
						
							| 
									
										
										
										
											2018-03-25 02:46:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-07-16 20:17:08 +08:00
										 |  |  |         return app()->make(PermissionApplicator::class)->restrictEntityQuery($query); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * 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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-05-04 23:28:18 +08:00
										 |  |  |         return $this->morphMany(Activity::class, 'loggable') | 
					
						
							| 
									
										
										
										
											2019-09-20 07:18:28 +08:00
										 |  |  |             ->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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-10-08 20:52:59 +08:00
										 |  |  |         return $this->morphMany(EntityPermission::class, 'entity'); | 
					
						
							| 
									
										
										
										
											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
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2022-10-10 23:22:51 +08:00
										 |  |  |     public function hasPermissions(): bool | 
					
						
							| 
									
										
										
										
											2015-08-31 18:43:28 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-10-10 23:22:51 +08:00
										 |  |  |         return $this->permissions()->count() > 0; | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-17 21:39:53 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get the references pointing from this entity to other items. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function referencesFrom(): MorphMany | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->morphMany(Reference::class, 'from'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get the references pointing to this entity from other items. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function referencesTo(): MorphMany | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->morphMany(Reference::class, 'to'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-07-13 03:15:41 +08:00
										 |  |  |         app()->make(JointPermissionBuilder::class)->rebuildForEntity(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() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-07-13 03:15:41 +08:00
										 |  |  |         app()->make(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 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-07-13 03:15:41 +08:00
										 |  |  |         $this->slug = app()->make(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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-03 21:19:43 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get the related watches for this entity. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function watches(): MorphMany | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->morphMany(Watch::class, 'watchable'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | } |