From d59d4449525eb815938dc33a4b01aad6836ecb26 Mon Sep 17 00:00:00 2001 From: Yisroel Baum Date: Fri, 26 Jun 2026 08:26:11 +0300 Subject: [PATCH] create filesystem abstraction --- backend/app/Controllers/ElementController.php | 6 +++--- .../DeleteChildElement/DeleteChildElement.php | 6 +++--- .../UseCases/GetElementPdf/GetElementPdf.php | 6 +++--- .../UseCases/UpdateElement/UpdateIconImage.php | 6 +++--- .../UpdateElement/UpdateIconImageUrl.php | 6 +++--- .../UseCases/UpdateElement/UpdateLongPdf.php | 6 +++--- .../UpdateElement/UpdateLongPdfPath.php | 6 +++--- .../UseCases/UpdateElement/UpdateShortPdf.php | 6 +++--- .../UpdateElement/UpdateShortPdfPath.php | 6 +++--- backend/app/Providers/AppServiceProvider.php | 14 ++++---------- .../Files/{FileUploader.php => Filesystem.php} | 4 +++- ...elFileUploader.php => LaravelFilesystem.php} | 11 ++++++++++- .../Shared/Files/LaravelStoredFileReader.php | 17 ----------------- backend/app/Shared/Files/StoredFileReader.php | 8 -------- 14 files changed, 44 insertions(+), 64 deletions(-) rename backend/app/Shared/Files/{FileUploader.php => Filesystem.php} (74%) rename backend/app/Shared/Files/{LaravelFileUploader.php => LaravelFilesystem.php} (82%) delete mode 100644 backend/app/Shared/Files/LaravelStoredFileReader.php delete mode 100644 backend/app/Shared/Files/StoredFileReader.php diff --git a/backend/app/Controllers/ElementController.php b/backend/app/Controllers/ElementController.php index aeee12b..31fd90c 100644 --- a/backend/app/Controllers/ElementController.php +++ b/backend/app/Controllers/ElementController.php @@ -17,7 +17,7 @@ use App\Element\UseCases\UpdateElement\UpdateElement; use App\Element\UseCases\UpdateElement\UpdateElementRequest; use App\Exceptions\BadRequestException; use App\Exceptions\NotFoundException; -use App\Shared\Files\FileUploader; +use App\Shared\Files\Filesystem; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Http\Response; @@ -32,7 +32,7 @@ class ElementController private ReorderChildElements $reorderChildElements, private UpdateElement $updateElement, private GetElementPdf $getElementPdf, - private FileUploader $fileUploader, + private Filesystem $filesystem, ) { } @@ -400,7 +400,7 @@ class ElementController } if (str_starts_with($path, $folderPrefix)) { - return $this->fileUploader->url($path); + return $this->filesystem->url($path); } return $path; diff --git a/backend/app/Element/UseCases/DeleteChildElement/DeleteChildElement.php b/backend/app/Element/UseCases/DeleteChildElement/DeleteChildElement.php index 954de01..a0c8257 100644 --- a/backend/app/Element/UseCases/DeleteChildElement/DeleteChildElement.php +++ b/backend/app/Element/UseCases/DeleteChildElement/DeleteChildElement.php @@ -6,13 +6,13 @@ use App\Element\Element; use App\Element\ElementRepository; use App\Exceptions\BadRequestException; use App\Exceptions\NotFoundException; -use App\Shared\Files\FileUploader; +use App\Shared\Files\Filesystem; class DeleteChildElement { public function __construct( private ElementRepository $elementRepository, - private FileUploader $fileUploader, + private Filesystem $filesystem, ) { } @@ -78,6 +78,6 @@ class DeleteChildElement return; } - $this->fileUploader->delete($path); + $this->filesystem->delete($path); } } diff --git a/backend/app/Element/UseCases/GetElementPdf/GetElementPdf.php b/backend/app/Element/UseCases/GetElementPdf/GetElementPdf.php index 86d33cf..a742ac3 100644 --- a/backend/app/Element/UseCases/GetElementPdf/GetElementPdf.php +++ b/backend/app/Element/UseCases/GetElementPdf/GetElementPdf.php @@ -3,7 +3,7 @@ namespace App\Element\UseCases\GetElementPdf; use App\Exceptions\NotFoundException; -use App\Shared\Files\StoredFileReader; +use App\Shared\Files\Filesystem; class GetElementPdf { @@ -11,7 +11,7 @@ class GetElementPdf private const PDF_MIME_TYPE = 'application/pdf'; - public function __construct(private StoredFileReader $storedFileReader) + public function __construct(private Filesystem $filesystem) { } @@ -29,7 +29,7 @@ class GetElementPdf } $path = "element-pdfs/$request->folder/$request->fileName"; - $contents = $this->storedFileReader->read($path); + $contents = $this->filesystem->read($path); if ($contents === null) { throw new NotFoundException('PDF not found'); } diff --git a/backend/app/Element/UseCases/UpdateElement/UpdateIconImage.php b/backend/app/Element/UseCases/UpdateElement/UpdateIconImage.php index 59dcaad..0a0d9db 100644 --- a/backend/app/Element/UseCases/UpdateElement/UpdateIconImage.php +++ b/backend/app/Element/UseCases/UpdateElement/UpdateIconImage.php @@ -7,7 +7,7 @@ use App\Element\ElementRepository; use App\Exceptions\BadRequestException; use App\Exceptions\NotFoundException; use App\Shared\Files\FileToUpload; -use App\Shared\Files\FileUploader; +use App\Shared\Files\Filesystem; class UpdateIconImage { @@ -21,7 +21,7 @@ class UpdateIconImage public function __construct( private ElementRepository $elementRepository, - private FileUploader $fileUploader, + private Filesystem $filesystem, ) { } @@ -73,7 +73,7 @@ class UpdateIconImage mimeType: $request->fileMimeType, sizeBytes: $request->fileSizeBytes, ); - $path = $this->fileUploader->upload($iconImage, 'element-icons'); + $path = $this->filesystem->upload($iconImage, 'element-icons'); $element->setIconImageUrl($path); return $this->elementRepository->update($element); diff --git a/backend/app/Element/UseCases/UpdateElement/UpdateIconImageUrl.php b/backend/app/Element/UseCases/UpdateElement/UpdateIconImageUrl.php index 278c566..3c0abdc 100644 --- a/backend/app/Element/UseCases/UpdateElement/UpdateIconImageUrl.php +++ b/backend/app/Element/UseCases/UpdateElement/UpdateIconImageUrl.php @@ -6,13 +6,13 @@ use App\Element\Element; use App\Element\ElementRepository; use App\Exceptions\BadRequestException; use App\Exceptions\NotFoundException; -use App\Shared\Files\FileUploader; +use App\Shared\Files\Filesystem; class UpdateIconImageUrl { public function __construct( private ElementRepository $elementRepository, - private FileUploader $fileUploader, + private Filesystem $filesystem, ) { } @@ -60,6 +60,6 @@ class UpdateIconImageUrl return; } - $this->fileUploader->delete($path); + $this->filesystem->delete($path); } } diff --git a/backend/app/Element/UseCases/UpdateElement/UpdateLongPdf.php b/backend/app/Element/UseCases/UpdateElement/UpdateLongPdf.php index 014ada9..c887001 100644 --- a/backend/app/Element/UseCases/UpdateElement/UpdateLongPdf.php +++ b/backend/app/Element/UseCases/UpdateElement/UpdateLongPdf.php @@ -7,7 +7,7 @@ use App\Element\ElementRepository; use App\Exceptions\BadRequestException; use App\Exceptions\NotFoundException; use App\Shared\Files\FileToUpload; -use App\Shared\Files\FileUploader; +use App\Shared\Files\Filesystem; class UpdateLongPdf { @@ -19,7 +19,7 @@ class UpdateLongPdf public function __construct( private ElementRepository $elementRepository, - private FileUploader $fileUploader, + private Filesystem $filesystem, ) { } @@ -67,7 +67,7 @@ class UpdateLongPdf mimeType: $request->fileMimeType, sizeBytes: $request->fileSizeBytes, ); - $path = $this->fileUploader->upload($pdf, 'element-pdfs/long'); + $path = $this->filesystem->upload($pdf, 'element-pdfs/long'); $element->setLongPdfPath($path); return $this->elementRepository->update($element); diff --git a/backend/app/Element/UseCases/UpdateElement/UpdateLongPdfPath.php b/backend/app/Element/UseCases/UpdateElement/UpdateLongPdfPath.php index ae04422..7f22976 100644 --- a/backend/app/Element/UseCases/UpdateElement/UpdateLongPdfPath.php +++ b/backend/app/Element/UseCases/UpdateElement/UpdateLongPdfPath.php @@ -6,13 +6,13 @@ use App\Element\Element; use App\Element\ElementRepository; use App\Exceptions\BadRequestException; use App\Exceptions\NotFoundException; -use App\Shared\Files\FileUploader; +use App\Shared\Files\Filesystem; class UpdateLongPdfPath { public function __construct( private ElementRepository $elementRepository, - private FileUploader $fileUploader, + private Filesystem $filesystem, ) { } @@ -60,6 +60,6 @@ class UpdateLongPdfPath return; } - $this->fileUploader->delete($path); + $this->filesystem->delete($path); } } diff --git a/backend/app/Element/UseCases/UpdateElement/UpdateShortPdf.php b/backend/app/Element/UseCases/UpdateElement/UpdateShortPdf.php index 122eded..654643f 100644 --- a/backend/app/Element/UseCases/UpdateElement/UpdateShortPdf.php +++ b/backend/app/Element/UseCases/UpdateElement/UpdateShortPdf.php @@ -7,7 +7,7 @@ use App\Element\ElementRepository; use App\Exceptions\BadRequestException; use App\Exceptions\NotFoundException; use App\Shared\Files\FileToUpload; -use App\Shared\Files\FileUploader; +use App\Shared\Files\Filesystem; class UpdateShortPdf { @@ -19,7 +19,7 @@ class UpdateShortPdf public function __construct( private ElementRepository $elementRepository, - private FileUploader $fileUploader, + private Filesystem $filesystem, ) { } @@ -67,7 +67,7 @@ class UpdateShortPdf mimeType: $request->fileMimeType, sizeBytes: $request->fileSizeBytes, ); - $path = $this->fileUploader->upload($pdf, 'element-pdfs/short'); + $path = $this->filesystem->upload($pdf, 'element-pdfs/short'); $element->setShortPdfPath($path); return $this->elementRepository->update($element); diff --git a/backend/app/Element/UseCases/UpdateElement/UpdateShortPdfPath.php b/backend/app/Element/UseCases/UpdateElement/UpdateShortPdfPath.php index ae4b4e3..9b4c409 100644 --- a/backend/app/Element/UseCases/UpdateElement/UpdateShortPdfPath.php +++ b/backend/app/Element/UseCases/UpdateElement/UpdateShortPdfPath.php @@ -6,13 +6,13 @@ use App\Element\Element; use App\Element\ElementRepository; use App\Exceptions\BadRequestException; use App\Exceptions\NotFoundException; -use App\Shared\Files\FileUploader; +use App\Shared\Files\Filesystem; class UpdateShortPdfPath { public function __construct( private ElementRepository $elementRepository, - private FileUploader $fileUploader, + private Filesystem $filesystem, ) { } @@ -60,6 +60,6 @@ class UpdateShortPdfPath return; } - $this->fileUploader->delete($path); + $this->filesystem->delete($path); } } diff --git a/backend/app/Providers/AppServiceProvider.php b/backend/app/Providers/AppServiceProvider.php index 333e4ed..9c972cd 100644 --- a/backend/app/Providers/AppServiceProvider.php +++ b/backend/app/Providers/AppServiceProvider.php @@ -8,10 +8,8 @@ use App\Auth\PasswordHasher; use App\Auth\RandomTokenGenerator; use App\Auth\SystemClock; use App\Auth\TokenGenerator; -use App\Shared\Files\FileUploader; -use App\Shared\Files\LaravelFileUploader; -use App\Shared\Files\LaravelStoredFileReader; -use App\Shared\Files\StoredFileReader; +use App\Shared\Files\Filesystem; +use App\Shared\Files\LaravelFilesystem; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -31,12 +29,8 @@ class AppServiceProvider extends ServiceProvider SystemClock::class, ); $this->app->bind( - FileUploader::class, - LaravelFileUploader::class, - ); - $this->app->bind( - StoredFileReader::class, - LaravelStoredFileReader::class, + Filesystem::class, + LaravelFilesystem::class, ); } } diff --git a/backend/app/Shared/Files/FileUploader.php b/backend/app/Shared/Files/Filesystem.php similarity index 74% rename from backend/app/Shared/Files/FileUploader.php rename to backend/app/Shared/Files/Filesystem.php index ac30916..bc27dae 100644 --- a/backend/app/Shared/Files/FileUploader.php +++ b/backend/app/Shared/Files/Filesystem.php @@ -2,11 +2,13 @@ namespace App\Shared\Files; -interface FileUploader +interface Filesystem { public function upload(FileToUpload $file, string $folder): string; public function url(string $path): string; public function delete(string $path): void; + + public function read(string $path): ?string; } diff --git a/backend/app/Shared/Files/LaravelFileUploader.php b/backend/app/Shared/Files/LaravelFilesystem.php similarity index 82% rename from backend/app/Shared/Files/LaravelFileUploader.php rename to backend/app/Shared/Files/LaravelFilesystem.php index 89416b0..ff82c49 100644 --- a/backend/app/Shared/Files/LaravelFileUploader.php +++ b/backend/app/Shared/Files/LaravelFilesystem.php @@ -5,7 +5,7 @@ namespace App\Shared\Files; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; -class LaravelFileUploader implements FileUploader +class LaravelFilesystem implements Filesystem { public function upload(FileToUpload $file, string $folder): string { @@ -25,6 +25,15 @@ class LaravelFileUploader implements FileUploader Storage::disk('public')->delete($path); } + public function read(string $path): ?string + { + if (!Storage::disk('public')->exists($path)) { + return null; + } + + return Storage::disk('public')->get($path); + } + private function extensionFor(FileToUpload $file): string { $mimeExtensions = [ diff --git a/backend/app/Shared/Files/LaravelStoredFileReader.php b/backend/app/Shared/Files/LaravelStoredFileReader.php deleted file mode 100644 index d1d9fbf..0000000 --- a/backend/app/Shared/Files/LaravelStoredFileReader.php +++ /dev/null @@ -1,17 +0,0 @@ -exists($path)) { - return null; - } - - return Storage::disk('public')->get($path); - } -} diff --git a/backend/app/Shared/Files/StoredFileReader.php b/backend/app/Shared/Files/StoredFileReader.php deleted file mode 100644 index 77117b6..0000000 --- a/backend/app/Shared/Files/StoredFileReader.php +++ /dev/null @@ -1,8 +0,0 @@ -