diff --git a/app/Producers.php b/app/Producers.php index f46216d8..dd5441c0 100644 --- a/app/Producers.php +++ b/app/Producers.php @@ -72,6 +72,33 @@ public function toSearchableArray(): array ]; } + public function getCollectionSchema(): array + { + return [ + 'name' => $this->searchableAs(), + 'fields' => [ + [ + 'name' => '.*', + 'type' => 'auto', + ], + [ + 'name' => 'titles', + 'type' => 'string', + 'optional' => false, + 'infix' => true, + 'sort' => true + ], + [ + 'name' => 'url', + 'type' => 'string', + 'optional' => false, + 'infix' => true, + 'sort' => true + ], + ] + ]; + } + public function typesenseQueryBy(): array { return [ diff --git a/app/Repositories/DefaultAnimeRepository.php b/app/Repositories/DefaultAnimeRepository.php index ffbf103d..98436297 100644 --- a/app/Repositories/DefaultAnimeRepository.php +++ b/app/Repositories/DefaultAnimeRepository.php @@ -167,19 +167,39 @@ public function getItemsBySeason( $finalFilter['$or'][] = [ // note: this expression only works with mongodb version 5.0.0 or higher '$expr' => [ - '$lte' => [ + '$and' => [ [ - '$dateDiff' => [ - 'startDate' => [ - '$dateFromString' => [ - 'dateString' => '$aired.from' + '$lte' => [ + [ + '$dateDiff' => [ + 'startDate' => [ + '$dateFromString' => [ + 'dateString' => '$aired.from' + ] + ], + 'endDate' => new UTCDateTime($from), + 'unit' => 'month' ] ], - 'endDate' => new UTCDateTime($from), - 'unit' => 'month' - ] + 3 // there are 3 months in a season, so anything that started in 3 months or less will be included + ], ], - 3 // there are 3 months in a season, so anything that started in 3 months or less will be included + [ + '$gt' => [ + [ + '$dateDiff' => [ + 'startDate' => [ + '$dateFromString' => [ + 'dateString' => '$aired.from' + ] + ], + 'endDate' => new UTCDateTime($from), + 'unit' => 'month' + ] + ], + 0 + ] + ] ] ], 'aired.to' => null, diff --git a/tests/Integration/SeasonControllerTest.php b/tests/Integration/SeasonControllerTest.php index 6d6a752e..ffcde268 100644 --- a/tests/Integration/SeasonControllerTest.php +++ b/tests/Integration/SeasonControllerTest.php @@ -190,4 +190,39 @@ public function testShouldNotIncludeContinuingItemsByDefault() $this->assertIsArray($content["data"]); $this->assertCount(2, $content["data"]); } + + public function testShouldNotIncludeNewlyStartedSeasonOfAnimeInPreviousSeasons() + { + Carbon::setTestNow(Carbon::parse("2024-10-26")); + $f = Anime::factory(1); + $startDate = "2024-10-02"; + $carbonStartDate = Carbon::parse($startDate); + $state = $f->serializeStateDefinition([ + "aired" => new CarbonDateRange($carbonStartDate, null) + ]); + $state["aired"]["string"] = "Oct 2, 2024 to ?"; + $state["airing"] = true; + $state["status"] = "Currently Airing"; + $state["premiered"] = "Fall 2024"; + $state["mal_id"] = 54857; + $state["title"] = "Re:Zero kara Hajimeru Isekai Seikatsu 3rd Season"; + $state["episodes"] = 16; + $state["type"] = "TV"; + $state["duration"] = "23 min per ep"; + $state["score"] = 8.9; + $f->create($state); + + $content = $this->getJsonResponse([], "/v4/seasons/now?filter=tv&continuing&page=1"); + $this->seeStatusCode(200); + $this->assertCount(1, $content["data"]); + + $content = $this->getJsonResponse([], "/v4/seasons/2024/summer?filter=tv&continuing&page=1"); + $this->seeStatusCode(200); + $this->assertCount(0, $content["data"]); + + $content = $this->getJsonResponse([], "/v4/seasons/2024/spring?filter=tv&continuing&page=1"); + $this->seeStatusCode(200); + $this->assertCount(0, $content["data"]); + Carbon::setTestNow(); + } }