'boolean', 'is_active' => 'boolean', 'clicks_total' => 'integer', 'unique_clicks_total' => 'integer', 'last_clicked_at' => 'datetime', 'expires_at' => 'datetime', ]; public function user(): BelongsTo { return $this->belongsTo(User::class); } public function clicks(): HasMany { return $this->hasMany(LinkClick::class); } public function publicUrl(?User $owner = null): string { $owner ??= $this->user; $base = $owner ? $owner->publicLinkBaseUrl() : self::publicBaseUrl(); return rtrim($base, '/').'/'.$this->slug; } public static function publicBaseUrl(): string { $domain = (string) config('link.public_domain', 'ladl.link'); return 'https://'.$domain; } public function isExpired(): bool { return $this->expires_at !== null && $this->expires_at->isPast(); } public function sourceAppLabel(): string { return match ($this->source_app) { 'link' => 'Ladill Link', 'qrplus' => 'QR Plus', 'merchant' => 'Merchant', 'events' => 'Events', 'mini' => 'Mini', 'give' => 'Give', 'transfer' => 'Transfer', 'platform' => 'Ladill', default => ucfirst((string) $this->source_app), }; } }