MediaService.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. namespace App\Services;
  3. use App\Models\Media;
  4. use App\Traits\RemoveArchiveS3;
  5. use App\Traits\UploadsFile;
  6. use Illuminate\Database\Eloquent\Collection;
  7. use Illuminate\Http\UploadedFile;
  8. use Illuminate\Support\Facades\Log;
  9. class MediaService
  10. {
  11. use RemoveArchiveS3, UploadsFile;
  12. public function getAll(): Collection
  13. {
  14. return Media::query()
  15. ->with(['user'])
  16. ->orderBy('created_at', 'desc')
  17. ->get();
  18. }
  19. public function findById(int $id): ?Media
  20. {
  21. return Media::with(['user'])->find($id);
  22. }
  23. public function create(array $data): Media
  24. {
  25. return Media::create($data);
  26. }
  27. public function update(int $id, array $data): ?Media
  28. {
  29. $model = $this->findById($id);
  30. if (! $model) {
  31. return null;
  32. }
  33. $model->update($data);
  34. return $model->fresh(['user']);
  35. }
  36. public function delete(int $id): bool
  37. {
  38. $model = $this->findById($id);
  39. if (! $model) {
  40. return false;
  41. }
  42. return $model->delete();
  43. }
  44. public function createFromFile(UploadedFile $file, string $folder, string $source, int $sourceId, ?string $filename = null): Media
  45. {
  46. Log::info('[avatar-upload] MediaService::createFromFile — iniciando upload para S3', [
  47. 'folder' => $folder,
  48. 'source' => $source,
  49. 'source_id' => $sourceId,
  50. 'file_original_name'=> $file->getClientOriginalName(),
  51. 'file_size' => $file->getSize(),
  52. 'file_mime' => $file->getMimeType(),
  53. 'file_extension' => $file->getClientOriginalExtension(),
  54. 'file_is_valid' => $file->isValid(),
  55. ]);
  56. $path = $this->uploadFile($file, $folder, $filename);
  57. Log::info('[avatar-upload] MediaService::createFromFile — upload concluído, criando registro Media', [
  58. 'path_retornado' => $path,
  59. 'source' => $source,
  60. 'source_id' => $sourceId,
  61. ]);
  62. $media = Media::create([
  63. 'source' => $source,
  64. 'source_id' => $sourceId,
  65. 'name' => $file->getClientOriginalName(),
  66. 'path' => $path,
  67. ]);
  68. Log::info('[avatar-upload] MediaService::createFromFile — Media criado no banco', [
  69. 'media_id' => $media->id,
  70. 'media_path' => $media->path,
  71. 'media_url' => $media->url ?? null,
  72. ]);
  73. return $media;
  74. }
  75. public function replaceFile(UploadedFile $newFile, string $folder, string $source, int $sourceId, ?Media $old = null, ?string $filename = null): Media
  76. {
  77. Log::info('[avatar-upload] MediaService::replaceFile iniciado', [
  78. 'folder' => $folder,
  79. 'source' => $source,
  80. 'source_id' => $sourceId,
  81. 'has_old_media'=> $old !== null,
  82. 'old_media_id' => $old?->id,
  83. 'old_path' => $old?->path,
  84. ]);
  85. if ($old) {
  86. Log::info('[avatar-upload] Removendo arquivo antigo do S3', ['old_path' => $old->path]);
  87. $this->removeArchiveByPath($old->path);
  88. $old->delete();
  89. Log::info('[avatar-upload] Arquivo antigo removido do S3 e Media deletado do banco');
  90. }
  91. return $this->createFromFile($newFile, $folder, $source, $sourceId, $filename);
  92. }
  93. }