*/ use HasApiTokens, HasFactory, Notifiable; protected $fillable = ['public_id', 'name', 'email', 'avatar_url', 'password']; protected $hidden = ['password', 'remember_token']; protected function casts(): array { return ['email_verified_at' => 'datetime', 'password' => 'hashed']; } public function canAccessAccount(int $accountId): bool { return $accountId === $this->id; } /** @return Collection */ public function accessibleAccounts(): Collection { return collect([$this]); } public function linkWallet(): HasOne { return $this->hasOne(LinkWallet::class); } public function shortLinks(): HasMany { return $this->hasMany(ShortLink::class); } public function linkCustomDomains(): HasMany { return $this->hasMany(LinkCustomDomain::class); } public function defaultLinkDomain(): ?LinkCustomDomain { return $this->linkCustomDomains() ->where('is_default', true) ->where('status', LinkCustomDomain::STATUS_ACTIVE) ->where('ssl_status', LinkCustomDomain::STATUS_ACTIVE) ->first(); } public function publicLinkBaseUrl(): string { return $this->defaultLinkDomain()?->baseUrl() ?? ShortLink::publicBaseUrl(); } public function getOrCreateLinkWallet(): LinkWallet { return $this->linkWallet()->firstOrCreate( [], ['links_total' => 0, 'clicks_total' => 0, 'status' => LinkWallet::STATUS_ACTIVE], ); } public function avatarUrl(): ?string { $url = trim((string) $this->avatar_url); return $url !== '' ? $url : null; } }