diff --git a/backend/app/Controllers/ElementController.php b/backend/app/Controllers/ElementController.php index 66edf8c..b6aae90 100644 --- a/backend/app/Controllers/ElementController.php +++ b/backend/app/Controllers/ElementController.php @@ -5,9 +5,11 @@ namespace App\Controllers; use App\Element\Element; use App\Element\UseCases\GetElement\GetElement; use App\Element\UseCases\GetElement\GetElementRequest; +use App\Element\UseCases\UpdateElement\UpdateElement; use App\Element\UseCases\UpdateElement\UpdateElementIconImage; use App\Element\UseCases\UpdateElement\UpdateElementIconImageRequest; -use App\Element\UseCases\UpdateElement\UpdateElement; +use App\Element\UseCases\UpdateElement\UpdateElementPdf; +use App\Element\UseCases\UpdateElement\UpdateElementPdfRequest; use App\Element\UseCases\UpdateElement\UpdateElementRequest; use App\Exceptions\BadRequestException; use App\Exceptions\NotFoundException; @@ -22,6 +24,7 @@ class ElementController private GetElement $getElement, private UpdateElement $updateElement, private UpdateElementIconImage $updateElementIconImage, + private UpdateElementPdf $updateElementPdf, private FileUploader $fileUploader, ) { } @@ -90,6 +93,35 @@ class ElementController ], 200); } + public function uploadPdf(?int $id, Request $request): JsonResponse + { + $pdf = $this->uploadedFileInput($request, 'pdf'); + + try { + $element = $this->updateElementPdf->execute( + new UpdateElementPdfRequest( + id: $id, + pdfContents: $pdf['contents'], + pdfOriginalName: $pdf['originalName'], + pdfMimeType: $pdf['mimeType'], + pdfSizeBytes: $pdf['sizeBytes'], + ) + ); + } catch (BadRequestException $exception) { + return new JsonResponse([ + 'error' => $exception->getMessage(), + ], 400); + } catch (NotFoundException $exception) { + return new JsonResponse([ + 'error' => $exception->getMessage(), + ], 404); + } + + return new JsonResponse([ + 'element' => $this->buildElementPayload($element), + ], 200); + } + public function uploadIconImage(?int $id, Request $request): JsonResponse { $iconImage = $this->uploadedFileInput($request, 'iconImage'); @@ -190,7 +222,10 @@ class ElementController 'element-icons/', ), 'richText' => $element->getRichText(), - 'pdfPath' => $element->getPdfPath(), + 'pdfPath' => $this->storageUrl( + $element->getPdfPath(), + 'element-pdfs/', + ), 'youtubeUrl' => $element->getYoutubeUrl(), ]; } diff --git a/backend/app/Element/UseCases/UpdateElement/UpdateElementPdf.php b/backend/app/Element/UseCases/UpdateElement/UpdateElementPdf.php new file mode 100644 index 0000000..2f84fc8 --- /dev/null +++ b/backend/app/Element/UseCases/UpdateElement/UpdateElementPdf.php @@ -0,0 +1,75 @@ +id === null) { + throw new BadRequestException('id is required'); + } + + if ( + $request->pdfContents === null + || $request->pdfOriginalName === null + || $request->pdfMimeType === null + || $request->pdfSizeBytes === null + ) { + throw new BadRequestException('pdf is required'); + } + + if ( + ! in_array( + $request->pdfMimeType, + self::ALLOWED_MIME_TYPES, + true, + ) + ) { + throw new BadRequestException('pdf must be a pdf file'); + } + + if ($request->pdfSizeBytes > self::MAX_SIZE_BYTES) { + throw new BadRequestException('pdf must be 10MB or smaller'); + } + + $element = $this->elementRepository->find($request->id); + if ($element === null) { + throw new NotFoundException('Element not found'); + } + + $pdf = new FileToUpload( + contents: $request->pdfContents, + originalName: $request->pdfOriginalName, + mimeType: $request->pdfMimeType, + sizeBytes: $request->pdfSizeBytes, + ); + $path = $this->fileUploader->upload($pdf, 'element-pdfs'); + $element->setPdfPath($path); + + return $this->elementRepository->update($element); + } +} diff --git a/backend/app/Element/UseCases/UpdateElement/UpdateElementPdfRequest.php b/backend/app/Element/UseCases/UpdateElement/UpdateElementPdfRequest.php new file mode 100644 index 0000000..7808083 --- /dev/null +++ b/backend/app/Element/UseCases/UpdateElement/UpdateElementPdfRequest.php @@ -0,0 +1,15 @@ + '.jpg', 'image/png' => '.png', 'image/webp' => '.webp', + 'application/pdf' => '.pdf', ]; if (isset($mimeExtensions[$file->getMimeType()])) { return $mimeExtensions[$file->getMimeType()]; diff --git a/backend/routes/api.php b/backend/routes/api.php index b864ae2..1ad6827 100644 --- a/backend/routes/api.php +++ b/backend/routes/api.php @@ -19,3 +19,8 @@ Route::post( [ElementController::class, 'uploadIconImage'], ) ->middleware(AuthMiddleware::class); +Route::post( + '/elements/{id}/pdf', + [ElementController::class, 'uploadPdf'], +) + ->middleware(AuthMiddleware::class);