From 7972d517cea34dab0caefe20cec899010f6b3801 Mon Sep 17 00:00:00 2001 From: Dave Smith-Hayes Date: Sun, 27 Apr 2025 02:53:34 +0000 Subject: [PATCH] Update the FileSystemSchema and work on uploading the files. --- app/src/Bootstrap.php | 20 ++++++++++++++++ app/src/Configuration/FileSystemSchema.php | 18 +++++++++++++++ .../Episode/UploadEpisodeFileAction.php | 23 +++++++++++++++++-- .../Api/File/FileHandlerInterface.php | 21 ----------------- 4 files changed, 59 insertions(+), 23 deletions(-) create mode 100644 app/src/Configuration/FileSystemSchema.php delete mode 100644 app/src/Infrastructure/Api/File/FileHandlerInterface.php diff --git a/app/src/Bootstrap.php b/app/src/Bootstrap.php index fbd5d7a..df30aca 100644 --- a/app/src/Bootstrap.php +++ b/app/src/Bootstrap.php @@ -9,6 +9,9 @@ use DI\ContainerBuilder; use League\Config\Configuration; +use League\Flysystem\Filesystem; +use League\Flysystem\FilesystemOperator; +use League\Flysystem\Local\LocalFilesystemAdapter; use Monolog\Handler\StreamHandler; use Monolog\Level; use Monolog\Logger; @@ -26,12 +29,14 @@ use Psr\Log\LoggerInterface; use Slim\App; use Slim\Factory\AppFactory; use Slim\Psr7\Factory\ResponseFactory; +use Slovocast\Configuration\FileSystemSchema; use Slovocast\Middleware\SessionMiddleware; use Twig\Error\LoaderError; use Slovocast\Configuration\DatabaseConnectionSchema; use Slovocast\Configuration\SessionSchema; use Slovocast\Configuration\SiteInformationSchema; +use Slovocast\Configuration\FileSystemSchema; use Slovocast\Domain\Repository\Channel\ChannelRepository; use Slovocast\Domain\Repository\Channel\ChannelRepositoryInterface; @@ -73,6 +78,7 @@ class Bootstrap $config->addSchema('site', SiteInformationSchema::getSchema()); $config->addSchema('database', DatabaseConnectionSchema::getSchema()); $config->addSchema('session', SessionSchema::getSchema()); + $config->addSchema('filestytem', FileSystemSchema::getSchema()); $config->merge([ 'site' => [ @@ -91,6 +97,10 @@ class Bootstrap 'username' => $_ENV['DB_USER'], 'password' => $_ENV['DB_PASSWORD'], 'port' => (int) $_ENV['DB_PORT'], + ], + 'filesystem' => [ + 'type' => 'local', + 'location' => '/var/slovocast/data' ] ]); @@ -166,6 +176,16 @@ class Bootstrap ); }, + /** + * FlySystem set up + */ + FilesystemOperator::class => function (ContainerInterface $container) { + // get config + $config = $container->get('config'); + $adapter = new LocalFilesystemAdapter($config('filesystem.location')); + return new Filesystem($adapter); + }, + /** * Utility classes */ diff --git a/app/src/Configuration/FileSystemSchema.php b/app/src/Configuration/FileSystemSchema.php new file mode 100644 index 0000000..6d76f99 --- /dev/null +++ b/app/src/Configuration/FileSystemSchema.php @@ -0,0 +1,18 @@ + Expect::anyOf([ 'local', 's3' ])->default('local'), + 'location' => Expect::string()->default('/var/slovocast/data')->required(), + ]); + } +} + diff --git a/app/src/Handler/Channel/Episode/UploadEpisodeFileAction.php b/app/src/Handler/Channel/Episode/UploadEpisodeFileAction.php index bd7f9e6..ab32018 100644 --- a/app/src/Handler/Channel/Episode/UploadEpisodeFileAction.php +++ b/app/src/Handler/Channel/Episode/UploadEpisodeFileAction.php @@ -2,7 +2,12 @@ namespace Slovocast\Handler\Channel\Episode; +use League\Flysystem\FilesystemException; +use League\Flysystem\FilesystemOperator; +use League\Flysystem\UnableToWriteFile; +use Odan\Session\SessionInterface; use Psr\Http\Message\UploadedFileInterface; +use Psr\Log\LoggerInterface; use Slovocast\Handler\Handler; use Psr\Http\Message\ResponseInterface; use Slovocast\Domain\Repository\Episode\EpisodeFileRepositoryInterface; @@ -10,7 +15,10 @@ use Slovocast\Domain\Repository\Episode\EpisodeFileRepositoryInterface; class UploadEpisodeFileAction extends Handler { public function __construct( - EpisodeFileRepositoryInterface $episodeFileRepository + private EpisodeFileRepositoryInterface $episodeFileRepository, + private FilesystemOperator $filesystem, + private SessionInterface $session, + private LoggerInterface $logger ) { } public function handle(): ResponseInterface @@ -19,7 +27,18 @@ class UploadEpisodeFileAction extends Handler $files = $this->request->getUploadedFiles(); // move the files to storage + try { + foreach ($files as $file) { + $this->filesystem->writeStream($file->getStream()); + } - return $this->json([ 'message' => 'Uploaded Episode file.' ]); + return $this->json([ 'message' => 'Uploaded Episode file' ]); + } catch (FilesystemException | UnableToWriteFile $e) { + $this->logger->error($e->getMessage()); + } + + $errorMessage = "Unable to upload file"; + $this->session->getFlash()->add('error', $errorMessage); + return $this->json([ 'message' => $errorMessage ]); } } diff --git a/app/src/Infrastructure/Api/File/FileHandlerInterface.php b/app/src/Infrastructure/Api/File/FileHandlerInterface.php deleted file mode 100644 index 9029668..0000000 --- a/app/src/Infrastructure/Api/File/FileHandlerInterface.php +++ /dev/null @@ -1,21 +0,0 @@ -