X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/c7a2d568bf693add30c8402d68d1f46f09a44c5b..refs/pull/2487/head:/app/Auth/User.php diff --git a/app/Auth/User.php b/app/Auth/User.php index 32179a1fb..9d7eaa72e 100644 --- a/app/Auth/User.php +++ b/app/Auth/User.php @@ -1,20 +1,22 @@ 'datetime']; + /** * The attributes excluded from the model's JSON form. * @var array @@ -56,7 +60,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon /** * This holds the user's permissions when loaded. - * @var array + * @var ?Collection */ protected $permissions; @@ -130,35 +134,44 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon } } + /** + * Check if the user has a particular permission. + */ + public function can(string $permissionName): bool + { + if ($this->email === 'guest') { + return false; + } + + return $this->permissions()->contains($permissionName); + } + /** * Get all permissions belonging to a the current user. - * @param bool $cache - * @return \Illuminate\Database\Eloquent\Relations\HasManyThrough */ - public function permissions($cache = true) + protected function permissions(): Collection { - if (isset($this->permissions) && $cache) { + if (isset($this->permissions)) { return $this->permissions; } - $this->load('roles.permissions'); - $permissions = $this->roles->map(function ($role) { - return $role->permissions; - })->flatten()->unique(); - $this->permissions = $permissions; - return $permissions; + + $this->permissions = $this->newQuery()->getConnection()->table('role_user', 'ru') + ->select('role_permissions.name as name')->distinct() + ->leftJoin('permission_role', 'ru.role_id', '=', 'permission_role.role_id') + ->leftJoin('role_permissions', 'permission_role.permission_id', '=', 'role_permissions.id') + ->where('ru.user_id', '=', $this->id) + ->get() + ->pluck('name'); + + return $this->permissions; } /** - * Check if the user has a particular permission. - * @param $permissionName - * @return bool + * Clear any cached permissions on this instance. */ - public function can($permissionName) + public function clearPermissionCache() { - if ($this->email === 'guest') { - return false; - } - return $this->permissions()->pluck('name')->contains($permissionName); + $this->permissions = null; } /** @@ -171,7 +184,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon /** * Get the social account associated with this user. - * @return \Illuminate\Database\Eloquent\Relations\HasMany + * @return HasMany */ public function socialAccounts() { @@ -208,7 +221,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon try { $avatar = $this->avatar ? url($this->avatar->getThumb($size, $size, false)) : $default; - } catch (\Exception $err) { + } catch (Exception $err) { $avatar = $default; } return $avatar; @@ -216,7 +229,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon /** * Get the avatar for the user. - * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + * @return BelongsTo */ public function avatar() { @@ -232,11 +245,16 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon } /** - * Get the latest activity instance for this user. + * Get the last activity time for this user. */ - public function latestActivity(): HasOne + public function scopeWithLastActivityAt(Builder $query) { - return $this->hasOne(Activity::class)->latest(); + $query->addSelect(['activities.created_at as last_activity_at']) + ->leftJoinSub(function (\Illuminate\Database\Query\Builder $query) { + $query->from('activities')->select('user_id') + ->selectRaw('max(created_at) as created_at') + ->groupBy('user_id'); + }, 'activities', 'users.id', '=', 'activities.user_id'); } /**