2025-12-01 17:02:01 +03:00

91 lines
3.1 KiB
PHP

<?php
namespace App\Http\Resources\FileAttachment;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class FileAttachmentResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'file_id' => $this->file_id,
'label' => $this->label,
'sort_order' => $this->sort_order,
'attachable_type' => $this->attachable_type,
'attachable_id' => $this->attachable_id,
'created_at' => $this->created_at->format('Y-m-d H:i:s'),
'updated_at' => $this->updated_at->format('Y-m-d H:i:s'),
// File information
'file' => $this->whenLoaded('file', function () {
return [
'id' => $this->file->id,
'name' => $this->file->name,
'original_name' => $this->file->original_name ?? $this->file->name,
'path' => $this->file->path,
'mime_type' => $this->file->mime_type,
'size' => $this->file->size,
'size_formatted' => $this->formatFileSize($this->file->size ?? 0),
'extension' => pathinfo($this->file->name, PATHINFO_EXTENSION),
'download_url' => url('/api/files/' . $this->file->id . '/download'),
];
}),
// Attachable model information
'attachable' => $this->whenLoaded('attachable', function () {
return [
'id' => $this->attachable->id,
'type' => class_basename($this->attachable),
'name' => $this->getAttachableName(),
];
}),
// Helper methods
'is_for_intervention' => $this->isForIntervention(),
'is_for_client' => $this->isForClient(),
'is_for_deceased' => $this->isForDeceased(),
'download_url' => $this->downloadUrl,
];
}
/**
* Format file size in human readable format
*/
private function formatFileSize(int $bytes): string
{
$units = ['B', 'KB', 'MB', 'GB', 'TB'];
$bytes = max($bytes, 0);
$pow = floor(($bytes ? log($bytes) : 0) / log(1024));
$pow = min($pow, count($units) - 1);
$bytes /= (1 << (10 * $pow));
return round($bytes, 2) . ' ' . $units[$pow];
}
/**
* Get the display name of the attached model
*/
private function getAttachableName(): string
{
if (!$this->attachable) {
return 'Unknown';
}
return match (get_class($this->attachable)) {
\App\Models\Intervention::class => $this->attachable->title ?? "Intervention #{$this->attachable->id}",
\App\Models\Client::class => $this->attachable->name ?? "Client #{$this->attachable->id}",
\App\Models\Deceased::class => $this->attachable->name ?? "Deceased #{$this->attachable->id}",
default => 'Unknown Model'
};
}
}