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\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,
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
@ -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,
|
||||
|
||||
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,
|
||||
): 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) {
|
||||
$query = '%'.$query.'%';
|
||||
|
||||
$queryBuilder
|
||||
->where('t.description like :query')
|
||||
->where('t.description LIKE :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\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,
|
||||
],
|
||||
];
|
||||
|
||||
@ -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