X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/8b550991a4dbcd7a05e08e8f600b5444d5f4004d..refs/pull/1755/head:/app/Entities/Entity.php diff --git a/app/Entities/Entity.php b/app/Entities/Entity.php index 4e54a9e27..5013c39cf 100644 --- a/app/Entities/Entity.php +++ b/app/Entities/Entity.php @@ -9,6 +9,8 @@ use BookStack\Auth\Permissions\JointPermission; use BookStack\Facades\Permissions; use BookStack\Ownable; use Carbon\Carbon; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Relations\MorphMany; /** @@ -24,6 +26,11 @@ use Illuminate\Database\Eloquent\Relations\MorphMany; * @property int $created_by * @property int $updated_by * @property boolean $restricted + * @property Collection $tags + * @method static Entity|Builder visible() + * @method static Entity|Builder hasPermission(string $permission) + * @method static Builder withLastView() + * @method static Builder withViewCount() * * @package BookStack\Entities */ @@ -41,14 +48,45 @@ class Entity extends Ownable public $searchFactor = 1.0; /** - * Get the morph class for this model. - * Set here since, due to folder changes, the namespace used - * in the database no longer matches the class namespace. - * @return string + * Get the entities that are visible to the current user. + */ + public function scopeVisible(Builder $query) + { + return $this->scopeHasPermission($query, 'view'); + } + + /** + * Scope the query to those entities that the current user has the given permission for. */ - public function getMorphClass() + public function scopeHasPermission(Builder $query, string $permission) { - return 'BookStack\\Entity'; + 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]); } /** @@ -88,7 +126,7 @@ class Entity extends Ownable /** * Gets the activity objects for this entity. - * @return \Illuminate\Database\Eloquent\Relations\MorphMany + * @return MorphMany */ public function activity() { @@ -106,7 +144,7 @@ class Entity extends Ownable /** * Get the Tag models that have been user assigned to this entity. - * @return \Illuminate\Database\Eloquent\Relations\MorphMany + * @return MorphMany */ public function tags() { @@ -126,7 +164,7 @@ class Entity extends Ownable /** * Get the related search terms. - * @return \Illuminate\Database\Eloquent\Relations\MorphMany + * @return MorphMany */ public function searchTerms() { @@ -155,7 +193,7 @@ class Entity extends Ownable /** * Get the entity jointPermissions this is connected to. - * @return \Illuminate\Database\Eloquent\Relations\MorphMany + * @return MorphMany */ public function jointPermissions() { @@ -182,14 +220,6 @@ class Entity extends Ownable return strtolower(static::getClassName()); } - /** - * Get the type of this entity. - */ - public function type(): string - { - return static::getType(); - } - /** * Get an instance of an entity of the given type. * @param $type @@ -242,15 +272,6 @@ class Entity extends Ownable return trim($text); } - /** - * Return a generalised, common raw query that can be 'unioned' across entities. - * @return string - */ - public function entityRawQuery() - { - return ''; - } - /** * Get the url of this entity * @param $path @@ -270,6 +291,15 @@ class Entity extends Ownable Permissions::buildJointPermissionsForEntity($this); } + /** + * Index the current entity for search + */ + public function indexForSearch() + { + $searchService = app()->make(SearchService::class); + $searchService->indexEntity($this); + } + /** * Generate and set a new URL slug for this model. */