ProductionOrderFileController.php 4.9 KB

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