X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/b2223f16183933ff6a034392044d43b44864e169..refs/pull/139/head:/app/User.php diff --git a/app/User.php b/app/User.php index 2e37fe484..74aec7e3a 100644 --- a/app/User.php +++ b/app/User.php @@ -1,9 +1,6 @@ - 'guest', + 'name' => 'Guest' + ]); + } + + /** + * The roles that belong to the user. + */ + public function roles() + { + return $this->belongsToMany(Role::class); + } + + /** + * Check if the user has a role. + * @param $role + * @return mixed + */ + public function hasRole($role) + { + return $this->roles->pluck('name')->contains($role); + } + + /** + * Get all permissions belonging to a the current user. + * @param bool $cache + * @return \Illuminate\Database\Eloquent\Relations\HasManyThrough + */ + public function permissions($cache = true) + { + if(isset($this->permissions) && $cache) return $this->permissions; + $this->load('roles.permissions'); + $permissions = $this->roles->map(function($role) { + return $role->permissions; + })->flatten()->unique(); + $this->permissions = $permissions; + return $permissions; + } + + /** + * Check if the user has a particular permission. + * @param $permissionName + * @return bool + */ + public function can($permissionName) + { + if ($this->email === 'guest') return false; + return $this->permissions()->pluck('name')->contains($permissionName); + } + + /** + * Attach a role to this user. + * @param Role $role + */ + public function attachRole(Role $role) + { + $this->attachRoleId($role->id); + } + + /** + * Attach a role id to this user. + * @param $id + */ + public function attachRoleId($id) + { + $this->roles()->attach($id); + } + + /** + * Get the social account associated with this user. + * @return \Illuminate\Database\Eloquent\Relations\HasMany + */ + public function socialAccounts() + { + return $this->hasMany(SocialAccount::class); + } + + /** + * 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) + { + if ($socialDriver === false) { + return $this->socialAccounts()->count() > 0; + } + + return $this->socialAccounts()->where('driver', '=', $socialDriver)->exists(); + } + + /** + * Returns the user's avatar, + * @param int $size + * @return string + */ + public function getAvatar($size = 50) + { + if ($this->image_id === 0 || $this->image_id === '0' || $this->image_id === null) return '/user_avatar.png'; + return $this->avatar->getThumb($size, $size, false); + } + + /** + * Get the avatar for the user. + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function avatar() + { + return $this->belongsTo(Image::class, 'image_id'); + } + + /** + * Get the url for editing this user. + * @return string + */ + public function getEditUrl() + { + return '/settings/users/' . $this->id; + } + + /** + * Get a shortened version of the user's name. + * @param int $chars + * @return string + */ + public function getShortName($chars = 8) + { + if (strlen($this->name) <= $chars) return $this->name; + + $splitName = explode(' ', $this->name); + if (strlen($splitName[0]) <= $chars) return $splitName[0]; + + return ''; + } }