validate([ 'message' => ['nullable', 'string'], 'attachments' => ['nullable', 'array', 'max:5'], 'attachments.*' => ['file', 'max:10240'], ]); $message = trim((string) ($validated['message'] ?? '')); $attachments = $request->file('attachments', []); if ($message === '' && $attachments === []) { return back()->with('danger', 'Нужно указать сообщение или добавить файл.'); } try { $chatMessage = ChatMessage::query()->create([ 'production_order_id' => $productionOrder->id, 'user_id' => (int) $request->user()->id, 'notification_type' => ChatMessage::NOTIFICATION_NONE, 'message' => $message !== '' ? $message : null, ]); $files = collect($attachments) ->map(fn ($attachment) => $fileService->saveUploadedFile( "chat/production-orders/{$productionOrder->id}", $attachment, )); $chatMessage->files()->syncWithoutDetaching($files->pluck('id')); } catch (Throwable $exception) { report($exception); return back()->with('error', 'Не удалось отправить сообщение в чат.'); } return back()->with('success', 'Сообщение отправлено.'); } public function destroy( ProductionOrder $productionOrder, ChatMessage $chatMessage, FileService $fileService, ): RedirectResponse { abort_unless((int) $chatMessage->production_order_id === (int) $productionOrder->id, 404); $files = $chatMessage->files()->get(); DB::transaction(function () use ($chatMessage): void { $chatMessage->notifiedUsers()->detach(); $chatMessage->files()->detach(); $chatMessage->delete(); }); foreach ($files as $file) { $fileService->deleteFileWithThumbnail($file); $file->delete(); } return back()->with('success', 'Сообщение удалено.'); } }