<?php declare(strict_types=1); namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use App\Enums\Lang; use App\Enums\SystemRole; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; final class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable, SoftDeletes; /** * The model's default values for attributes. * * @var array */ protected $attributes = [ 'is_active' => true, ]; /** * The attributes that are mass assignable. * * @var array<int, string> */ protected $fillable = [ 'name', 'email', 'password', 'timezone', 'is_active', 'lang', ]; /** * The attributes that should be hidden for serialization. * * @var array<int, string> */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast. * * @var array<string, string> */ protected $casts = [ 'email_verified_at' => 'datetime', 'is_active' => 'boolean', 'lang' => Lang::class, ]; /** * Return the user's roles */ public function roles(): belongsToMany { return $this->belongsToMany(Role::class); } public function hasRole(string $role): bool { return $this->roles->where('code', $role)->isNotEmpty(); } public function hasPermission(string $permission): bool { return $this->permissions->search($permission) !== false; } protected function isAdmin(): Attribute { return Attribute::make( get: fn () => $this->hasRole(SystemRole::Admin->value), )->shouldCache(); } protected function permissions(): Attribute { return Attribute::make( get: function () { $roles = $this->roles->modelKeys(); return RolePermission::whereIn('role_id', $roles)->select('permission')->pluck('permission'); }, )->shouldCache(); } }