Files
famous-ly4-ev/app-modules/catalog/src/Models/EvCompany.php
T
Nyan Lin Paing 4f0f20659d
PHP Tests / php-tests (push) Has been cancelled
Return EvCompany logo as a full URL in the API resource
EvCompanyResource returned the raw disk-relative path stored by
Filament's FileUpload (e.g. "logos/xxx.png"), not something API
consumers can render directly.

- EvCompany::logoUrl() builds an absolute URL from the configured
  filesystem disk, guarding against a disk (e.g. s3) that already
  returns an absolute URL so it isn't double-prefixed.
- EvCompanyResource now exposes that as 'logo' instead of the raw path.
2026-08-23 23:59:13 +07:00

100 lines
2.6 KiB
PHP

<?php
namespace Modules\Catalog\Models;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Modules\Catalog\Database\Factories\EvCompanyFactory;
use Spatie\Activitylog\Models\Concerns\LogsActivity;
use Spatie\Activitylog\Support\LogOptions;
class EvCompany extends Model
{
/** @use HasFactory<EvCompanyFactory> */
use HasFactory, LogsActivity;
/**
* Full CRUD audit trail — catalog admin writes are staff-only and
* infrequent, so logging every attribute change is affordable
* (domain.md §6; T6.2).
*/
public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults()
->logFillable()
->logOnlyDirty()
->dontLogEmptyChanges()
->useLogName('catalog');
}
/**
* @var list<string>
*/
protected $fillable = [
'name',
'mm_name',
'slug',
'description',
'mm_description',
'contact',
'address',
'logo',
'is_active',
];
protected static function booted(): void
{
static::creating(function (self $evCompany): void {
if (filled($evCompany->slug)) {
return;
}
$slug = Str::slug($evCompany->name);
$uniqueSlug = $slug;
$suffix = 1;
while (static::where('slug', $uniqueSlug)->exists()) {
$uniqueSlug = "{$slug}-{$suffix}";
$suffix++;
}
$evCompany->slug = $uniqueSlug;
});
}
/**
* @return array<string, string>
*/
protected function casts(): array
{
return [
'is_active' => 'boolean',
];
}
/**
* `logo` is stored as the disk-relative path Filament's FileUpload
* writes (e.g. "logos/xxx.png"), not a URL — API consumers need a full
* absolute URL to render it directly. Guards against the disk itself
* already returning an absolute URL (e.g. an s3 disk), so this stays
* correct if the storage disk ever changes from local.
*/
public function logoUrl(): Attribute
{
return Attribute::make(
get: function (): ?string {
if (blank($this->logo)) {
return null;
}
$url = Storage::disk(config('filesystems.default'))->url($this->logo);
return str($url)->startsWith(['http://', 'https://']) ? $url : url($url);
},
);
}
}