tag sorting, and tag thumbnail
This commit is contained in:
parent
caff0ec71f
commit
9e3e2ce15d
9
src/ApiDomain/External/Tag/config/routes.php
vendored
9
src/ApiDomain/External/Tag/config/routes.php
vendored
@ -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,
|
||||||
|
],
|
||||||
|
],
|
||||||
];
|
];
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
58
src/ApiDomain/External/Tag/src/Handler/ReadThumbnailHandler.php
vendored
Normal file
58
src/ApiDomain/External/Tag/src/Handler/ReadThumbnailHandler.php
vendored
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
15
src/ApiDomain/External/Tag/src/ResponseFormatter/ReadThumbnailResponseFormatter.php
vendored
Normal file
15
src/ApiDomain/External/Tag/src/ResponseFormatter/ReadThumbnailResponseFormatter.php
vendored
Normal 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 [];
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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,
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user