X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/e6ea53b3e68932deb2a38359af8cbc34d10735b0..refs/pull/3032/head:/app/Auth/User.php diff --git a/app/Auth/User.php b/app/Auth/User.php index fdfd9e616..0a6849fe0 100644 --- a/app/Auth/User.php +++ b/app/Auth/User.php @@ -1,53 +1,71 @@ - 'datetime']; + /** * The attributes excluded from the model's JSON form. + * * @var array */ protected $hidden = [ @@ -57,48 +75,51 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon /** * This holds the user's permissions when loaded. + * * @var ?Collection */ protected $permissions; /** * This holds the default user when loaded. + * * @var null|User */ protected static $defaultUser = null; /** * Returns the default public user. - * @return User */ - public static function getDefault() + public static function getDefault(): User { if (!is_null(static::$defaultUser)) { return static::$defaultUser; } - - static::$defaultUser = static::where('system_name', '=', 'public')->first(); + + static::$defaultUser = static::query()->where('system_name', '=', 'public')->first(); + return static::$defaultUser; } /** * Check if the user is the default public user. - * @return bool */ - public function isDefault() + public function isDefault(): bool { return $this->system_name === 'public'; } /** * The roles that belong to the user. + * * @return BelongsToMany */ public function roles() { if ($this->id === 0) { - return ; + return; } + return $this->belongsToMany(Role::class); } @@ -112,12 +133,10 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon /** * Check if the user has a role. - * @param $role - * @return mixed */ - public function hasSystemRole($role) + public function hasSystemRole(string $roleSystemName): bool { - return $this->roles->pluck('system_name')->contains($role); + return $this->roles->pluck('system_name')->contains($roleSystemName); } /** @@ -181,9 +200,8 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon /** * Get the social account associated with this user. - * @return \Illuminate\Database\Eloquent\Relations\HasMany */ - public function socialAccounts() + public function socialAccounts(): HasMany { return $this->hasMany(SocialAccount::class); } @@ -191,7 +209,9 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon /** * Check if the user has a social account, * If a driver is passed it checks for that single account type. + * * @param bool|string $socialDriver + * * @return bool */ public function hasSocialAccount($socialDriver = false) @@ -204,11 +224,9 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon } /** - * Returns the user's avatar, - * @param int $size - * @return string + * Returns a URL to the user's avatar. */ - public function getAvatar($size = 50) + public function getAvatar(int $size = 50): string { $default = url('/http/source.bookstackapp.com/user_avatar.png'); $imageId = $this->image_id; @@ -218,17 +236,17 @@ 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; } /** * Get the avatar for the user. - * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ - public function avatar() + public function avatar(): BelongsTo { return $this->belongsTo(Image::class, 'image_id'); } @@ -242,11 +260,32 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon } /** - * Get the latest activity instance for this user. + * Get the favourite instances for this user. + */ + public function favourites(): HasMany + { + return $this->hasMany(Favourite::class); + } + + /** + * Get the MFA values belonging to this use. */ - public function latestActivity(): HasOne + public function mfaValues(): HasMany { - return $this->hasOne(Activity::class)->latest(); + return $this->hasMany(MfaValue::class); + } + + /** + * Get the last activity time for this user. + */ + public function scopeWithLastActivityAt(Builder $query) + { + $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'); } /** @@ -255,6 +294,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon public function getEditUrl(string $path = ''): string { $uri = '/settings/users/' . $this->id . '/' . trim($path, '/'); + return url(rtrim($uri, '/')); } @@ -263,15 +303,13 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon */ public function getProfileUrl(): string { - return url('/http/source.bookstackapp.com/user/' . $this->id); + return url('/http/source.bookstackapp.com/user/' . $this->slug); } /** * Get a shortened version of the user's name. - * @param int $chars - * @return string */ - public function getShortName($chars = 8) + public function getShortName(int $chars = 8): string { if (mb_strlen($this->name) <= $chars) { return $this->name; @@ -287,7 +325,9 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon /** * Send the password reset notification. - * @param string $token + * + * @param string $token + * * @return void */ public function sendPasswordResetNotification($token) @@ -302,4 +342,14 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon { return "({$this->id}) {$this->name}"; } + + /** + * @inheritDoc + */ + public function refreshSlug(): string + { + $this->slug = app(SlugGenerator::class)->generate($this); + + return $this->slug; + } }