From 8d67c115d7ab483071ff5f03946061e6ad4a1ee8 Mon Sep 17 00:00:00 2001 From: Irfan Date: Sat, 21 Oct 2023 09:45:51 +0500 Subject: [PATCH 1/5] bugfix: only allow results that are within specified season/year and nulls --- app/Contracts/AnimeRepository.php | 5 ++++- app/Features/QueryAnimeSeasonHandlerBase.php | 6 ++++-- .../QueryCurrentAnimeSeasonHandler.php | 4 ++-- .../QuerySpecificAnimeSeasonHandler.php | 5 +++-- .../QueryUpcomingAnimeSeasonHandler.php | 3 ++- app/Repositories/DefaultAnimeRepository.php | 20 ++++++++++++++++--- 6 files changed, 32 insertions(+), 11 deletions(-) diff --git a/app/Contracts/AnimeRepository.php b/app/Contracts/AnimeRepository.php index b4d6d5c2..c9dca834 100644 --- a/app/Contracts/AnimeRepository.php +++ b/app/Contracts/AnimeRepository.php @@ -4,6 +4,7 @@ use App\Anime; use App\Enums\AnimeScheduleFilterEnum; +use App\Enums\AnimeSeasonEnum; use App\Enums\AnimeTypeEnum; use Illuminate\Contracts\Database\Query\Builder as EloquentBuilder; use Illuminate\Support\Carbon; @@ -41,7 +42,9 @@ public function getCurrentlyAiring( public function getAiredBetween( Carbon $from, Carbon $to, - ?AnimeTypeEnum $type = null + ?AnimeTypeEnum $type = null, + ?AnimeSeasonEnum $season = null, + ?int $year = null ): EloquentBuilder; public function getUpcomingSeasonItems(?AnimeTypeEnum $type = null): EloquentBuilder; diff --git a/app/Features/QueryAnimeSeasonHandlerBase.php b/app/Features/QueryAnimeSeasonHandlerBase.php index 67a8cedf..b4627b9b 100644 --- a/app/Features/QueryAnimeSeasonHandlerBase.php +++ b/app/Features/QueryAnimeSeasonHandlerBase.php @@ -32,7 +32,9 @@ public function handle($request): JsonResponse { $requestParams = collect($request->all()); $type = $requestParams->has("filter") ? $request->filter : null; - $results = $this->getSeasonItems($request, $type); + $season = $requestParams->has("season") ? $request->season : null; + $year = $requestParams->has("year") ? $request->year : null; + $results = $this->getSeasonItems($request, $type, $season, $year); // apply sfw, kids and unapproved filters /** @noinspection PhpUndefinedMethodInspection */ $results = $results->filter($requestParams); @@ -49,7 +51,7 @@ public function handle($request): JsonResponse * @param ?AnimeTypeEnum $type * @return Builder */ - protected abstract function getSeasonItems($request, ?AnimeTypeEnum $type): Builder; + protected abstract function getSeasonItems($request, ?AnimeTypeEnum $type, ?AnimeSeasonEnum $season, ?int $year): Builder; protected function getSeasonRange(int $year, AnimeSeasonEnum $season): array { diff --git a/app/Features/QueryCurrentAnimeSeasonHandler.php b/app/Features/QueryCurrentAnimeSeasonHandler.php index 92353037..f4f2d426 100644 --- a/app/Features/QueryCurrentAnimeSeasonHandler.php +++ b/app/Features/QueryCurrentAnimeSeasonHandler.php @@ -44,7 +44,7 @@ private function getCurrentSeason() : array /** * @throws Exception */ - protected function getSeasonItems($request, ?AnimeTypeEnum $type): Builder + protected function getSeasonItems($request, ?AnimeTypeEnum $type, ?AnimeSeasonEnum $season, ?int $year): Builder { [$season, $year] = $this->getCurrentSeason(); /** @@ -52,6 +52,6 @@ protected function getSeasonItems($request, ?AnimeTypeEnum $type): Builder * @var Carbon $to */ [$from, $to] = $this->getSeasonRange($year, $season); - return $this->repository->getAiredBetween($from, $to, $type); + return $this->repository->getAiredBetween($from, $to, $type, $season, $year); } } diff --git a/app/Features/QuerySpecificAnimeSeasonHandler.php b/app/Features/QuerySpecificAnimeSeasonHandler.php index 5aa2f48b..ed731b84 100644 --- a/app/Features/QuerySpecificAnimeSeasonHandler.php +++ b/app/Features/QuerySpecificAnimeSeasonHandler.php @@ -3,6 +3,7 @@ namespace App\Features; use App\Dto\QuerySpecificAnimeSeasonCommand; +use App\Enums\AnimeSeasonEnum; use App\Enums\AnimeStatusEnum; use App\Enums\AnimeTypeEnum; use Illuminate\Contracts\Database\Query\Builder; @@ -18,7 +19,7 @@ public function requestClass(): string return QuerySpecificAnimeSeasonCommand::class; } - protected function getSeasonItems($request, ?AnimeTypeEnum $type): Builder + protected function getSeasonItems($request, ?AnimeTypeEnum $type, ?AnimeSeasonEnum $season, ?int $year): Builder { /** * @var Carbon $from @@ -27,7 +28,7 @@ protected function getSeasonItems($request, ?AnimeTypeEnum $type): Builder [$from, $to] = $this->getSeasonRange($request->year, $request->season); - return $this->repository->getAiredBetween($from, $to, $type); + return $this->repository->getAiredBetween($from, $to, $type, $request->season, $request->year); // ->where("status", "!=", AnimeStatusEnum::upcoming()->label); } } diff --git a/app/Features/QueryUpcomingAnimeSeasonHandler.php b/app/Features/QueryUpcomingAnimeSeasonHandler.php index 88c8831d..7086e9fa 100644 --- a/app/Features/QueryUpcomingAnimeSeasonHandler.php +++ b/app/Features/QueryUpcomingAnimeSeasonHandler.php @@ -3,6 +3,7 @@ namespace App\Features; use App\Dto\QueryUpcomingAnimeSeasonCommand; +use App\Enums\AnimeSeasonEnum; use App\Enums\AnimeTypeEnum; use Illuminate\Contracts\Database\Query\Builder; @@ -16,7 +17,7 @@ public function requestClass(): string return QueryUpcomingAnimeSeasonCommand::class; } - protected function getSeasonItems($request, ?AnimeTypeEnum $type): Builder + protected function getSeasonItems($request, ?AnimeTypeEnum $type, ?AnimeSeasonEnum $season, ?int $year): Builder { return $this->repository->getUpcomingSeasonItems($type); } diff --git a/app/Repositories/DefaultAnimeRepository.php b/app/Repositories/DefaultAnimeRepository.php index 91ac44a6..3c1937d1 100644 --- a/app/Repositories/DefaultAnimeRepository.php +++ b/app/Repositories/DefaultAnimeRepository.php @@ -7,6 +7,7 @@ use App\Contracts\Repository; use App\Enums\AnimeRatingEnum; use App\Enums\AnimeScheduleFilterEnum; +use App\Enums\AnimeSeasonEnum; use App\Enums\AnimeStatusEnum; use App\Enums\AnimeTypeEnum; use Illuminate\Contracts\Database\Query\Builder as EloquentBuilder; @@ -115,7 +116,9 @@ public function getCurrentlyAiring( public function getAiredBetween( Carbon $from, Carbon $to, - ?AnimeTypeEnum $type = null + ?AnimeTypeEnum $type = null, + ?AnimeSeasonEnum $season = null, + ?int $year = null ): EloquentBuilder { // $queryable = $this->queryable(true)->whereBetween("aired.from", [ @@ -124,7 +127,17 @@ public function getAiredBetween( // ]); /** @noinspection PhpParamsInspection */ - $queryable = $this->queryable(true)->whereRaw([ + $queryable = $this->queryable(true); + + if (!is_null($season) && !is_null($year)) { + $premiered = ucfirst($season)." {$year}"; + $queryable = $this->queryable() + ->where("premiered", null) + ->orWhere("premiered", $premiered); + } + + $queryable = $this->queryable() + ->whereRaw([ "aired.from" => [ '$gte' => $from->toAtomString(), '$lte' => $to->modify("last day of this month")->toAtomString() @@ -139,7 +152,8 @@ public function getAiredBetween( } public function getUpcomingSeasonItems( - ?AnimeTypeEnum $type = null + ?AnimeTypeEnum $type = null, + ?AnimeSeasonEnum $specificSeason = null ): EloquentBuilder { $queryable = $this->queryable(true)->where("status", AnimeStatusEnum::upcoming()->label); From 657510bf9fa7588d20cf5606c18ed94e070b8c60 Mon Sep 17 00:00:00 2001 From: Irfan Date: Tue, 24 Oct 2023 09:27:35 +0500 Subject: [PATCH 2/5] review: changes --- app/Contracts/AnimeRepository.php | 3 +-- app/Features/QueryAnimeSeasonHandlerBase.php | 2 +- app/Features/QueryCurrentAnimeSeasonHandler.php | 6 ++++-- app/Features/QuerySpecificAnimeSeasonHandler.php | 5 +++-- app/Features/QueryUpcomingAnimeSeasonHandler.php | 2 +- app/Repositories/DefaultAnimeRepository.php | 9 +++------ 6 files changed, 13 insertions(+), 14 deletions(-) diff --git a/app/Contracts/AnimeRepository.php b/app/Contracts/AnimeRepository.php index c9dca834..c0d734a7 100644 --- a/app/Contracts/AnimeRepository.php +++ b/app/Contracts/AnimeRepository.php @@ -43,8 +43,7 @@ public function getAiredBetween( Carbon $from, Carbon $to, ?AnimeTypeEnum $type = null, - ?AnimeSeasonEnum $season = null, - ?int $year = null + ?string $premiered = null ): EloquentBuilder; public function getUpcomingSeasonItems(?AnimeTypeEnum $type = null): EloquentBuilder; diff --git a/app/Features/QueryAnimeSeasonHandlerBase.php b/app/Features/QueryAnimeSeasonHandlerBase.php index b4627b9b..df065526 100644 --- a/app/Features/QueryAnimeSeasonHandlerBase.php +++ b/app/Features/QueryAnimeSeasonHandlerBase.php @@ -51,7 +51,7 @@ public function handle($request): JsonResponse * @param ?AnimeTypeEnum $type * @return Builder */ - protected abstract function getSeasonItems($request, ?AnimeTypeEnum $type, ?AnimeSeasonEnum $season, ?int $year): Builder; + protected abstract function getSeasonItems($request, ?AnimeTypeEnum $type): Builder; protected function getSeasonRange(int $year, AnimeSeasonEnum $season): array { diff --git a/app/Features/QueryCurrentAnimeSeasonHandler.php b/app/Features/QueryCurrentAnimeSeasonHandler.php index f4f2d426..da7d427e 100644 --- a/app/Features/QueryCurrentAnimeSeasonHandler.php +++ b/app/Features/QueryCurrentAnimeSeasonHandler.php @@ -44,7 +44,7 @@ private function getCurrentSeason() : array /** * @throws Exception */ - protected function getSeasonItems($request, ?AnimeTypeEnum $type, ?AnimeSeasonEnum $season, ?int $year): Builder + protected function getSeasonItems($request, ?AnimeTypeEnum $type): Builder { [$season, $year] = $this->getCurrentSeason(); /** @@ -52,6 +52,8 @@ protected function getSeasonItems($request, ?AnimeTypeEnum $type, ?AnimeSeasonEn * @var Carbon $to */ [$from, $to] = $this->getSeasonRange($year, $season); - return $this->repository->getAiredBetween($from, $to, $type, $season, $year); + $premiered = ucfirst($season)." {$year}"; + + return $this->repository->getAiredBetween($from, $to, $type, $premiered); } } diff --git a/app/Features/QuerySpecificAnimeSeasonHandler.php b/app/Features/QuerySpecificAnimeSeasonHandler.php index ed731b84..f133c301 100644 --- a/app/Features/QuerySpecificAnimeSeasonHandler.php +++ b/app/Features/QuerySpecificAnimeSeasonHandler.php @@ -19,7 +19,7 @@ public function requestClass(): string return QuerySpecificAnimeSeasonCommand::class; } - protected function getSeasonItems($request, ?AnimeTypeEnum $type, ?AnimeSeasonEnum $season, ?int $year): Builder + protected function getSeasonItems($request, ?AnimeTypeEnum $type): Builder { /** * @var Carbon $from @@ -27,8 +27,9 @@ protected function getSeasonItems($request, ?AnimeTypeEnum $type, ?AnimeSeasonEn */ [$from, $to] = $this->getSeasonRange($request->year, $request->season); + $premiered = ucfirst($request->season)." {$request->year}"; - return $this->repository->getAiredBetween($from, $to, $type, $request->season, $request->year); + return $this->repository->getAiredBetween($from, $to, $type, $premiered); // ->where("status", "!=", AnimeStatusEnum::upcoming()->label); } } diff --git a/app/Features/QueryUpcomingAnimeSeasonHandler.php b/app/Features/QueryUpcomingAnimeSeasonHandler.php index 7086e9fa..b39583af 100644 --- a/app/Features/QueryUpcomingAnimeSeasonHandler.php +++ b/app/Features/QueryUpcomingAnimeSeasonHandler.php @@ -17,7 +17,7 @@ public function requestClass(): string return QueryUpcomingAnimeSeasonCommand::class; } - protected function getSeasonItems($request, ?AnimeTypeEnum $type, ?AnimeSeasonEnum $season, ?int $year): Builder + protected function getSeasonItems($request, ?AnimeTypeEnum $type): Builder { return $this->repository->getUpcomingSeasonItems($type); } diff --git a/app/Repositories/DefaultAnimeRepository.php b/app/Repositories/DefaultAnimeRepository.php index 3c1937d1..d7eb401e 100644 --- a/app/Repositories/DefaultAnimeRepository.php +++ b/app/Repositories/DefaultAnimeRepository.php @@ -117,8 +117,7 @@ public function getAiredBetween( Carbon $from, Carbon $to, ?AnimeTypeEnum $type = null, - ?AnimeSeasonEnum $season = null, - ?int $year = null + ?string $premiered = null ): EloquentBuilder { // $queryable = $this->queryable(true)->whereBetween("aired.from", [ @@ -129,8 +128,7 @@ public function getAiredBetween( /** @noinspection PhpParamsInspection */ $queryable = $this->queryable(true); - if (!is_null($season) && !is_null($year)) { - $premiered = ucfirst($season)." {$year}"; + if ($premiered !== null) { $queryable = $this->queryable() ->where("premiered", null) ->orWhere("premiered", $premiered); @@ -152,8 +150,7 @@ public function getAiredBetween( } public function getUpcomingSeasonItems( - ?AnimeTypeEnum $type = null, - ?AnimeSeasonEnum $specificSeason = null + ?AnimeTypeEnum $type = null ): EloquentBuilder { $queryable = $this->queryable(true)->where("status", AnimeStatusEnum::upcoming()->label); From dc22e6b28025ee845028756372ca128ffd9e0241 Mon Sep 17 00:00:00 2001 From: Irfan Date: Tue, 24 Oct 2023 09:29:24 +0500 Subject: [PATCH 3/5] review: fix --- app/Features/QueryAnimeSeasonHandlerBase.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Features/QueryAnimeSeasonHandlerBase.php b/app/Features/QueryAnimeSeasonHandlerBase.php index df065526..778cd07e 100644 --- a/app/Features/QueryAnimeSeasonHandlerBase.php +++ b/app/Features/QueryAnimeSeasonHandlerBase.php @@ -34,7 +34,7 @@ public function handle($request): JsonResponse $type = $requestParams->has("filter") ? $request->filter : null; $season = $requestParams->has("season") ? $request->season : null; $year = $requestParams->has("year") ? $request->year : null; - $results = $this->getSeasonItems($request, $type, $season, $year); + $results = $this->getSeasonItems($request, $type); // apply sfw, kids and unapproved filters /** @noinspection PhpUndefinedMethodInspection */ $results = $results->filter($requestParams); From bca36fcf1e6efba127c3a40ea6e57e704edcdd10 Mon Sep 17 00:00:00 2001 From: Irfan Date: Sat, 28 Oct 2023 14:01:02 +0500 Subject: [PATCH 4/5] re-use $queryable --- app/Repositories/DefaultAnimeRepository.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Repositories/DefaultAnimeRepository.php b/app/Repositories/DefaultAnimeRepository.php index d7eb401e..38bd4325 100644 --- a/app/Repositories/DefaultAnimeRepository.php +++ b/app/Repositories/DefaultAnimeRepository.php @@ -129,12 +129,12 @@ public function getAiredBetween( $queryable = $this->queryable(true); if ($premiered !== null) { - $queryable = $this->queryable() + $queryable = $queryable ->where("premiered", null) ->orWhere("premiered", $premiered); } - $queryable = $this->queryable() + $queryable = $queryable ->whereRaw([ "aired.from" => [ '$gte' => $from->toAtomString(), From e758f001dc2ae66cbe41d3b0a0d3cf717177a3f9 Mon Sep 17 00:00:00 2001 From: Irfan Date: Sat, 4 Nov 2023 04:17:34 +0500 Subject: [PATCH 5/5] Update QueryUpcomingAnimeSeasonHandler.php --- app/Features/QueryUpcomingAnimeSeasonHandler.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Features/QueryUpcomingAnimeSeasonHandler.php b/app/Features/QueryUpcomingAnimeSeasonHandler.php index b39583af..88c8831d 100644 --- a/app/Features/QueryUpcomingAnimeSeasonHandler.php +++ b/app/Features/QueryUpcomingAnimeSeasonHandler.php @@ -3,7 +3,6 @@ namespace App\Features; use App\Dto\QueryUpcomingAnimeSeasonCommand; -use App\Enums\AnimeSeasonEnum; use App\Enums\AnimeTypeEnum; use Illuminate\Contracts\Database\Query\Builder;