invoiceRepository->find($id); if (!$invoice) { return response()->json(['error' => true, 'message' => "Can't find invoice #$id"], 404); } $attachments = $this->attachmentRepository->getByInvoice($id); return response()->json([ 'error' => false, 'data' => $attachments, ]); } public function uploadAttachment(Request $request, int $id): JsonResponse { $invoice = $this->invoiceRepository->find($id); if (!$invoice) { return response()->json(['error' => true, 'message' => "Can't find invoice #$id"], 404); } $request->validate([ 'file' => 'required|file|mimes:jpg,jpeg,png,gif,pdf,doc,docx,xls,xlsx|max:10240', ]); $file = $request->file('file'); $path = $file->store("invoice-attachments/{$id}", 'public'); $uploader = $request->user()?->username ?? $request->user()?->name ?? 'admin'; $attachment = $this->attachmentRepository->create([ 'invoice_id' => $id, 'filename' => $file->getClientOriginalName(), 'path' => $path, 'disk' => 'public', 'mime_type' => $file->getMimeType(), 'size' => $file->getSize(), 'uploaded_by' => $uploader, ]); return response()->json([ 'error' => false, 'message' => 'File uploaded successfully', 'data' => $attachment, ], 201); } public function deleteAttachment(int $id, int $attachmentId): JsonResponse { $invoice = $this->invoiceRepository->find($id); if (!$invoice) { return response()->json(['error' => true, 'message' => "Can't find invoice #$id"], 404); } $attachment = $this->attachmentRepository->find($attachmentId); if (!$attachment || $attachment->invoice_id !== $id) { return response()->json(['error' => true, 'message' => 'Attachment not found'], 404); } $this->attachmentRepository->deleteWithFile($attachmentId); return response()->json([ 'error' => false, 'message' => 'Attachment deleted', ]); } }