feat: add media handling capabilities to multiple models and improve media conversion process

This commit is contained in:
Yoga Pangestu 2026-08-12 20:36:35 +07:00
parent a3c642e173
commit ff8dc64a27
10 changed files with 142 additions and 5 deletions

View File

@ -9,8 +9,10 @@
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Spatie\Image\Enums\Fit;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
#[Appends(['formatted_attendance_date', 'formatted_check_in_at', 'formatted_check_out_at'])]
#[Guarded(['id'])]
@ -62,4 +64,16 @@ public function payrollAdjustments(): HasMany
{
return $this->hasMany(PayrollAdjustment::class);
}
public function registerMediaCollections(): void
{
$this->addMediaCollection('checkin');
$this->addMediaCollection('checkout');
}
public function registerMediaConversions(?Media $media = null): void
{
$this->addMediaConversion('thumb')
->fit(Fit::Contain, 150, 150);
}
}

View File

@ -15,8 +15,10 @@
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\Relations\MorphTo;
use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\Image\Enums\Fit;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
#[Appends(['formatted_amount', 'formatted_balance_after', 'formatted_created_at', 'type_label'])]
#[Guarded(['id'])]
@ -119,4 +121,15 @@ public function reference(): MorphTo
{
return $this->morphTo();
}
public function registerMediaCollections(): void
{
$this->addMediaCollection('photos');
}
public function registerMediaConversions(?Media $media = null): void
{
$this->addMediaConversion('thumb')
->fit(Fit::Contain, 150, 150);
}
}

View File

@ -13,8 +13,10 @@
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\Image\Enums\Fit;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
#[Appends(['formatted_cost_per_unit', 'formatted_other_cost', 'formatted_sewing_cost', 'status_label', 'formatted_total_material_cost'])]
#[Guarded(['id'])]
@ -110,4 +112,15 @@ public function submittedBy(): BelongsTo
{
return $this->belongsTo(User::class, 'submitted_by_id');
}
public function registerMediaCollections(): void
{
$this->addMediaCollection('photos');
}
public function registerMediaConversions(?Media $media = null): void
{
$this->addMediaConversion('thumb')
->fit(Fit::Contain, 150, 150);
}
}

View File

@ -9,8 +9,10 @@
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\Image\Enums\Fit;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
#[Appends(['formatted_amount', 'formatted_created_at', 'formatted_date'])]
#[Guarded(['id'])]
@ -56,4 +58,15 @@ public function createdBy(): BelongsTo
{
return $this->belongsTo(User::class, 'created_by_id');
}
public function registerMediaCollections(): void
{
$this->addMediaCollection('photos');
}
public function registerMediaConversions(?Media $media = null): void
{
$this->addMediaConversion('thumb')
->fit(Fit::Contain, 150, 150);
}
}

View File

@ -16,8 +16,10 @@
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\Image\Enums\Fit;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
#[Appends(['channel_label', 'formatted_cogs', 'formatted_discount', 'formatted_nego_price', 'payment_type_label', 'status_label', 'formatted_subtotal', 'formatted_total_amount'])]
#[Guarded(['id'])]
@ -200,4 +202,15 @@ public function orderItems(): HasMany
{
return $this->hasMany(OrderItem::class);
}
public function registerMediaCollections(): void
{
$this->addMediaCollection('photos');
}
public function registerMediaConversions(?Media $media = null): void
{
$this->addMediaConversion('thumb')
->fit(Fit::Contain, 150, 150);
}
}

View File

@ -12,8 +12,10 @@
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\Image\Enums\Fit;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
#[Appends(['formatted_name', 'formatted_stock'])]
#[Guarded(['id'])]
@ -80,4 +82,15 @@ public function stockMutations(): HasMany
return $this->hasMany(StockMutation::class, 'stockable_id')
->where('stockable_type', self::class);
}
public function registerMediaCollections(): void
{
$this->addMediaCollection('images');
}
public function registerMediaConversions(?Media $media = null): void
{
$this->addMediaConversion('thumb')
->fit(Fit::Contain, 150, 150);
}
}

