EncryptedField::class, 'otp_secret' => EncryptedField::class, 'is_favorite' => 'boolean', 'password_updated_at' => 'datetime', 'rotation_due_at' => 'datetime', ]; } public function organization() { return $this->belongsTo(Organization::class); } public function resource() { return $this->morphTo(); } public function creator() { return $this->belongsTo(User::class, 'created_by'); } public function auditLogs() { return $this->hasMany(PasswordAuditLog::class); } public function logAction(string $action): void { $this->auditLogs()->create([ 'user_id' => auth()->id(), 'action' => $action, 'ip_address' => request()->ip(), 'user_agent' => (string) request()->userAgent(), ]); } public function relatedItems() { return RelatedItem::forItem($this); } public function linkableKind(): string { return 'Password'; } public function linkableLabel(): string { return $this->name; } public function linkableUrl(): string { return route('organizations.passwords.edit', [$this->organization_id, $this]); } }