tag sorting, and tag thumbnail

This commit is contained in:
Flo 2024-08-07 19:40:40 +00:00
parent caff0ec71f
commit 9e3e2ce15d
10 changed files with 195 additions and 3 deletions

View File

@ -3,6 +3,7 @@
use MyTube\API\External\Tag\Handler\AddAliasHandler; use MyTube\API\External\Tag\Handler\AddAliasHandler;
use MyTube\API\External\Tag\Handler\CreateHandler; use MyTube\API\External\Tag\Handler\CreateHandler;
use MyTube\API\External\Tag\Handler\ReadDetailsHandler; 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\Handler\ReadVideoListHandler;
return [ return [
@ -38,4 +39,12 @@ return [
ReadVideoListHandler::class, ReadVideoListHandler::class,
], ],
], ],
[
'name' => 'tag.thumbnail',
'path' => '/api/tag/thumbnail/:tagUuid[/]',
'allowed_methods' => ['GET'],
'middleware' => [
ReadThumbnailHandler::class,
],
],
]; ];

View File

@ -3,6 +3,7 @@
use MyTube\API\External\Tag\Handler\AddAliasHandler; use MyTube\API\External\Tag\Handler\AddAliasHandler;
use MyTube\API\External\Tag\Handler\CreateHandler; use MyTube\API\External\Tag\Handler\CreateHandler;
use MyTube\API\External\Tag\Handler\ReadDetailsHandler; 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\Handler\ReadVideoListHandler;
use MyTube\API\External\Tag\ResponseFormatter\AddAliasResponseFormatter; use MyTube\API\External\Tag\ResponseFormatter\AddAliasResponseFormatter;
use MyTube\API\External\Tag\ResponseFormatter\CreateResponseFormatter; use MyTube\API\External\Tag\ResponseFormatter\CreateResponseFormatter;
@ -17,6 +18,7 @@ return [
CreateHandler::class => AutoWiringFactory::class, CreateHandler::class => AutoWiringFactory::class,
ReadDetailsHandler::class => AutoWiringFactory::class, ReadDetailsHandler::class => AutoWiringFactory::class,
ReadVideoListHandler::class => AutoWiringFactory::class, ReadVideoListHandler::class => AutoWiringFactory::class,
ReadThumbnailHandler::class => AutoWiringFactory::class,
// Response Formatter // Response Formatter
AddAliasResponseFormatter::class => AutoWiringFactory::class, AddAliasResponseFormatter::class => AutoWiringFactory::class,

View File

@ -0,0 +1,58 @@
<?php
declare(strict_types=1);
namespace MyTube\API\External\Tag\Handler;
use Laminas\Diactoros\Response\JsonResponse;
use Laminas\Diactoros\Response\TextResponse;
use MyTube\Handling\Tag\Handler\Query\ReadThumbnail\ReadThumbnailQueryBuilder;
use MyTube\Handling\Tag\Handler\Query\ReadThumbnail\ReadThumbnailQueryHandler;
use MyTube\Infrastructure\Exception\Exception\MyTubeException;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Ramsey\Uuid\Uuid;
use Throwable;
class ReadThumbnailHandler implements RequestHandlerInterface
{
public function __construct(
private readonly ReadThumbnailQueryHandler $readThumbnailQueryHandler,
private readonly ReadThumbnailQueryBuilder $readThumbnailQueryBuilder,
) {
}
public function handle(ServerRequestInterface $request): ResponseInterface
{
$tagUuid = $request->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);
}
}
}

View File

@ -0,0 +1,15 @@
<?php
declare(strict_types=1);
namespace MyTube\API\External\Tag\ResponseFormatter;
use MyTube\Handling\Tag\Handler\Query\ReadThumbnail\ReadThumbnailQueryResult;
class ReadThumbnailResponseFormatter
{
public function format(ReadThumbnailQueryResult $readThumbnailQueryResult): array
{
return [];
}
}

View File