View File

@ -10,8 +10,10 @@
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\Image\Enums\Fit;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
#[Appends(['formatted_discount', 'formatted_shipping_cost', 'formatted_subtotal', 'formatted_total'])]
#[Guarded(['id'])]
@ -71,4 +73,15 @@ public function supplier(): BelongsTo
{
return $this->belongsTo(Supplier::class);
}
public function registerMediaCollections(): void
{
$this->addMediaCollection('photos');
}
public function registerMediaConversions(?Media $media = null): void
{
$this->addMediaConversion('thumb')
->fit(Fit::Contain, 150, 150);
}
}

View File

@ -13,8 +13,10 @@
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\Image\Enums\Fit;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
#[Appends(['formatted_price'])]
#[Guarded(['id'])]
@ -61,4 +63,15 @@ public function getPhotoUrlAttribute(): ?string
? app(S3PresignedService::class)->getTemporaryUrl($media->getPath())
: null;
}
public function registerMediaCollections(): void
{
$this->addMediaCollection('images');
}
public function registerMediaConversions(?Media $media = null): void
{
$this->addMediaConversion('thumb')
->fit(Fit::Contain, 150, 150);
}
}

View File

@ -13,8 +13,10 @@
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\Image\Enums\Fit;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
#[Appends(['stock_type_label', 'formatted_subtotal', 'formatted_total'])]
#[Guarded(['id'])]
@ -73,4 +75,15 @@ public function restockItems(): HasMany
{
return $this->hasMany(RestockItem::class);
}
public function registerMediaCollections(): void
{
$this->addMediaCollection('photos');
}
public function registerMediaConversions(?Media $media = null): void
{
$this->addMediaConversion('thumb')
->fit(Fit::Contain, 150, 150);
}
}

View File

@ -2,11 +2,13 @@
namespace App\Services\Concerns;
use App\Services\S3PresignedService;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Bus;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Spatie\MediaLibrary\Conversions\ConversionCollection;
use Spatie\MediaLibrary\Conversions\Jobs\PerformConversionsJob;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
trait RegistersMedia
@ -61,7 +63,6 @@ private function registerMedia(
Model $model,
string $s3Key,
string $collectionName,
array $generatedConversions = [],
?int $fileSize = null,
?string $mimeType = null,
?int $orderColumn = null,
@ -69,7 +70,7 @@ private function registerMedia(
): void {
$fileName = pathinfo($s3Key, PATHINFO_BASENAME);
Media::create([
$media = Media::create([
'model_type' => $model->getMorphClass(),
'model_id' => $model->id,
'uuid' => Str::uuid(),
@ -82,10 +83,29 @@ private function registerMedia(
'size' => $fileSize ?? 0,
'manipulations' => [],
'custom_properties' => ['s3_key' => $s3Key],
'generated_conversions' => $generatedConversions,
'generated_conversions' => [],
'responsive_images' => [],
'order_column' => $orderColumn ?? 1,
]);
$this->generateMediaConversions($media);
}
private function generateMediaConversions(Media $media): void
{
$model = $media->model;
if (! $model || ! method_exists($model, 'registerMediaConversions')) {
return;
}
$conversions = ConversionCollection::createForMedia($media);
if ($conversions->isEmpty()) {
return;
}
Bus::dispatch(new PerformConversionsJob($conversions, $media));
}
private function syncPhoto(Model $model, array $data, string $collectionName = 'photos'): void
@ -132,7 +152,6 @@ private function syncReceipt(Model $model, ?string $newKey, string $collectionNa
model: $model,
s3Key: $newKey,
collectionName: $collectionName,
generatedConversions: ['thumb' => true],
fileSize: $fileSize,
mimeType: $fileMimeType,
);