create filesystem abstraction

This commit is contained in:
Yisroel Baum 2026-06-26 08:26:11 +03:00
parent be2c51bfb7
commit d59d444952
Signed by: yisroelbaum
GPG key ID: 0FA60884F75520A9
14 changed files with 44 additions and 64 deletions

View file

@ -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;

View file

@ -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);
}
}

View file

@ -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');
}

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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,
);
}
}

View file

@ -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;
}

View file

@ -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 = [

View file

@ -1,17 +0,0 @@
<?php
namespace App\Shared\Files;
use Illuminate\Support\Facades\Storage;
class LaravelStoredFileReader implements StoredFileReader
{
public function read(string $path): ?string
{
if (!Storage::disk('public')->exists($path)) {
return null;
}
return Storage::disk('public')->get($path);
}
}

View file

@ -1,8 +0,0 @@
<?php
namespace App\Shared\Files;
interface StoredFileReader
{
public function read(string $path): ?string;
}