ProductionOrderFileController.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Http\Controllers;
  4. use App\Models\File;
  5. use App\Models\ProductionOrder;
  6. use App\Models\ProductionOrderItem;
  7. use App\Services\FileService;
  8. use Illuminate\Http\RedirectResponse;
  9. use Illuminate\Http\Request;
  10. use Throwable;
  11. class ProductionOrderFileController extends Controller
  12. {
  13. public function storeDocuments(
  14. Request $request,
  15. ProductionOrder $productionOrder,
  16. FileService $fileService,
  17. ): RedirectResponse {
  18. $validated = $request->validate([
  19. 'documents' => ['required', 'array', 'max:5'],
  20. 'documents.*' => ['required', 'file', 'max:10240'],
  21. ]);
  22. try {
  23. $files = collect($validated['documents'])
  24. ->map(fn ($document): File => $fileService->saveUploadedFile(
  25. "production-orders/{$productionOrder->id}/documents",
  26. $document,
  27. ));
  28. $productionOrder->documents()->syncWithoutDetaching($files->pluck('id'));
  29. } catch (Throwable $exception) {
  30. report($exception);
  31. return back()->with('error', 'Не удалось загрузить документы.');
  32. }
  33. return back()->with('success', 'Документы загружены.');
  34. }
  35. public function destroyDocument(
  36. ProductionOrder $productionOrder,
  37. File $file,
  38. FileService $fileService,
  39. ): RedirectResponse {
  40. abort_unless($productionOrder->documents()->whereKey($file->id)->exists(), 404);
  41. $productionOrder->documents()->detach($file->id);
  42. $fileService->deleteFileWithThumbnail($file);
  43. $file->delete();
  44. return back()->with('success', 'Документ удалён.');
  45. }
  46. public function storePhotos(
  47. Request $request,
  48. ProductionOrder $productionOrder,
  49. FileService $fileService,
  50. ): RedirectResponse {
  51. $validated = $request->validate([
  52. 'photos' => ['required', 'array', 'max:10'],
  53. 'photos.*' => ['required', 'file', 'mimes:jpeg,jpg,png,webp', 'max:10240'],
  54. ]);
  55. try {
  56. $files = collect($validated['photos'])
  57. ->map(fn ($photo): File => $fileService->saveUploadedFile(
  58. "production-orders/{$productionOrder->id}/photos",
  59. $photo,
  60. ));
  61. $productionOrder->photos()->syncWithoutDetaching($files->pluck('id'));
  62. } catch (Throwable $exception) {
  63. report($exception);
  64. return back()->with('error', 'Не удалось загрузить фотографии.');
  65. }
  66. return back()->with('success', 'Фотографии загружены.');
  67. }
  68. public function destroyPhoto(
  69. ProductionOrder $productionOrder,
  70. File $file,
  71. FileService $fileService,
  72. ): RedirectResponse {
  73. abort_unless($productionOrder->photos()->whereKey($file->id)->exists(), 404);
  74. $productionOrder->photos()->detach($file->id);
  75. $fileService->deleteFileWithThumbnail($file);
  76. $file->delete();
  77. return back()->with('success', 'Фотография удалена.');
  78. }
  79. public function storePassport(
  80. Request $request,
  81. ProductionOrder $productionOrder,
  82. ProductionOrderItem $item,
  83. FileService $fileService,
  84. ): RedirectResponse {
  85. $this->ensureItemBelongsToOrder($productionOrder, $item);
  86. $validated = $request->validate([
  87. 'passport' => ['required', 'file', 'max:10240'],
  88. ]);
  89. $previousPassport = $item->passportFile;
  90. try {
  91. $file = $fileService->saveUploadedFile(
  92. "production-orders/{$productionOrder->id}/items/{$item->id}/passport",
  93. $validated['passport'],
  94. );
  95. $item->update(['passport_file_id' => $file->id]);
  96. if ($previousPassport) {
  97. $fileService->deleteFileWithThumbnail($previousPassport);
  98. $previousPassport->delete();
  99. }
  100. } catch (Throwable $exception) {
  101. report($exception);
  102. return back()->with('error', 'Не удалось загрузить паспорт.');
  103. }
  104. return back()->with('success', 'Паспорт загружен.');
  105. }
  106. public function destroyPassport(
  107. ProductionOrder $productionOrder,
  108. ProductionOrderItem $item,
  109. FileService $fileService,
  110. ): RedirectResponse {
  111. $this->ensureItemBelongsToOrder($productionOrder, $item);
  112. $file = $item->passportFile;
  113. abort_unless($file, 404);
  114. $item->update(['passport_file_id' => null]);
  115. $fileService->deleteFileWithThumbnail($file);
  116. $file->delete();
  117. return back()->with('success', 'Паспорт удалён.');
  118. }
  119. private function ensureItemBelongsToOrder(ProductionOrder $productionOrder, ProductionOrderItem $item): void
  120. {
  121. abort_unless((int) $item->production_order_id === (int) $productionOrder->id, 404);
  122. }
  123. }