Deploy Ladill Link / deploy (push) Successful in 1m26s
Let accounts organise links by promo or launch, attach or detach links, and view combined click totals from the sidebar.
91 lines
2.3 KiB
PHP
91 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Database\Factories\UserFactory;
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
use Illuminate\Database\Eloquent\Relations\HasOne;
|
|
use Illuminate\Foundation\Auth\User as Authenticatable;
|
|
use Illuminate\Notifications\Notifiable;
|
|
use Illuminate\Support\Collection;
|
|
use Laravel\Sanctum\HasApiTokens;
|
|
|
|
/**
|
|
* Thin local mirror of the platform identity (auth.ladill.com owns users).
|
|
*/
|
|
class User extends Authenticatable
|
|
{
|
|
/** @use HasFactory<UserFactory> */
|
|
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<int, User> */
|
|
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 campaigns(): HasMany
|
|
{
|
|
return $this->hasMany(Campaign::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;
|
|
}
|
|
}
|