X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/3847a761347f708253e2f5c79b43bfc03d019aba..refs/pull/5280/head:/app/Users/Models/User.php diff --git a/app/Users/Models/User.php b/app/Users/Models/User.php index a2b54f708..3797e7cb0 100644 --- a/app/Users/Models/User.php +++ b/app/Users/Models/User.php @@ -3,15 +3,17 @@ namespace BookStack\Users\Models; use BookStack\Access\Mfa\MfaValue; +use BookStack\Access\Notifications\ResetPasswordNotification; use BookStack\Access\SocialAccount; use BookStack\Activity\Models\Favourite; use BookStack\Activity\Models\Loggable; +use BookStack\Activity\Models\Watch; use BookStack\Api\ApiToken; use BookStack\App\Model; use BookStack\App\Sluggable; use BookStack\Entities\Tools\SlugGenerator; -use BookStack\Notifications\ResetPassword; -use BookStack\Translation\LanguageManager; +use BookStack\Translation\LocaleDefinition; +use BookStack\Translation\LocaleManager; use BookStack\Uploads\Image; use Carbon\Carbon; use Exception; @@ -87,36 +89,29 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon */ protected string $avatarUrl = ''; - /** - * This holds the default user when loaded. - */ - protected static ?User $defaultUser = null; - /** * Returns the default public user. + * Fetches from the container as a singleton to effectively cache at an app level. */ - public static function getDefault(): self + public static function getGuest(): self { - if (!is_null(static::$defaultUser)) { - return static::$defaultUser; - } - - static::$defaultUser = static::query()->where('system_name', '=', 'public')->first(); - - return static::$defaultUser; + return app()->make('users.default'); } - public static function clearDefault(): void + /** + * Check if the user is the default public user. + */ + public function isGuest(): bool { - static::$defaultUser = null; + return $this->system_name === 'public'; } /** - * Check if the user is the default public user. + * Check if the user has general access to the application. */ - public function isDefault(): bool + public function hasAppAccess(): bool { - return $this->system_name === 'public'; + return !$this->isGuest() || setting('app-public'); } /** @@ -165,10 +160,6 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon */ public function can(string $permissionName): bool { - if ($this->email === 'guest') { - return false; - } - return $this->permissions()->contains($permissionName); } @@ -249,7 +240,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon } try { - $avatar = $this->avatar ? url($this->avatar->getThumb($size, $size, false)) : $default; + $avatar = $this->avatar?->getThumb($size, $size, false) ?? $default; } catch (Exception $err) { $avatar = $default; } @@ -291,6 +282,14 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon return $this->hasMany(MfaValue::class); } + /** + * Get the tracked entity watches for this user. + */ + public function watches(): HasMany + { + return $this->hasMany(Watch::class); + } + /** * Get the last activity time for this user. */ @@ -336,15 +335,15 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon return $splitName[0]; } - return ''; + return mb_substr($this->name, 0, max($chars - 2, 0)) . '…'; } /** - * Get the system language for this user. + * Get the locale for this user. */ - public function getLanguage(): string + public function getLocale(): LocaleDefinition { - return app()->make(LanguageManager::class)->getLanguageForUser($this); + return app()->make(LocaleManager::class)->getForUser($this); } /** @@ -356,7 +355,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon */ public function sendPasswordResetNotification($token) { - $this->notify(new ResetPassword($token)); + $this->notify(new ResetPasswordNotification($token)); } /** @@ -372,7 +371,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon */ public function refreshSlug(): string { - $this->slug = app(SlugGenerator::class)->generate($this); + $this->slug = app()->make(SlugGenerator::class)->generate($this); return $this->slug; }