<?php namespace Common\Workspaces; use Auth; use Common\Auth\Permissions\Permission; use Common\Auth\Roles\Role; use Common\Auth\Traits\HasAvatarAttribute; use Common\Auth\Traits\HasDisplayNameAttribute; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; class WorkspaceMember extends Model { use HasAvatarAttribute, HasDisplayNameAttribute; protected $table = 'workspace_user'; protected $guarded = ['id']; protected $appends = ['name', 'model_type']; protected $casts = ['is_owner' => 'boolean']; public function permissions() { return $this->belongsToMany( Permission::class, 'permissionables', 'permissionable_id', 'permission_id', 'role_id', ) ->where('permissionable_type', Role::MODEL_TYPE) ->select([ 'permissions.id', 'permissions.name', 'permissions.restrictions', ]); } public function workspace() { return $this->belongsTo(Workspace::class); } public function scopeCurrentUserAndOwnerOnly(Builder $builder): self { $builder->where(function (Builder $builder) { $builder ->where('workspace_user.user_id', Auth::id()) ->orWhere('workspace_user.is_owner', true); }); return $this; } public static function getModelTypeAttribute(): string { return 'member'; } public function hasPermission(string $name): bool { return $this->is_owner || !is_null($this->getPermission($name)); } public function getPermission(string $name): ?Permission { return $this->permissions->first(function (Permission $permission) use ( $name, ) { return $permission->name === $name; }); } public function getRoleNameAttribute() { return $this->is_owner ? 'Workspace Owner' : $this->attributes['role_name']; } }