X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/a3ead5062acc169ae3486d90ac2befe3db86bfe6..refs/pull/5689/head:/app/Entities/Models/Entity.php diff --git a/app/Entities/Models/Entity.php b/app/Entities/Models/Entity.php index b55334295..0de83c938 100644 --- a/app/Entities/Models/Entity.php +++ b/app/Entities/Models/Entity.php @@ -2,24 +2,27 @@ namespace BookStack\Entities\Models; -use BookStack\Actions\Activity; -use BookStack\Actions\Comment; -use BookStack\Actions\Favourite; -use BookStack\Actions\Tag; -use BookStack\Actions\View; -use BookStack\Auth\Permissions\EntityPermission; -use BookStack\Auth\Permissions\JointPermission; -use BookStack\Entities\Tools\SearchIndex; +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; +use BookStack\Activity\Models\Watch; +use BookStack\App\Model; +use BookStack\App\Sluggable; use BookStack\Entities\Tools\SlugGenerator; -use BookStack\Facades\Permissions; -use BookStack\Interfaces\Deletable; -use BookStack\Interfaces\Favouritable; -use BookStack\Interfaces\Loggable; -use BookStack\Interfaces\Sluggable; -use BookStack\Interfaces\Viewable; -use BookStack\Model; -use BookStack\Traits\HasCreatorAndUpdater; -use BookStack\Traits\HasOwner; +use BookStack\Permissions\JointPermissionBuilder; +use BookStack\Permissions\Models\EntityPermission; +use BookStack\Permissions\Models\JointPermission; +use BookStack\Permissions\PermissionApplicator; +use BookStack\References\Reference; +use BookStack\Search\SearchIndex; +use BookStack\Search\SearchTerm; +use BookStack\Users\Models\HasCreatorAndUpdater; +use BookStack\Users\Models\HasOwner; use Carbon\Carbon; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Collection; @@ -36,13 +39,12 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property string $slug * @property Carbon $created_at * @property Carbon $updated_at + * @property Carbon $deleted_at * @property int $created_by * @property int $updated_by - * @property bool $restricted * @property Collection $tags * * @method static Entity|Builder visible() - * @method static Entity|Builder hasPermission(string $permission) * @method static Builder withLastView() * @method static Builder withViewCount() */ @@ -55,27 +57,24 @@ abstract class Entity extends Model implements Sluggable, Favouritable, Viewable /** * @var string - Name of property where the main text content is found */ - public $textField = 'description'; + public string $textField = 'description'; /** - * @var float - Multiplier for search indexing. + * @var string - Name of the property where the main HTML content is found */ - public $searchFactor = 1.0; + public string $htmlField = 'description_html'; /** - * Get the entities that are visible to the current user. + * @var float - Multiplier for search indexing. */ - public function scopeVisible(Builder $query): Builder - { - return $this->scopeHasPermission($query, 'view'); - } + public float $searchFactor = 1.0; /** - * Scope the query to those entities that the current user has the given permission for. + * Get the entities that are visible to the current user. */ - public function scopeHasPermission(Builder $query, string $permission) + public function scopeVisible(Builder $query): Builder { - return Permissions::restrictEntityQuery($query, $permission); + return app()->make(PermissionApplicator::class)->restrictEntityQuery($query); } /** @@ -138,7 +137,7 @@ abstract class Entity extends Model implements Sluggable, Favouritable, Viewable */ public function activity(): MorphMany { - return $this->morphMany(Activity::class, 'entity') + return $this->morphMany(Activity::class, 'loggable') ->orderBy('created_at', 'desc'); } @@ -181,16 +180,15 @@ abstract class Entity extends Model implements Sluggable, Favouritable, Viewable */ public function permissions(): MorphMany { - return $this->morphMany(EntityPermission::class, 'restrictable'); + return $this->morphMany(EntityPermission::class, 'entity'); } /** * Check if this entity has a specific restriction set against it. */ - public function hasRestriction(int $role_id, string $action): bool + public function hasPermissions(): bool { - return $this->permissions()->where('role_id', '=', $role_id) - ->where('action', '=', $action)->count() > 0; + return $this->permissions()->count() > 0; } /** @@ -209,6 +207,22 @@ abstract class Entity extends Model implements Sluggable, Favouritable, Viewable return $this->morphMany(Deletion::class, 'deletable'); } + /** + * 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'); + } + /** * Check if this instance or class is a certain type of entity. * Examples of $type are 'page', 'book', 'chapter'. @@ -283,8 +297,7 @@ abstract class Entity extends Model implements Sluggable, Favouritable, Viewable */ public function rebuildPermissions() { - /** @noinspection PhpUnhandledExceptionInspection */ - Permissions::buildJointPermissionsForEntity(clone $this); + app()->make(JointPermissionBuilder::class)->rebuildForEntity(clone $this); } /** @@ -292,7 +305,7 @@ abstract class Entity extends Model implements Sluggable, Favouritable, Viewable */ public function indexForSearch() { - app(SearchIndex::class)->indexEntity(clone $this); + app()->make(SearchIndex::class)->indexEntity(clone $this); } /** @@ -300,7 +313,7 @@ abstract class Entity extends Model implements Sluggable, Favouritable, Viewable */ public function refreshSlug(): string { - $this->slug = app(SlugGenerator::class)->generate($this); + $this->slug = app()->make(SlugGenerator::class)->generate($this); return $this->slug; } @@ -323,6 +336,14 @@ abstract class Entity extends Model implements Sluggable, Favouritable, Viewable ->exists(); } + /** + * Get the related watches for this entity. + */ + public function watches(): MorphMany + { + return $this->morphMany(Watch::class, 'watchable'); + } + /** * {@inheritdoc} */