From 9e3e2ce15de040f8345c3aff5ab0d0fd1c994ce6 Mon Sep 17 00:00:00 2001 From: Flo Date: Wed, 7 Aug 2024 19:40:40 +0000 Subject: [PATCH] tag sorting, and tag thumbnail --- src/ApiDomain/External/Tag/config/routes.php | 9 +++ .../External/Tag/config/service_manager.php | 2 + .../Tag/src/Handler/ReadThumbnailHandler.php | 58 +++++++++++++++++++ .../ReadThumbnailResponseFormatter.php | 15 +++++ .../Business/src/Repository/TagRepository.php | 10 +++- .../Tag/config/service_manager.php | 5 ++ .../ReadThumbnail/ReadThumbnailQuery.php | 20 +++++++ .../ReadThumbnailQueryBuilder.php | 18 ++++++ .../ReadThumbnailQueryHandler.php | 41 +++++++++++++ .../ReadThumbnailQueryResult.php | 20 +++++++ 10 files changed, 195 insertions(+), 3 deletions(-) create mode 100644 src/ApiDomain/External/Tag/src/Handler/ReadThumbnailHandler.php create mode 100644 src/ApiDomain/External/Tag/src/ResponseFormatter/ReadThumbnailResponseFormatter.php create mode 100644 src/HandlingDomain/Tag/src/Handler/Query/ReadThumbnail/ReadThumbnailQuery.php create mode 100644 src/HandlingDomain/Tag/src/Handler/Query/ReadThumbnail/ReadThumbnailQueryBuilder.php create mode 100644 src/HandlingDomain/Tag/src/Handler/Query/ReadThumbnail/ReadThumbnailQueryHandler.php create mode 100644 src/HandlingDomain/Tag/src/Handler/Query/ReadThumbnail/ReadThumbnailQueryResult.php diff --git a/src/ApiDomain/External/Tag/config/routes.php b/src/ApiDomain/External/Tag/config/routes.php index a40efa9..5dd09de 100644 --- a/src/ApiDomain/External/Tag/config/routes.php +++ b/src/ApiDomain/External/Tag/config/routes.php @@ -3,6 +3,7 @@ use MyTube\API\External\Tag\Handler\AddAliasHandler; use MyTube\API\External\Tag\Handler\CreateHandler; use MyTube\API\External\Tag\Handler\ReadDetailsHandler; +use MyTube\API\External\Tag\Handler\ReadThumbnailHandler; use MyTube\API\External\Tag\Handler\ReadVideoListHandler; return [ @@ -38,4 +39,12 @@ return [ ReadVideoListHandler::class, ], ], + [ + 'name' => 'tag.thumbnail', + 'path' => '/api/tag/thumbnail/:tagUuid[/]', + 'allowed_methods' => ['GET'], + 'middleware' => [ + ReadThumbnailHandler::class, + ], + ], ]; diff --git a/src/ApiDomain/External/Tag/config/service_manager.php b/src/ApiDomain/External/Tag/config/service_manager.php index a3ba791..5cdeab7 100644 --- a/src/ApiDomain/External/Tag/config/service_manager.php +++ b/src/ApiDomain/External/Tag/config/service_manager.php @@ -3,6 +3,7 @@ use MyTube\API\External\Tag\Handler\AddAliasHandler; use MyTube\API\External\Tag\Handler\CreateHandler; use MyTube\API\External\Tag\Handler\ReadDetailsHandler; +use MyTube\API\External\Tag\Handler\ReadThumbnailHandler; use MyTube\API\External\Tag\Handler\ReadVideoListHandler; use MyTube\API\External\Tag\ResponseFormatter\AddAliasResponseFormatter; use MyTube\API\External\Tag\ResponseFormatter\CreateResponseFormatter; @@ -17,6 +18,7 @@ return [ CreateHandler::class => AutoWiringFactory::class, ReadDetailsHandler::class => AutoWiringFactory::class, ReadVideoListHandler::class => AutoWiringFactory::class, + ReadThumbnailHandler::class => AutoWiringFactory::class, // Response Formatter AddAliasResponseFormatter::class => AutoWiringFactory::class, diff --git a/src/ApiDomain/External/Tag/src/Handler/ReadThumbnailHandler.php b/src/ApiDomain/External/Tag/src/Handler/ReadThumbnailHandler.php new file mode 100644 index 0000000..127fe06 --- /dev/null +++ b/src/ApiDomain/External/Tag/src/Handler/ReadThumbnailHandler.php @@ -0,0 +1,58 @@ +getAttribute('tagUuid') ?? null; + + if ($tagUuid === null) { + throw new MyTubeException('No tagUuid provided'); + } + + try { + $readThumbnailQuery = $this->readThumbnailQueryBuilder->build( + Uuid::fromString($tagUuid) + ); + $result = $this->readThumbnailQueryHandler->execute($readThumbnailQuery); + + $thumbnailVideo = $result->getThumbnailVideo(); + if ($thumbnailVideo === null) { + throw new MyTubeException('No thumbnail video for tag'); + } + + $filePath = $thumbnailVideo->getDirectoryPath() . 'thumbnail.png'; + if (!file_exists($filePath)) { + throw new MyTubeException('Thumbnail file does not exist'); + } + + $fileContent = file_get_contents($filePath); + $response = new TextResponse($fileContent); + return $response->withHeader('Content-Type', 'image/png'); + + } catch (Throwable $exception) { + return new JsonResponse('Not Found', 404); + } + } +} diff --git a/src/ApiDomain/External/Tag/src/ResponseFormatter/ReadThumbnailResponseFormatter.php b/src/ApiDomain/External/Tag/src/ResponseFormatter/ReadThumbnailResponseFormatter.php new file mode 100644 index 0000000..4befcac --- /dev/null +++ b/src/ApiDomain/External/Tag/src/ResponseFormatter/ReadThumbnailResponseFormatter.php @@ -0,0 +1,15 @@ +createQueryBuilder('t'); + $queryBuilder = $this->createQueryBuilder('t') + ->leftJoin('t.videos', 'v') + ->groupBy('t.id') + ->select('t, COUNT(v.id) as HIDDEN video_count') + ->orderBy('video_count', 'DESC'); if ($query !== null) { $query = '%'.$query.'%'; $queryBuilder - ->where('t.description like :query') + ->where('t.description LIKE :query') ->setParameter('query', $query); } - return $queryBuilder->getQuery()->execute(); + return $queryBuilder->getQuery()->getResult(); } } \ No newline at end of file diff --git a/src/HandlingDomain/Tag/config/service_manager.php b/src/HandlingDomain/Tag/config/service_manager.php index 3ae517f..7e62485 100644 --- a/src/HandlingDomain/Tag/config/service_manager.php +++ b/src/HandlingDomain/Tag/config/service_manager.php @@ -8,6 +8,8 @@ use MyTube\Handling\Tag\Handler\Command\Create\CreateCommandBuilder; use MyTube\Handling\Tag\Handler\Command\Create\CreateCommandHandler; use MyTube\Handling\Tag\Handler\Query\ReadDetails\ReadDetailsQueryBuilder; use MyTube\Handling\Tag\Handler\Query\ReadDetails\ReadDetailsQueryHandler; +use MyTube\Handling\Tag\Handler\Query\ReadThumbnail\ReadThumbnailQueryBuilder; +use MyTube\Handling\Tag\Handler\Query\ReadThumbnail\ReadThumbnailQueryHandler; use MyTube\Handling\Tag\Handler\Query\ReadVideoList\ReadVideoListQueryBuilder; use MyTube\Handling\Tag\Handler\Query\ReadVideoList\ReadVideoListQueryHandler; use MyTube\Handling\Tag\Rule\TagAliasExistsRule; @@ -40,5 +42,8 @@ return [ // Read Video List ReadVideoListQueryBuilder::class => AutoWiringFactory::class, ReadVideoListQueryHandler::class => InjectionFactory::class, + // Read Thumbnail + ReadThumbnailQueryBuilder::class => AutoWiringFactory::class, + ReadThumbnailQueryHandler::class => InjectionFactory::class, ], ]; diff --git a/src/HandlingDomain/Tag/src/Handler/Query/ReadThumbnail/ReadThumbnailQuery.php b/src/HandlingDomain/Tag/src/Handler/Query/ReadThumbnail/ReadThumbnailQuery.php new file mode 100644 index 0000000..b77c36f --- /dev/null +++ b/src/HandlingDomain/Tag/src/Handler/Query/ReadThumbnail/ReadThumbnailQuery.php @@ -0,0 +1,20 @@ +tagUuid; + } +} diff --git a/src/HandlingDomain/Tag/src/Handler/Query/ReadThumbnail/ReadThumbnailQueryBuilder.php b/src/HandlingDomain/Tag/src/Handler/Query/ReadThumbnail/ReadThumbnailQueryBuilder.php new file mode 100644 index 0000000..60df10c --- /dev/null +++ b/src/HandlingDomain/Tag/src/Handler/Query/ReadThumbnail/ReadThumbnailQueryBuilder.php @@ -0,0 +1,18 @@ +tagRepository->findOneBy([ + 'id' => $readThumbnailQuery->getTagUuid() + ]); + + $videoCount = $tag->getVideos()->count(); + + if ($videoCount > 0) { + $thumbnailVideo = $tag->getVideos()[rand(0, $videoCount - 1)]; + } + + return new ReadThumbnailQueryResult($thumbnailVideo); + } +} diff --git a/src/HandlingDomain/Tag/src/Handler/Query/ReadThumbnail/ReadThumbnailQueryResult.php b/src/HandlingDomain/Tag/src/Handler/Query/ReadThumbnail/ReadThumbnailQueryResult.php new file mode 100644 index 0000000..9e0526c --- /dev/null +++ b/src/HandlingDomain/Tag/src/Handler/Query/ReadThumbnail/ReadThumbnailQueryResult.php @@ -0,0 +1,20 @@ +thumbnailVideo; + } +}