| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- <?php
- declare(strict_types=1);
- namespace App\Http\Controllers;
- use App\Models\ChatMessage;
- use App\Models\ProductionOrder;
- use App\Services\FileService;
- use Illuminate\Http\RedirectResponse;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\DB;
- use Throwable;
- class ProductionOrderChatMessageController extends Controller
- {
- public function store(
- Request $request,
- ProductionOrder $productionOrder,
- FileService $fileService,
- ): RedirectResponse {
- $validated = $request->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', 'Сообщение удалено.');
- }
- }
|