ProductionOrderChatMessageController.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Http\Controllers;
  4. use App\Models\ChatMessage;
  5. use App\Models\ProductionOrder;
  6. use App\Services\FileService;
  7. use Illuminate\Http\RedirectResponse;
  8. use Illuminate\Http\Request;
  9. use Illuminate\Support\Facades\DB;
  10. use Throwable;
  11. class ProductionOrderChatMessageController extends Controller
  12. {
  13. public function store(
  14. Request $request,
  15. ProductionOrder $productionOrder,
  16. FileService $fileService,
  17. ): RedirectResponse {
  18. $validated = $request->validate([
  19. 'message' => ['nullable', 'string'],
  20. 'attachments' => ['nullable', 'array', 'max:5'],
  21. 'attachments.*' => ['file', 'max:10240'],
  22. ]);
  23. $message = trim((string) ($validated['message'] ?? ''));
  24. $attachments = $request->file('attachments', []);
  25. if ($message === '' && $attachments === []) {
  26. return back()->with('danger', 'Нужно указать сообщение или добавить файл.');
  27. }
  28. try {
  29. $chatMessage = ChatMessage::query()->create([
  30. 'production_order_id' => $productionOrder->id,
  31. 'user_id' => (int) $request->user()->id,
  32. 'notification_type' => ChatMessage::NOTIFICATION_NONE,
  33. 'message' => $message !== '' ? $message : null,
  34. ]);
  35. $files = collect($attachments)
  36. ->map(fn ($attachment) => $fileService->saveUploadedFile(
  37. "chat/production-orders/{$productionOrder->id}",
  38. $attachment,
  39. ));
  40. $chatMessage->files()->syncWithoutDetaching($files->pluck('id'));
  41. } catch (Throwable $exception) {
  42. report($exception);
  43. return back()->with('error', 'Не удалось отправить сообщение в чат.');
  44. }
  45. return back()->with('success', 'Сообщение отправлено.');
  46. }
  47. public function destroy(
  48. ProductionOrder $productionOrder,
  49. ChatMessage $chatMessage,
  50. FileService $fileService,
  51. ): RedirectResponse {
  52. abort_unless((int) $chatMessage->production_order_id === (int) $productionOrder->id, 404);
  53. $files = $chatMessage->files()->get();
  54. DB::transaction(function () use ($chatMessage): void {
  55. $chatMessage->notifiedUsers()->detach();
  56. $chatMessage->files()->detach();
  57. $chatMessage->delete();
  58. });
  59. foreach ($files as $file) {
  60. $fileService->deleteFileWithThumbnail($file);
  61. $file->delete();
  62. }
  63. return back()->with('success', 'Сообщение удалено.');
  64. }
  65. }