*/ use HasFactory; use HashableId; use HasProfilePhoto; use HasRoles; use Notifiable; // use TwoFactorAuthenticatable; public array $info = []; protected $guarded = ['id']; /** * The attributes that should be hidden for serialization. * * @var array */ protected $hidden = [ 'password', 'remember_token', 'two_factor_recovery_codes', 'two_factor_secret', ]; /** * The accessors to append to the model's array form. * * @var array */ protected $appends = [ 'profile_photo_url', 'last_seen', ]; public function isAdmin(): bool { return cache()->remember('user.is_admin:' . $this->id, 5 * 60, fn () => $this->hasRole(Role::Admin) ); } public function isRadiologist(): bool { return cache()->remember('user.is_rad:' . $this->id, 5 * 60, fn () => $this->hasRole(Role::Radiologist) ); } public function isTech(): bool { return cache()->remember('user.is_tech:' . $this->id, 5 * 60, fn () => $this->hasRole(Role::Technician) ); } public function primaryRole(): string { return cache()->remember('user.pri_role:' . $this->id, 5 * 60, fn () => Str::title($this->roles()->first()->name) ); } public function may(Permission|iterable|string $perm): bool { return $this->isAdmin() || $this->hasAnyPermission($perm); // return $this->isAdmin() || $this->can($perm); } public function lastSeen(): Carbon { return UserService::getLastSeen($this->id) ?? $this->created_at; } public function getLastSeenAttribute(): Carbon { return $this->lastSeen(); } public function getNameAttribute(): string { return trim($this->first_name . ' ' . $this->last_name); } public function avatar(bool $gravatar = false): string { if (filled($this->profile_photo_path)) { return Storage::url($this->profile_photo_path); } if ($gravatar && filled($this->email)) { return (new Avatar)->create($this->email)->toGravatar(); } return (new Avatar)->create($this->name)->toBase64(); } public function assignedStudies(): BelongsToMany { return $this->belongsToMany(Study::class, 'study_assignments'); } public function radiologistProfile(): HasOne { return $this->hasOne(RadiologistProfile::class); } public function canAccessPanel(Panel $panel): bool { return $this->isAdmin() && $this->is_active; } public function panels(): HasManyThrough { return $this->hasManyThrough(AssignmentPanel::class, AssignmentPanelRadiologist::class); } public function bookmarkedStudies(): BelongsToMany { return $this->belongsToMany(Study::class, 'study_bookmarks'); } /** * Get the attributes that should be cast. * * @return array */ protected function casts(): array { return [ 'is_active' => 'bool', 'email_verified_at' => 'datetime', 'last_seen_at' => 'datetime', 'password' => 'hashed', ]; } }