jikan-rest/app/Features/QueryCurrentAnimeSeasonHandler.php

61 lines
1.7 KiB
PHP
Raw Normal View History

<?php
namespace App\Features;
use App\Contracts\RequestHandler;
use App\Dto\QueryCurrentAnimeSeasonCommand;
use App\Enums\AnimeSeasonEnum;
use App\Enums\AnimeTypeEnum;
use Exception;
use Illuminate\Contracts\Database\Query\Builder;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Carbon;
/**
* @implements RequestHandler<QueryCurrentAnimeSeasonCommand, JsonResponse>
*/
final class QueryCurrentAnimeSeasonHandler extends QueryAnimeSeasonHandlerBase
{
public function requestClass(): string
{
return QueryCurrentAnimeSeasonCommand::class;
}
/**
* @return array
* @throws Exception
*/
private function getCurrentSeason() : array
{
$date = new \DateTime('now', new \DateTimeZone('Asia/Tokyo'));
$year = (int) $date->format('Y');
$month = (int) $date->format('n');
return match ($month) {
2023-01-27 22:19:31 +00:00
1, 2, 3 => [AnimeSeasonEnum::winter(), $year],
4, 5, 6 => [AnimeSeasonEnum::spring(), $year],
7, 8, 9 => [AnimeSeasonEnum::summer(), $year],
10, 11, 12 => [AnimeSeasonEnum::fall(), $year],
default => throw new Exception('Could not generate seasonal string'),
};
}
/**
* @throws Exception
*/
2023-10-24 09:27:35 +05:00
protected function getSeasonItems($request, ?AnimeTypeEnum $type): Builder
{
[$season, $year] = $this->getCurrentSeason();
/**
* @var Carbon $from
* @var Carbon $to
*/
2023-01-27 22:19:31 +00:00
[$from, $to] = $this->getSeasonRange($year, $season);
2023-10-24 09:27:35 +05:00
$premiered = ucfirst($season)." {$year}";
$includeContinuingItems = $request->continuing;
2023-10-24 09:27:35 +05:00
return $this->repository->getItemsBySeason($from, $to, $type, $premiered, $includeContinuingItems);
}
}