diff --git a/app/Activity.php b/app/Activity.php index ac7c1d749..1fd00abea 100644 --- a/app/Activity.php +++ b/app/Activity.php @@ -2,8 +2,6 @@ namespace BookStack; -use Illuminate\Database\Eloquent\Model; - /** * @property string key * @property \User user diff --git a/app/EmailConfirmation.php b/app/EmailConfirmation.php index 46912e733..974cf201c 100644 --- a/app/EmailConfirmation.php +++ b/app/EmailConfirmation.php @@ -2,8 +2,6 @@ namespace BookStack; -use Illuminate\Database\Eloquent\Model; - class EmailConfirmation extends Model { protected $fillable = ['user_id', 'token']; diff --git a/app/Entity.php b/app/Entity.php index c084a2870..eb14780fe 100644 --- a/app/Entity.php +++ b/app/Entity.php @@ -82,8 +82,7 @@ abstract class Entity extends Ownable */ public function hasActiveRestriction($role_id, $action) { - return $this->restricted && $this->restrictions() - ->where('role_id', '=', $role_id)->where('action', '=', $action)->count() > 0; + return $this->getRawAttribute('restricted') && $this->hasRestriction($role_id, $action); } /** diff --git a/app/EntityPermission.php b/app/EntityPermission.php index 6b4ddd212..266930d2c 100644 --- a/app/EntityPermission.php +++ b/app/EntityPermission.php @@ -1,8 +1,4 @@ -<?php - -namespace BookStack; - -use Illuminate\Database\Eloquent\Model; +<?php namespace BookStack; class EntityPermission extends Model { diff --git a/app/Model.php b/app/Model.php new file mode 100644 index 000000000..9ec2b7362 --- /dev/null +++ b/app/Model.php @@ -0,0 +1,19 @@ +<?php namespace BookStack; + +use Illuminate\Database\Eloquent\Model as EloquentModel; + +class Model extends EloquentModel +{ + + /** + * Provides public access to get the raw attribute value from the model. + * Used in areas where no mutations are required but performance is critical. + * @param $key + * @return mixed + */ + public function getRawAttribute($key) + { + return parent::getAttributeFromArray($key); + } + +} \ No newline at end of file diff --git a/app/Ownable.php b/app/Ownable.php index 28d55c2bb..8890c01bf 100644 --- a/app/Ownable.php +++ b/app/Ownable.php @@ -1,6 +1,5 @@ <?php namespace BookStack; -use Illuminate\Database\Eloquent\Model; abstract class Ownable extends Model { diff --git a/app/Page.php b/app/Page.php index d2a303f61..3dc3b0256 100644 --- a/app/Page.php +++ b/app/Page.php @@ -1,8 +1,5 @@ -<?php +<?php namespace BookStack; -namespace BookStack; - -use Illuminate\Database\Eloquent\Model; class Page extends Entity { diff --git a/app/PageRevision.php b/app/PageRevision.php index c258913ff..49e53400e 100644 --- a/app/PageRevision.php +++ b/app/PageRevision.php @@ -1,6 +1,5 @@ <?php namespace BookStack; -use Illuminate\Database\Eloquent\Model; class PageRevision extends Model { diff --git a/app/Permission.php b/app/Permission.php index e3f391562..0ce326e06 100644 --- a/app/Permission.php +++ b/app/Permission.php @@ -1,6 +1,5 @@ <?php namespace BookStack; -use Illuminate\Database\Eloquent\Model; class Permission extends Model { diff --git a/app/Restriction.php b/app/Restriction.php index 58d117997..c9dd705d5 100644 --- a/app/Restriction.php +++ b/app/Restriction.php @@ -1,8 +1,5 @@ -<?php +<?php namespace BookStack; -namespace BookStack; - -use Illuminate\Database\Eloquent\Model; class Restriction extends Model { diff --git a/app/Role.php b/app/Role.php index 45d160cfe..3b930d113 100644 --- a/app/Role.php +++ b/app/Role.php @@ -1,8 +1,5 @@ -<?php +<?php namespace BookStack; -namespace BookStack; - -use Illuminate\Database\Eloquent\Model; class Role extends Model { @@ -36,11 +33,16 @@ class Role extends Model /** * Check if this role has a permission. - * @param $permission + * @param $permissionName + * @return bool */ - public function hasPermission($permission) + public function hasPermission($permissionName) { - return $this->permissions->pluck('name')->contains($permission); + $permissions = $this->getRelationValue('permissions'); + foreach ($permissions as $permission) { + if ($permission->getRawAttribute('name') === $permissionName) return true; + } + return false; } /** diff --git a/app/Services/RestrictionService.php b/app/Services/RestrictionService.php index d3394fcd7..40287bf77 100644 --- a/app/Services/RestrictionService.php +++ b/app/Services/RestrictionService.php @@ -54,21 +54,21 @@ class RestrictionService $this->entityPermission->truncate(); // Get all roles (Should be the most limited dimension) - $roles = $this->role->load('permissions')->all(); + $roles = $this->role->with('permissions')->get(); // Chunk through all books - $this->book->chunk(500, function ($books) use ($roles) { + $this->book->with('restrictions')->chunk(500, function ($books) use ($roles) { $this->createManyEntityPermissions($books, $roles); }); // Chunk through all chapters - $this->chapter->with('book')->chunk(500, function ($books) use ($roles) { - $this->createManyEntityPermissions($books, $roles); + $this->chapter->with('book', 'restrictions')->chunk(500, function ($chapters) use ($roles) { + $this->createManyEntityPermissions($chapters, $roles); }); // Chunk through all pages - $this->page->with('book', 'chapter')->chunk(500, function ($books) use ($roles) { - $this->createManyEntityPermissions($books, $roles); + $this->page->with('book', 'chapter', 'restrictions')->chunk(500, function ($pages) use ($roles) { + $this->createManyEntityPermissions($pages, $roles); }); } @@ -78,7 +78,7 @@ class RestrictionService */ public function buildEntityPermissionsForEntity(Entity $entity) { - $roles = $this->role->load('permissions')->all(); + $roles = $this->role->with('permissions')->get(); $entities = collect([$entity]); if ($entity->isA('book')) { @@ -103,17 +103,17 @@ class RestrictionService $this->deleteManyEntityPermissionsForRoles($roles); // Chunk through all books - $this->book->chunk(500, function ($books) use ($roles) { + $this->book->with('restrictions')->chunk(500, function ($books) use ($roles) { $this->createManyEntityPermissions($books, $roles); }); // Chunk through all chapters - $this->chapter->with('book')->chunk(500, function ($books) use ($roles) { + $this->chapter->with('book', 'restrictions')->chunk(500, function ($books) use ($roles) { $this->createManyEntityPermissions($books, $roles); }); // Chunk through all pages - $this->page->with('book', 'chapter')->chunk(500, function ($books) use ($roles) { + $this->page->with('book', 'chapter', 'restrictions')->chunk(500, function ($books) use ($roles) { $this->createManyEntityPermissions($books, $roles); }); } @@ -272,13 +272,13 @@ class RestrictionService { $entityClass = get_class($entity); return [ - 'role_id' => $role->id, - 'entity_id' => $entity->id, + 'role_id' => $role->getRawAttribute('id'), + 'entity_id' => $entity->getRawAttribute('id'), 'entity_type' => $entityClass, 'action' => $action, 'has_permission' => $permissionAll, 'has_permission_own' => $permissionOwn, - 'created_by' => $entity->created_by + 'created_by' => $entity->getRawAttribute('created_by') ]; } diff --git a/app/Setting.php b/app/Setting.php index 05bd2c226..0af3652db 100644 --- a/app/Setting.php +++ b/app/Setting.php @@ -1,8 +1,4 @@ -<?php - -namespace BookStack; - -use Illuminate\Database\Eloquent\Model; +<?php namespace BookStack; class Setting extends Model { diff --git a/app/SocialAccount.php b/app/SocialAccount.php index 2d63b5198..127b1e229 100644 --- a/app/SocialAccount.php +++ b/app/SocialAccount.php @@ -1,8 +1,5 @@ -<?php +<?php namespace BookStack; -namespace BookStack; - -use Illuminate\Database\Eloquent\Model; class SocialAccount extends Model { diff --git a/app/User.php b/app/User.php index a16eab972..1ba5b90f3 100644 --- a/app/User.php +++ b/app/User.php @@ -1,9 +1,6 @@ -<?php - -namespace BookStack; +<?php namespace BookStack; use Illuminate\Auth\Authenticatable; -use Illuminate\Database\Eloquent\Model; use Illuminate\Auth\Passwords\CanResetPassword; use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; diff --git a/app/View.php b/app/View.php index 50dd06012..c02550c7c 100644 --- a/app/View.php +++ b/app/View.php @@ -1,8 +1,4 @@ -<?php - -namespace BookStack; - -use Illuminate\Database\Eloquent\Model; +<?php namespace BookStack; class View extends Model {