Return EvCompany logo as a full URL in the API resource
PHP Tests / php-tests (push) Has been cancelled
PHP Tests / php-tests (push) Has been cancelled
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.
This commit is contained in:
@@ -23,7 +23,7 @@ class EvCompanyResource extends JsonResource
|
|||||||
'mm_description' => $this->mm_description,
|
'mm_description' => $this->mm_description,
|
||||||
'contact' => $this->contact,
|
'contact' => $this->contact,
|
||||||
'address' => $this->address,
|
'address' => $this->address,
|
||||||
'logo' => $this->logo,
|
'logo' => $this->logo_url,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,10 @@
|
|||||||
|
|
||||||
namespace Modules\Catalog\Models;
|
namespace Modules\Catalog\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
use Modules\Catalog\Database\Factories\EvCompanyFactory;
|
use Modules\Catalog\Database\Factories\EvCompanyFactory;
|
||||||
use Spatie\Activitylog\Models\Concerns\LogsActivity;
|
use Spatie\Activitylog\Models\Concerns\LogsActivity;
|
||||||
@@ -72,4 +74,26 @@ class EvCompany extends Model
|
|||||||
'is_active' => 'boolean',
|
'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);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
use Modules\Catalog\Models\Destination;
|
use Modules\Catalog\Models\Destination;
|
||||||
use Modules\Catalog\Models\EvCompany;
|
use Modules\Catalog\Models\EvCompany;
|
||||||
|
|
||||||
@@ -19,6 +20,24 @@ test('lists active ev companies', function () {
|
|||||||
->assertJsonFragment(['id' => $active->id]);
|
->assertJsonFragment(['id' => $active->id]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('returns the company logo as a full absolute url', function () {
|
||||||
|
$company = EvCompany::factory()->create(['is_active' => true, 'logo' => 'logos/example.png']);
|
||||||
|
|
||||||
|
$this->withHeader('Authorization', "Bearer {$this->token}")
|
||||||
|
->getJson('/api/v1/companies')
|
||||||
|
->assertSuccessful()
|
||||||
|
->assertJsonFragment(['logo' => url(Storage::disk(config('filesystems.default'))->url($company->logo))]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('returns a null logo when the company has none', function () {
|
||||||
|
EvCompany::factory()->create(['is_active' => true, 'logo' => null]);
|
||||||
|
|
||||||
|
$this->withHeader('Authorization', "Bearer {$this->token}")
|
||||||
|
->getJson('/api/v1/companies')
|
||||||
|
->assertSuccessful()
|
||||||
|
->assertJsonFragment(['logo' => null]);
|
||||||
|
});
|
||||||
|
|
||||||
test('lists active destinations', function () {
|
test('lists active destinations', function () {
|
||||||
$active = Destination::factory()->create(['is_active' => true]);
|
$active = Destination::factory()->create(['is_active' => true]);
|
||||||
Destination::factory()->create(['is_active' => false]);
|
Destination::factory()->create(['is_active' => false]);
|
||||||
|
|||||||
Reference in New Issue
Block a user