@ -9,16 +9,20 @@ class TagRepository extends EntityRepository {
?string $query, ?string $query,
): array ): array
{ {
$queryBuilder = $this->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) { if ($query !== null) {
$query = '%'.$query.'%'; $query = '%'.$query.'%';
$queryBuilder $queryBuilder
->where('t.description like :query') ->where('t.description LIKE :query')
->setParameter('query', $query); ->setParameter('query', $query);
} }
return $queryBuilder->getQuery()->execute(); return $queryBuilder->getQuery()->getResult();
} }
} }

View File

@ -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\Command\Create\CreateCommandHandler;
use MyTube\Handling\Tag\Handler\Query\ReadDetails\ReadDetailsQueryBuilder; use MyTube\Handling\Tag\Handler\Query\ReadDetails\ReadDetailsQueryBuilder;
use MyTube\Handling\Tag\Handler\Query\ReadDetails\ReadDetailsQueryHandler; 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\ReadVideoListQueryBuilder;
use MyTube\Handling\Tag\Handler\Query\ReadVideoList\ReadVideoListQueryHandler; use MyTube\Handling\Tag\Handler\Query\ReadVideoList\ReadVideoListQueryHandler;
use MyTube\Handling\Tag\Rule\TagAliasExistsRule; use MyTube\Handling\Tag\Rule\TagAliasExistsRule;
@ -40,5 +42,8 @@ return [
// Read Video List // Read Video List
ReadVideoListQueryBuilder::class => AutoWiringFactory::class, ReadVideoListQueryBuilder::class => AutoWiringFactory::class,
ReadVideoListQueryHandler::class => InjectionFactory::class, ReadVideoListQueryHandler::class => InjectionFactory::class,
// Read Thumbnail
ReadThumbnailQueryBuilder::class => AutoWiringFactory::class,
ReadThumbnailQueryHandler::class => InjectionFactory::class,
], ],
]; ];

View File

@ -0,0 +1,20 @@
<?php
declare(strict_types=1);
namespace MyTube\Handling\Tag\Handler\Query\ReadThumbnail;
use Ramsey\Uuid\UuidInterface;
class ReadThumbnailQuery
{
public function __construct(
private readonly UuidInterface $tagUuid
) {
}
public function getTagUuid(): UuidInterface
{
return $this->tagUuid;
}
}

View File

@ -0,0 +1,18 @@
<?php
declare(strict_types=1);
namespace MyTube\Handling\Tag\Handler\Query\ReadThumbnail;
use Ramsey\Uuid\UuidInterface;
class ReadThumbnailQueryBuilder
{
public function build(
UuidInterface $tagUuid
): ReadThumbnailQuery {
return new ReadThumbnailQuery(
$tagUuid
);
}
}

View File

@ -0,0 +1,41 @@
<?php
declare(strict_types=1);
namespace MyTube\Handling\Tag\Handler\Query\ReadThumbnail;
use MyTube\Data\Business\Entity\Tag;
use MyTube\Data\Business\Repository\TagRepository;
use Reinfi\DependencyInjection\Annotation\InjectDoctrineRepository;
class ReadThumbnailQueryHandler
{
/**
* @InjectDoctrineRepository(
* entityManager="MyTube\Data\Business\Manager\MyTubeEntityManager",
* entity="MyTube\Data\Business\Entity\Tag"
* )
*/
public function __construct(
private readonly TagRepository $tagRepository,
) {
}
public function execute(ReadThumbnailQuery $readThumbnailQuery): ReadThumbnailQueryResult
{
$thumbnailVideo = null;
/** @var Tag $tag */
$tag = $this->tagRepository->findOneBy([
'id' => $readThumbnailQuery->getTagUuid()
]);
$videoCount = $tag->getVideos()->count();
if ($videoCount > 0) {
$thumbnailVideo = $tag->getVideos()[rand(0, $videoCount - 1)];
}
return new ReadThumbnailQueryResult($thumbnailVideo);
}
}

View File

@ -0,0 +1,20 @@
<?php
declare(strict_types=1);
namespace MyTube\Handling\Tag\Handler\Query\ReadThumbnail;
use MyTube\Data\Business\Entity\Video;
class ReadThumbnailQueryResult
{
public function __construct(
private readonly Video $thumbnailVideo
) {
}
public function getThumbnailVideo(): Video
{
return $this->thumbnailVideo;
}
}