namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; class Admin extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; protected $fillable = [ 'username', 'email', 'password', 'first_name', 'last_name', 'phone', 'role_id', 'status', 'is_super_admin', 'last_login_at', 'last_login_ip', 'ip_whitelist', ]; protected $hidden = [ 'password', 'remember_token', ]; protected $casts = [ 'email_verified_at' => 'datetime', 'last_login_at' => 'datetime', 'is_super_admin' => 'boolean', 'ip_whitelist' => 'array', ]; protected $appends = [ 'full_name', 'avatar', 'role_name', ]; // Relationships public function role() { return $this->belongsTo(Role::class); } public function permissions() { return $this->belongsToMany(Permission::class, 'admin_permissions'); } public function loginLogs() { return $this->hasMany(AdminLoginLog::class); } public function activityLogs() { return $this->morphMany(ActivityLog::class, 'causer'); } // Accessors public function getFullNameAttribute() { return trim($this->first_name . ' ' . $this->last_name) ?: $this->username; } public function getAvatarAttribute() { return 'https://www.gravatar.com/avatar/' . md5(strtolower(trim($this->email))) . '?s=200&d=mp'; } public function getRoleNameAttribute() { return $this->role ? $this->role->name : ($this->is_super_admin ? 'Super Admin' : 'No Role'); } // Methods public function isActive() { return $this->status === 'active'; } public function isSuperAdmin() { return $this->is_super_admin; } public function hasPermission($permission) { if ($this->is_super_admin) { return true; } return $this->role && $this->role->permissions() ->where('slug', $permission) ->exists(); } public function hasAnyPermission($permissions) { if ($this->is_super_admin) { return true; } foreach ($permissions as $permission) { if ($this->hasPermission($permission)) { return true; } } return false; } public function hasAllPermissions($permissions) { if ($this->is_super_admin) { return true; } foreach ($permissions as $permission) { if (!$this->hasPermission($permission)) { return false; } } return true; } public function isIpAllowed($ip) { if (empty($this->ip_whitelist)) { return true; } return in_array($ip, $this->ip_whitelist); } public function updateLastLogin($ip) { $this->update([ 'last_login_at' => now(), 'last_login_ip' => $ip, ]); } public function logActivity($description, $properties = [], $subject = null) { return ActivityLog::create([ 'log_name' => 'admin', 'description' => $description, 'subject_type' => $subject ? get_class($subject) : null, 'subject_id' => $subject ? $subject->id : null, 'causer_type' => self::class, 'causer_id' => $this->id, 'properties' => $properties, 'ip_address' => request()->ip(), 'user_agent' => request()->userAgent(), ]); } }