diff --git a/app/Anime.php b/app/Anime.php index a03c6ab..254c13b 100644 --- a/app/Anime.php +++ b/app/Anime.php @@ -25,7 +25,12 @@ class Anime extends JikanApiSearchableModel * @var array */ protected $fillable = [ - 'mal_id','url','title','title_english','title_japanese','title_synonyms', 'titles', 'images', 'type','source','episodes','status','airing','aired','duration','rating','score','scored_by','rank','popularity','members','favorites','synopsis','background','premiered','broadcast','related','producers','licensors','studios','genres', 'explicit_genres', 'themes', 'demographics', 'opening_themes','ending_themes' + 'mal_id', 'url', 'title', 'title_english', 'title_japanese', 'title_synonyms', + 'titles', 'images', 'type', 'source', 'episodes', 'status', 'airing', 'aired', + 'duration', 'rating', 'score', 'scored_by', 'rank', 'popularity', 'members', + 'favorites', 'synopsis', 'background', 'premiered', 'broadcast', 'related', + 'producers', 'licensors', 'studios', 'genres', 'explicit_genres', 'themes', + 'demographics', 'opening_themes', 'ending_themes', 'trailer', 'approved', 'createdAt', 'modifiedAt' ]; /** @@ -59,12 +64,13 @@ class Anime extends JikanApiSearchableModel public function setSeasonAttribute($value) { - $this->attributes['season'] = $this->getSeasonAttribute(); + // noop + // this attribute is calculated } public function getSeasonAttribute() { - $premiered = $this->attributes['premiered']; + $premiered = array_key_exists('premiered', $this->attributes) ? $this->attributes['premiered'] : null; if (empty($premiered) || is_null($premiered) @@ -79,12 +85,13 @@ class Anime extends JikanApiSearchableModel public function setYearAttribute($value) { - $this->attributes['year'] = $this->getYearAttribute(); + // noop + // this attribute is calculated } public function getYearAttribute() { - $premiered = $this->attributes['premiered']; + $premiered = array_key_exists('premiered', $this->attributes) ? $this->attributes['premiered'] : null; if (empty($premiered) || is_null($premiered) @@ -93,36 +100,18 @@ class Anime extends JikanApiSearchableModel return null; } - return (int) explode(' ', $premiered)[1]; + return (int)explode(' ', $premiered)[1]; } public function setBroadcastAttribute($value) { - $this->attributes['year'] = $this->getBroadcastAttribute(); + $this->attributes['broadcast'] = $this->adaptBroadcastValue($value); } public function getBroadcastAttribute() { if (array_key_exists("broadcast", $this->attributes)) { - $broadcastStr = $this->attributes['broadcast']; - - if (!preg_match('~(.*) at (.*) \(~', $broadcastStr, $matches)) { - return [ - 'day' => null, - 'time' => null, - 'timezone' => null, - 'string' => $broadcastStr - ]; - } - - if (preg_match('~(.*) at (.*) \(~', $broadcastStr, $matches)) { - return [ - 'day' => $matches[1], - 'time' => $matches[2], - 'timezone' => 'Asia/Tokyo', - 'string' => $broadcastStr - ]; - } + return $this->adaptBroadcastValue($this->attributes['broadcast']); } return [ @@ -220,8 +209,8 @@ class Anime extends JikanApiSearchableModel public function toSearchableArray(): array { return [ - 'id' => (string) $this->mal_id, - 'mal_id' => (int) $this->mal_id, + 'id' => (string)$this->mal_id, + 'mal_id' => (int)$this->mal_id, 'start_date' => $this->convertToTimestamp($this->aired['from']), 'end_date' => $this->convertToTimestamp($this->aired['to']), 'title' => $this->title, @@ -293,6 +282,38 @@ class Anime extends JikanApiSearchableModel ]; } + private function adaptBroadcastValue(array|string $broadcast): array + { + if (is_array($broadcast)) { + return $broadcast; + } + + if (!preg_match('~(.*) at (.*) \(~', $broadcast, $matches)) { + return [ + 'day' => null, + 'time' => null, + 'timezone' => null, + 'string' => $broadcast + ]; + } + + if (preg_match('~(.*) at (.*) \(~', $broadcast, $matches)) { + return [ + 'day' => $matches[1], + 'time' => $matches[2], + 'timezone' => 'Asia/Tokyo', + 'string' => $broadcast + ]; + } + + return [ + 'day' => null, + 'time' => null, + 'timezone' => null, + 'string' => null + ]; + } + protected static function newFactory() { return App::make(AnimeFactory::class); diff --git a/app/Character.php b/app/Character.php index 0b7d189..b845474 100644 --- a/app/Character.php +++ b/app/Character.php @@ -19,7 +19,9 @@ class Character extends JikanApiSearchableModel * @var array */ protected $fillable = [ - 'mal_id', 'url', 'name', 'name_kanji', 'nicknames', 'about', 'member_favorites', 'images', 'animeography', 'mangaography', 'voice_actors' + 'mal_id', 'url', 'name', 'name_kanji', 'nicknames', 'about', 'member_favorites', + 'images', 'animeography', 'mangaography', 'voice_actors', + 'createdAt', 'modifiedAt' ]; /** @@ -42,7 +44,7 @@ class Character extends JikanApiSearchableModel * @var array */ protected $hidden = [ - '_id', 'trailer_url', 'premiered', 'opening_themes', 'ending_themes', 'images', 'member_favorites' + '_id', 'trailer_url', 'premiered', 'opening_themes', 'ending_themes', 'member_favorites' ]; public function __construct(array $attributes = []) @@ -57,6 +59,12 @@ class Character extends JikanApiSearchableModel return $this->attributes['member_favorites']; } + /** @noinspection PhpUnused */ + public function getImagesAttribute() + { + return $this->attributes['images']; + } + public static function scrape(int $id) { $data = app('JikanParser')->getCharacter(new CharacterRequest($id)); diff --git a/app/Club.php b/app/Club.php index 05c8cf7..52ae12a 100644 --- a/app/Club.php +++ b/app/Club.php @@ -43,7 +43,7 @@ class Club extends JikanApiSearchableModel * @var array */ protected $hidden = [ - '_id', 'request_hash', 'expiresAt', 'images' + '_id', 'request_hash', 'expiresAt' ]; public function __construct(array $attributes = []) @@ -64,6 +64,12 @@ class Club extends JikanApiSearchableModel return $query->where("access", $value->label); } + /** @noinspection PhpUnused */ + public function getImagesAttribute() + { + return $this->attributes['images']; + } + public static function scrape(int $id) { $data = app('JikanParser')->getClub(new ClubRequest($id)); diff --git a/app/Episode.php b/app/Episode.php index c1e6ddf..cbcb0e1 100644 --- a/app/Episode.php +++ b/app/Episode.php @@ -16,7 +16,8 @@ class Episode extends Model * @var array */ protected $fillable = [ - 'mal_id', 'title', 'title_japanese', 'title_romanji', 'aired', 'filler', 'recap', 'video_url', 'forum_url', 'synopsis' + 'mal_id', 'title', 'title_japanese', 'title_romanji', 'aired', 'filler', 'recap', 'video_url', 'forum_url', 'synopsis', + 'createdAt', 'modifiedAt' ]; /** diff --git a/app/Features/AnimeCharactersLookupHandler.php b/app/Features/AnimeCharactersLookupHandler.php index 4c4d678..405be2a 100644 --- a/app/Features/AnimeCharactersLookupHandler.php +++ b/app/Features/AnimeCharactersLookupHandler.php @@ -16,9 +16,9 @@ use Jikan\Request\Anime\AnimeCharactersAndStaffRequest; */ final class AnimeCharactersLookupHandler extends RequestHandlerWithScraperCache { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new AnimeCharactersResource($results->first()); + return new AnimeCharactersResource($results); } /** diff --git a/app/Features/AnimeEpisodeLookupHandler.php b/app/Features/AnimeEpisodeLookupHandler.php index 67d2795..bbf858d 100644 --- a/app/Features/AnimeEpisodeLookupHandler.php +++ b/app/Features/AnimeEpisodeLookupHandler.php @@ -16,10 +16,10 @@ use Jikan\Request\Anime\AnimeEpisodeRequest; */ final class AnimeEpisodeLookupHandler extends RequestHandlerWithScraperCache { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { return new AnimeEpisodeResource( - $results->first() + $results ); } diff --git a/app/Features/AnimeExternalLookupHandler.php b/app/Features/AnimeExternalLookupHandler.php index 3b086fb..9d91186 100644 --- a/app/Features/AnimeExternalLookupHandler.php +++ b/app/Features/AnimeExternalLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\AnimeExternalLookupCommand; use App\Http\Resources\V4\ExternalLinksResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -13,10 +14,10 @@ use Illuminate\Support\Collection; */ final class AnimeExternalLookupHandler extends ItemLookupHandler { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { return new ExternalLinksResource( - $results->first() + $results ); } diff --git a/app/Features/AnimeForumLookupHandler.php b/app/Features/AnimeForumLookupHandler.php index 942566d..c64ad92 100644 --- a/app/Features/AnimeForumLookupHandler.php +++ b/app/Features/AnimeForumLookupHandler.php @@ -17,10 +17,10 @@ use Jikan\Request\Anime\AnimeForumRequest; */ final class AnimeForumLookupHandler extends RequestHandlerWithScraperCache { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { return new ForumResource( - $results->first() + $results ); } diff --git a/app/Features/AnimeFullLookupHandler.php b/app/Features/AnimeFullLookupHandler.php index 6720235..2baa9b2 100644 --- a/app/Features/AnimeFullLookupHandler.php +++ b/app/Features/AnimeFullLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\AnimeFullLookupCommand; use App\Http\Resources\V4\AnimeFullResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -19,8 +20,8 @@ final class AnimeFullLookupHandler extends ItemLookupHandler return AnimeFullLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new AnimeFullResource($results->first()); + return new AnimeFullResource($results); } } diff --git a/app/Features/AnimeLookupHandler.php b/app/Features/AnimeLookupHandler.php index 3c87b34..2ffe35a 100644 --- a/app/Features/AnimeLookupHandler.php +++ b/app/Features/AnimeLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\AnimeLookupCommand; use App\Http\Resources\V4\AnimeResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -13,9 +14,9 @@ use Illuminate\Support\Collection; */ final class AnimeLookupHandler extends ItemLookupHandler { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new AnimeResource($results->first()); + return new AnimeResource($results); } /** diff --git a/app/Features/AnimeMoreInfoLookupHandler.php b/app/Features/AnimeMoreInfoLookupHandler.php index a192fb4..0bddfc7 100644 --- a/app/Features/AnimeMoreInfoLookupHandler.php +++ b/app/Features/AnimeMoreInfoLookupHandler.php @@ -16,10 +16,10 @@ use Jikan\Request\Anime\AnimeMoreInfoRequest; */ final class AnimeMoreInfoLookupHandler extends RequestHandlerWithScraperCache { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { return new MoreInfoResource( - $results->first() + $results ); } diff --git a/app/Features/AnimePicturesLookupHandler.php b/app/Features/AnimePicturesLookupHandler.php index 1f9d086..338d5b3 100644 --- a/app/Features/AnimePicturesLookupHandler.php +++ b/app/Features/AnimePicturesLookupHandler.php @@ -17,10 +17,10 @@ use Jikan\Request\Anime\AnimePicturesRequest; */ final class AnimePicturesLookupHandler extends RequestHandlerWithScraperCache { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { return new PicturesResource( - $results->first() + $results ); } diff --git a/app/Features/AnimeRecommendationsLookupHandler.php b/app/Features/AnimeRecommendationsLookupHandler.php index 316a8ff..19e3481 100644 --- a/app/Features/AnimeRecommendationsLookupHandler.php +++ b/app/Features/AnimeRecommendationsLookupHandler.php @@ -16,10 +16,10 @@ use Jikan\Request\Anime\AnimeRecommendationsRequest; */ final class AnimeRecommendationsLookupHandler extends RequestHandlerWithScraperCache { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { return new RecommendationsResource( - $results->first() + $results ); } diff --git a/app/Features/AnimeRelationsLookupHandler.php b/app/Features/AnimeRelationsLookupHandler.php index ce09859..499fada 100644 --- a/app/Features/AnimeRelationsLookupHandler.php +++ b/app/Features/AnimeRelationsLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\AnimeRelationsLookupCommand; use App\Http\Resources\V4\AnimeRelationsResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -13,10 +14,10 @@ use Illuminate\Support\Collection; */ final class AnimeRelationsLookupHandler extends ItemLookupHandler { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { return new AnimeRelationsResource( - $results->first() + $results ); } diff --git a/app/Features/AnimeReviewsLookupHandler.php b/app/Features/AnimeReviewsLookupHandler.php index f523a4f..875ffae 100644 --- a/app/Features/AnimeReviewsLookupHandler.php +++ b/app/Features/AnimeReviewsLookupHandler.php @@ -28,9 +28,9 @@ final class AnimeReviewsLookupHandler extends RequestHandlerWithScraperCache return AnimeReviewsLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ReviewsResource($results->first()); + return new ReviewsResource($results); } protected function getScraperData(string $requestFingerPrint, Collection $requestParams): CachedData diff --git a/app/Features/AnimeStaffLookupHandler.php b/app/Features/AnimeStaffLookupHandler.php index a9fd95a..48ea7bc 100644 --- a/app/Features/AnimeStaffLookupHandler.php +++ b/app/Features/AnimeStaffLookupHandler.php @@ -16,9 +16,9 @@ use Jikan\Request\Anime\AnimeCharactersAndStaffRequest; */ final class AnimeStaffLookupHandler extends RequestHandlerWithScraperCache { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new AnimeStaffResource($results->first()); + return new AnimeStaffResource($results); } /** diff --git a/app/Features/AnimeStatsLookupHandler.php b/app/Features/AnimeStatsLookupHandler.php index b28939c..d48277f 100644 --- a/app/Features/AnimeStatsLookupHandler.php +++ b/app/Features/AnimeStatsLookupHandler.php @@ -16,10 +16,10 @@ use Jikan\Request\Anime\AnimeStatsRequest; */ final class AnimeStatsLookupHandler extends RequestHandlerWithScraperCache { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { return new AnimeStatisticsResource( - $results->first() + $results ); } diff --git a/app/Features/AnimeStreamingLookupHandler.php b/app/Features/AnimeStreamingLookupHandler.php index 8e0ca46..33815db 100644 --- a/app/Features/AnimeStreamingLookupHandler.php +++ b/app/Features/AnimeStreamingLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\AnimeStreamingLookupCommand; use App\Http\Resources\V4\StreamingLinksResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -13,10 +14,10 @@ use Illuminate\Support\Collection; */ final class AnimeStreamingLookupHandler extends ItemLookupHandler { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { return new StreamingLinksResource( - $results->first() + $results ); } diff --git a/app/Features/AnimeThemesLookupHandler.php b/app/Features/AnimeThemesLookupHandler.php index 42f94d7..1344ae8 100644 --- a/app/Features/AnimeThemesLookupHandler.php +++ b/app/Features/AnimeThemesLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\AnimeThemesLookupCommand; use App\Http\Resources\V4\AnimeThemesResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -14,10 +15,10 @@ use Illuminate\Support\Collection; final class AnimeThemesLookupHandler extends ItemLookupHandler { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { return new AnimeThemesResource( - $results->first() + $results ); } diff --git a/app/Features/AnimeVideosEpisodesLookupHandler.php b/app/Features/AnimeVideosEpisodesLookupHandler.php index 92c9516..d6b1f06 100644 --- a/app/Features/AnimeVideosEpisodesLookupHandler.php +++ b/app/Features/AnimeVideosEpisodesLookupHandler.php @@ -17,10 +17,10 @@ use Jikan\Request\Anime\AnimeVideosEpisodesRequest; */ final class AnimeVideosEpisodesLookupHandler extends RequestHandlerWithScraperCache { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { return new AnimeEpisodesResource( - $results->first() + $results ); } diff --git a/app/Features/AnimeVideosLookupHandler.php b/app/Features/AnimeVideosLookupHandler.php index 59138c4..cef3919 100644 --- a/app/Features/AnimeVideosLookupHandler.php +++ b/app/Features/AnimeVideosLookupHandler.php @@ -16,10 +16,10 @@ use Jikan\Request\Anime\AnimeVideosRequest; */ final class AnimeVideosLookupHandler extends RequestHandlerWithScraperCache { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { return new AnimeVideosResource( - $results->first() + $results ); } diff --git a/app/Features/CharacterAnimeLookupHandler.php b/app/Features/CharacterAnimeLookupHandler.php index 64ca4b1..bd9c4b2 100644 --- a/app/Features/CharacterAnimeLookupHandler.php +++ b/app/Features/CharacterAnimeLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\CharacterAnimeLookupCommand; use App\Http\Resources\V4\CharacterAnimeCollection; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -13,11 +14,11 @@ use Illuminate\Support\Collection; */ final class CharacterAnimeLookupHandler extends ItemLookupHandler { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { /** @noinspection PhpUndefinedMethodInspection */ return new CharacterAnimeCollection( - $results->offsetGetFirst("animeography") + $results->get("animeography") ); } diff --git a/app/Features/CharacterFullLookupHandler.php b/app/Features/CharacterFullLookupHandler.php index 19df3a5..9f2a130 100644 --- a/app/Features/CharacterFullLookupHandler.php +++ b/app/Features/CharacterFullLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\CharacterFullLookupCommand; use App\Http\Resources\V4\CharacterFullResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -13,9 +14,9 @@ use Illuminate\Support\Collection; */ final class CharacterFullLookupHandler extends ItemLookupHandler { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new CharacterFullResource($results->first()); + return new CharacterFullResource($results); } /** diff --git a/app/Features/CharacterLookupHandler.php b/app/Features/CharacterLookupHandler.php index 003dd34..2789b32 100644 --- a/app/Features/CharacterLookupHandler.php +++ b/app/Features/CharacterLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\CharacterLookupCommand; use App\Http\Resources\V4\CharacterResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -13,9 +14,9 @@ use Illuminate\Support\Collection; */ final class CharacterLookupHandler extends ItemLookupHandler { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new CharacterResource($results->first()); + return new CharacterResource($results); } /** diff --git a/app/Features/CharacterMangaLookupHandler.php b/app/Features/CharacterMangaLookupHandler.php index 3c7a859..cd49c49 100644 --- a/app/Features/CharacterMangaLookupHandler.php +++ b/app/Features/CharacterMangaLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\CharacterMangaLookupCommand; use App\Http\Resources\V4\CharacterMangaCollection; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -13,11 +14,11 @@ use Illuminate\Support\Collection; */ final class CharacterMangaLookupHandler extends ItemLookupHandler { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { /** @noinspection PhpUndefinedMethodInspection */ return new CharacterMangaCollection( - $results->offsetGetFirst("mangaography") + $results->get("mangaography") ); } diff --git a/app/Features/CharacterPicturesLookupHandler.php b/app/Features/CharacterPicturesLookupHandler.php index ec5127e..3d1cd78 100644 --- a/app/Features/CharacterPicturesLookupHandler.php +++ b/app/Features/CharacterPicturesLookupHandler.php @@ -16,9 +16,9 @@ use Jikan\Request\Character\CharacterPicturesRequest; */ final class CharacterPicturesLookupHandler extends RequestHandlerWithScraperCache { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new PicturesResource($results->first()); + return new PicturesResource($results); } /** diff --git a/app/Features/CharacterVoicesLookupHandler.php b/app/Features/CharacterVoicesLookupHandler.php index ac8bf99..8dec4b9 100644 --- a/app/Features/CharacterVoicesLookupHandler.php +++ b/app/Features/CharacterVoicesLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\CharacterVoicesLookupCommand; use App\Http\Resources\V4\CharacterSeiyuuCollection; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -13,11 +14,11 @@ use Illuminate\Support\Collection; */ final class CharacterVoicesLookupHandler extends ItemLookupHandler { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { /** @noinspection PhpUndefinedMethodInspection */ return new CharacterSeiyuuCollection( - $results->offsetGetFirst("voice_actors") + $results->get("voice_actors") ); } diff --git a/app/Features/ClubLookupHandler.php b/app/Features/ClubLookupHandler.php index 71387c9..322f2e2 100644 --- a/app/Features/ClubLookupHandler.php +++ b/app/Features/ClubLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\ClubLookupCommand; use App\Http\Resources\V4\ClubResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -13,9 +14,9 @@ use Illuminate\Support\Collection; */ final class ClubLookupHandler extends ItemLookupHandler { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ClubResource($results->first()); + return new ClubResource($results); } /** diff --git a/app/Features/ClubRelationsLookupHandler.php b/app/Features/ClubRelationsLookupHandler.php index 8bd8494..80152e0 100644 --- a/app/Features/ClubRelationsLookupHandler.php +++ b/app/Features/ClubRelationsLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\ClubRelationLookupCommand; use App\Http\Resources\V4\ClubRelationsResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -13,9 +14,9 @@ use Illuminate\Support\Collection; */ final class ClubRelationsLookupHandler extends ItemLookupHandler { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ClubRelationsResource($results->first()); + return new ClubRelationsResource($results); } /** diff --git a/app/Features/ClubStaffLookupHandler.php b/app/Features/ClubStaffLookupHandler.php index 773fd0d..c702025 100644 --- a/app/Features/ClubStaffLookupHandler.php +++ b/app/Features/ClubStaffLookupHandler.php @@ -3,6 +3,7 @@ namespace App\Features; use App\Dto\ClubStaffLookupCommand; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -13,9 +14,9 @@ use App\Http\Resources\V4\ClubStaffResource; */ final class ClubStaffLookupHandler extends ItemLookupHandler { - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ClubStaffResource($results->first()); + return new ClubStaffResource($results); } /** diff --git a/app/Features/ItemLookupHandler.php b/app/Features/ItemLookupHandler.php index 3d97d64..8088f11 100644 --- a/app/Features/ItemLookupHandler.php +++ b/app/Features/ItemLookupHandler.php @@ -5,6 +5,7 @@ namespace App\Features; use App\Contracts\CachedScraperService; use App\Dto\LookupDataCommand; use App\Contracts\RequestHandler; +use App\Support\CachedData; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\ResourceCollection; use Illuminate\Http\Response; @@ -32,9 +33,9 @@ abstract class ItemLookupHandler implements RequestHandler $requestFingerprint = $request->getFingerPrint(); $results = $this->scraperService->find($request->id, $requestFingerprint); - $resource = $this->resource($results->collect()); + $resource = $this->resource($results); return $resource->response()->addJikanCacheFlags($requestFingerprint, $results); } - protected abstract function resource(Collection $results): JsonResource; + protected abstract function resource(CachedData $results): JsonResource; } diff --git a/app/Features/MangaCharactersLookupHandler.php b/app/Features/MangaCharactersLookupHandler.php index d819165..c1a1998 100644 --- a/app/Features/MangaCharactersLookupHandler.php +++ b/app/Features/MangaCharactersLookupHandler.php @@ -21,9 +21,9 @@ final class MangaCharactersLookupHandler extends RequestHandlerWithScraperCache return MangaCharactersLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new MangaCharactersResource($results->first()); + return new MangaCharactersResource($results); } protected function getScraperData(string $requestFingerPrint, Collection $requestParams): CachedData diff --git a/app/Features/MangaExternalLookupHandler.php b/app/Features/MangaExternalLookupHandler.php index 5a58ec8..f4a4702 100644 --- a/app/Features/MangaExternalLookupHandler.php +++ b/app/Features/MangaExternalLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\MangaExternalLookupCommand; use App\Http\Resources\V4\ExternalLinksResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -18,8 +19,8 @@ final class MangaExternalLookupHandler extends ItemLookupHandler return MangaExternalLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ExternalLinksResource($results->first()); + return new ExternalLinksResource($results); } } diff --git a/app/Features/MangaForumLookupHandler.php b/app/Features/MangaForumLookupHandler.php index 58b8464..bdda736 100644 --- a/app/Features/MangaForumLookupHandler.php +++ b/app/Features/MangaForumLookupHandler.php @@ -21,9 +21,9 @@ final class MangaForumLookupHandler extends RequestHandlerWithScraperCache return MangaForumLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ForumResource($results->first()); + return new ForumResource($results); } protected function getScraperData(string $requestFingerPrint, Collection $requestParams): CachedData diff --git a/app/Features/MangaFullLookupHandler.php b/app/Features/MangaFullLookupHandler.php index 9105bb4..8d983e2 100644 --- a/app/Features/MangaFullLookupHandler.php +++ b/app/Features/MangaFullLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\MangaFullLookupCommand; use App\Http\Resources\V4\MangaFullResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -18,8 +19,8 @@ final class MangaFullLookupHandler extends ItemLookupHandler return MangaFullLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new MangaFullResource($results->first()); + return new MangaFullResource($results); } } diff --git a/app/Features/MangaLookupHandler.php b/app/Features/MangaLookupHandler.php index 523fffa..f87ffe2 100644 --- a/app/Features/MangaLookupHandler.php +++ b/app/Features/MangaLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\MangaLookupCommand; use App\Http\Resources\V4\MangaResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -18,8 +19,8 @@ final class MangaLookupHandler extends ItemLookupHandler return MangaLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new MangaResource($results->first()); + return new MangaResource($results); } } diff --git a/app/Features/MangaMoreInfoLookupHandler.php b/app/Features/MangaMoreInfoLookupHandler.php index f01ed46..8a05133 100644 --- a/app/Features/MangaMoreInfoLookupHandler.php +++ b/app/Features/MangaMoreInfoLookupHandler.php @@ -21,9 +21,9 @@ final class MangaMoreInfoLookupHandler extends RequestHandlerWithScraperCache return MangaMoreInfoLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new MoreInfoResource($results->first()); + return new MoreInfoResource($results); } protected function getScraperData(string $requestFingerPrint, Collection $requestParams): CachedData diff --git a/app/Features/MangaPicturesLookupHandler.php b/app/Features/MangaPicturesLookupHandler.php index 835b822..0db6ceb 100644 --- a/app/Features/MangaPicturesLookupHandler.php +++ b/app/Features/MangaPicturesLookupHandler.php @@ -21,9 +21,9 @@ final class MangaPicturesLookupHandler extends RequestHandlerWithScraperCache return MangaPicturesLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new PicturesResource($results->first()); + return new PicturesResource($results); } protected function getScraperData(string $requestFingerPrint, Collection $requestParams): CachedData diff --git a/app/Features/MangaRecommendationsLookupHandler.php b/app/Features/MangaRecommendationsLookupHandler.php index 639fa4f..336a24c 100644 --- a/app/Features/MangaRecommendationsLookupHandler.php +++ b/app/Features/MangaRecommendationsLookupHandler.php @@ -21,9 +21,9 @@ final class MangaRecommendationsLookupHandler extends RequestHandlerWithScraperC return MangaRecommendationsLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new RecommendationsResource($results->first()); + return new RecommendationsResource($results); } protected function getScraperData(string $requestFingerPrint, Collection $requestParams): CachedData diff --git a/app/Features/MangaRelationsLookupHandler.php b/app/Features/MangaRelationsLookupHandler.php index 247599f..47e761e 100644 --- a/app/Features/MangaRelationsLookupHandler.php +++ b/app/Features/MangaRelationsLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\MangaRelationsLookupCommand; use App\Http\Resources\V4\MangaRelationsResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -18,8 +19,8 @@ final class MangaRelationsLookupHandler extends ItemLookupHandler return MangaRelationsLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new MangaRelationsResource($results->first()); + return new MangaRelationsResource($results); } } diff --git a/app/Features/MangaReviewsLookupHandler.php b/app/Features/MangaReviewsLookupHandler.php index c5a00fa..20561fb 100644 --- a/app/Features/MangaReviewsLookupHandler.php +++ b/app/Features/MangaReviewsLookupHandler.php @@ -24,9 +24,9 @@ final class MangaReviewsLookupHandler extends RequestHandlerWithScraperCache return MangaReviewsLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ReviewsResource($results->first()); + return new ReviewsResource($results); } protected function getScraperData(string $requestFingerPrint, Collection $requestParams): CachedData diff --git a/app/Features/MangaStatsLookupHandler.php b/app/Features/MangaStatsLookupHandler.php index d9878fa..2fcc172 100644 --- a/app/Features/MangaStatsLookupHandler.php +++ b/app/Features/MangaStatsLookupHandler.php @@ -21,9 +21,9 @@ final class MangaStatsLookupHandler extends RequestHandlerWithScraperCache return MangaStatsLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new MangaStatisticsResource($results->first()); + return new MangaStatisticsResource($results); } protected function getScraperData(string $requestFingerPrint, Collection $requestParams): CachedData diff --git a/app/Features/PersonAnimeLookupHandler.php b/app/Features/PersonAnimeLookupHandler.php index 852fcfe..49a74a8 100644 --- a/app/Features/PersonAnimeLookupHandler.php +++ b/app/Features/PersonAnimeLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\PersonAnimeLookupCommand; use App\Http\Resources\V4\PersonAnimeCollection; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Support\Collection; @@ -17,8 +18,8 @@ final class PersonAnimeLookupHandler extends ItemLookupHandler return PersonAnimeLookupCommand::class; } - protected function resource(Collection $results): PersonAnimeCollection + protected function resource(CachedData $results): PersonAnimeCollection { - return new PersonAnimeCollection($results->offsetGetFirst("anime_staff_positions")); + return new PersonAnimeCollection($results->get("anime_staff_positions")); } } diff --git a/app/Features/PersonFullLookupHandler.php b/app/Features/PersonFullLookupHandler.php index fd920ec..1d59f7e 100644 --- a/app/Features/PersonFullLookupHandler.php +++ b/app/Features/PersonFullLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\PersonFullLookupCommand; use App\Http\Resources\V4\PersonFullResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -18,8 +19,8 @@ final class PersonFullLookupHandler extends ItemLookupHandler return PersonFullLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new PersonFullResource($results->first()); + return new PersonFullResource($results); } } diff --git a/app/Features/PersonLookupHandler.php b/app/Features/PersonLookupHandler.php index cb03d0d..ce4ad3f 100644 --- a/app/Features/PersonLookupHandler.php +++ b/app/Features/PersonLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\PersonLookupCommand; use App\Http\Resources\V4\PersonResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -18,8 +19,8 @@ final class PersonLookupHandler extends ItemLookupHandler return PersonLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new PersonResource($results->first()); + return new PersonResource($results); } } diff --git a/app/Features/PersonMangaLookupHandler.php b/app/Features/PersonMangaLookupHandler.php index 838699e..e79e727 100644 --- a/app/Features/PersonMangaLookupHandler.php +++ b/app/Features/PersonMangaLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\PersonMangaLookupCommand; use App\Http\Resources\V4\PersonMangaCollection; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -18,8 +19,8 @@ final class PersonMangaLookupHandler extends ItemLookupHandler return PersonMangaLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new PersonMangaCollection($results->offsetGetFirst("published_manga")); + return new PersonMangaCollection($results->get("published_manga")); } } diff --git a/app/Features/PersonPicturesLookupHandler.php b/app/Features/PersonPicturesLookupHandler.php index 117074e..1505d87 100644 --- a/app/Features/PersonPicturesLookupHandler.php +++ b/app/Features/PersonPicturesLookupHandler.php @@ -21,9 +21,9 @@ final class PersonPicturesLookupHandler extends RequestHandlerWithScraperCache return PersonPicturesLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new PicturesResource($results->first()); + return new PicturesResource($results); } protected function getScraperData(string $requestFingerPrint, Collection $requestParams): CachedData diff --git a/app/Features/PersonVoicesLookupHandler.php b/app/Features/PersonVoicesLookupHandler.php index c5bb2d1..4cd4508 100644 --- a/app/Features/PersonVoicesLookupHandler.php +++ b/app/Features/PersonVoicesLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\PersonVoicesLookupCommand; use App\Http\Resources\V4\PersonVoicesCollection; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -18,8 +19,8 @@ final class PersonVoicesLookupHandler extends ItemLookupHandler return PersonVoicesLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new PersonVoicesCollection($results->offsetGetFirst("voice_acting_roles")); + return new PersonVoicesCollection($results->get("voice_acting_roles")); } } diff --git a/app/Features/ProducerExternalLookupHandler.php b/app/Features/ProducerExternalLookupHandler.php index 9270938..902f92a 100644 --- a/app/Features/ProducerExternalLookupHandler.php +++ b/app/Features/ProducerExternalLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\ProducerExternalLookupCommand; use App\Http\Resources\V4\ExternalLinksResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -18,8 +19,8 @@ final class ProducerExternalLookupHandler extends ItemLookupHandler return ProducerExternalLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ExternalLinksResource($results->first()); + return new ExternalLinksResource($results); } } diff --git a/app/Features/ProducerFullLookupHandler.php b/app/Features/ProducerFullLookupHandler.php index 33147ee..b166029 100644 --- a/app/Features/ProducerFullLookupHandler.php +++ b/app/Features/ProducerFullLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\ProducerFullLookupCommand; use App\Http\Resources\V4\ProducerFullResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -18,8 +19,8 @@ final class ProducerFullLookupHandler extends ItemLookupHandler return ProducerFullLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ProducerFullResource($results->first()); + return new ProducerFullResource($results); } } diff --git a/app/Features/ProducerLookupHandler.php b/app/Features/ProducerLookupHandler.php index a69ada8..711ad71 100644 --- a/app/Features/ProducerLookupHandler.php +++ b/app/Features/ProducerLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\ProducerLookupCommand; use App\Http\Resources\V4\ProducerResource; +use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -18,8 +19,8 @@ final class ProducerLookupHandler extends ItemLookupHandler return ProducerLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ProducerResource($results->first()); + return new ProducerResource($results); } } diff --git a/app/Features/QueryAnimeListOfUserHandler.php b/app/Features/QueryAnimeListOfUserHandler.php index fb2aef6..9d7befc 100644 --- a/app/Features/QueryAnimeListOfUserHandler.php +++ b/app/Features/QueryAnimeListOfUserHandler.php @@ -30,7 +30,7 @@ final class QueryAnimeListOfUserHandler extends RequestHandlerWithScraperCache return $this->renderResponse($requestFingerPrint, $results); } - public function resource(Collection $results): JsonResource + public function resource(CachedData $results): JsonResource { if ($results->isEmpty() || count($results->get("anime")) === 0) { return new UserProfileAnimeListCollection([]); diff --git a/app/Features/QueryMangaListOfUserHandler.php b/app/Features/QueryMangaListOfUserHandler.php index a9497a2..3971a65 100644 --- a/app/Features/QueryMangaListOfUserHandler.php +++ b/app/Features/QueryMangaListOfUserHandler.php @@ -30,13 +30,13 @@ final class QueryMangaListOfUserHandler extends RequestHandlerWithScraperCache return $this->renderResponse($requestFingerPrint, $results); } - public function resource(Collection $results): JsonResource + public function resource(CachedData $results): JsonResource { if ($results->isEmpty()) { return new UserProfileAnimeListCollection([]); } - $listResults = $results->first()['manga']; + $listResults = $results->get("manga"); foreach ($listResults as &$result) { $result = (new UserProfileMangaListResource($result)); } diff --git a/app/Features/QueryRandomPersonHandler.php b/app/Features/QueryRandomPersonHandler.php index fcc1560..9e0d086 100644 --- a/app/Features/QueryRandomPersonHandler.php +++ b/app/Features/QueryRandomPersonHandler.php @@ -21,7 +21,7 @@ final class QueryRandomPersonHandler extends QueryRandomItemHandler protected function resource(Collection $results): JsonResource { return new PersonResource( - $results->first() + $results ); } diff --git a/app/Features/RequestHandlerWithScraperCache.php b/app/Features/RequestHandlerWithScraperCache.php index 4650cdd..62df297 100644 --- a/app/Features/RequestHandlerWithScraperCache.php +++ b/app/Features/RequestHandlerWithScraperCache.php @@ -37,10 +37,10 @@ abstract class RequestHandlerWithScraperCache implements RequestHandler protected abstract function getScraperData(string $requestFingerPrint, Collection $requestParams): CachedData; - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { return new ResultsResource( - $results->first() ?? ["results" => []] + $results->isEmpty() ? ["results" => []] : $results->toArray() ); } @@ -51,8 +51,7 @@ abstract class RequestHandlerWithScraperCache implements RequestHandler */ protected function renderResponse(string $requestFingerPrint, CachedData $results) { - $finalResults = $results->collect(); - $response = $this->resource($finalResults)->response(); + $response = $this->resource($results)->response(); return $response->addJikanCacheFlags($requestFingerPrint, $results); } } diff --git a/app/Features/UserAboutLookupHandler.php b/app/Features/UserAboutLookupHandler.php index 1cde103..bca3824 100644 --- a/app/Features/UserAboutLookupHandler.php +++ b/app/Features/UserAboutLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\UserAboutLookupCommand; use App\Http\Resources\V4\ProfileAboutResource; +use App\Support\CachedData; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -17,8 +18,8 @@ final class UserAboutLookupHandler extends UserLookupHandler return UserAboutLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ProfileAboutResource($results->first()); + return new ProfileAboutResource($results); } } diff --git a/app/Features/UserExternalLookupHandler.php b/app/Features/UserExternalLookupHandler.php index b4f0f77..1c0ee38 100644 --- a/app/Features/UserExternalLookupHandler.php +++ b/app/Features/UserExternalLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\UserExternalLookupCommand; use App\Http\Resources\V4\ExternalLinksResource; +use App\Support\CachedData; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -17,8 +18,8 @@ final class UserExternalLookupHandler extends UserLookupHandler return UserExternalLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ExternalLinksResource($results->first()); + return new ExternalLinksResource($results); } } diff --git a/app/Features/UserFavoritesLookupHandler.php b/app/Features/UserFavoritesLookupHandler.php index db61853..4323b33 100644 --- a/app/Features/UserFavoritesLookupHandler.php +++ b/app/Features/UserFavoritesLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\UserFavoritesLookupCommand; use App\Http\Resources\V4\ProfileFavoritesResource; +use App\Support\CachedData; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -17,8 +18,8 @@ final class UserFavoritesLookupHandler extends UserLookupHandler return UserFavoritesLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ProfileFavoritesResource($results->first()); + return new ProfileFavoritesResource($results); } } diff --git a/app/Features/UserFullLookupHandler.php b/app/Features/UserFullLookupHandler.php index 65463ef..8c6f4d2 100644 --- a/app/Features/UserFullLookupHandler.php +++ b/app/Features/UserFullLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\UserFullLookupCommand; use App\Http\Resources\V4\ProfileFullResource; +use App\Support\CachedData; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -17,8 +18,8 @@ final class UserFullLookupHandler extends UserLookupHandler return UserFullLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ProfileFullResource($results->first()); + return new ProfileFullResource($results); } } diff --git a/app/Features/UserHistoryLookupHandler.php b/app/Features/UserHistoryLookupHandler.php index bf9ecd4..522d3b1 100644 --- a/app/Features/UserHistoryLookupHandler.php +++ b/app/Features/UserHistoryLookupHandler.php @@ -20,9 +20,9 @@ final class UserHistoryLookupHandler extends RequestHandlerWithScraperCache return UserHistoryLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ProfileHistoryResource($results->first()); + return new ProfileHistoryResource($results); } protected function getScraperData(string $requestFingerPrint, Collection $requestParams): CachedData diff --git a/app/Features/UserProfileLookupHandler.php b/app/Features/UserProfileLookupHandler.php index fee379e..1a35771 100644 --- a/app/Features/UserProfileLookupHandler.php +++ b/app/Features/UserProfileLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\UserProfileLookupCommand; use App\Http\Resources\V4\ProfileResource; +use App\Support\CachedData; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -17,8 +18,8 @@ final class UserProfileLookupHandler extends UserLookupHandler return UserProfileLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ProfileResource($results->first()); + return new ProfileResource($results); } } diff --git a/app/Features/UserStatisticsLookupHandler.php b/app/Features/UserStatisticsLookupHandler.php index c00becf..61f235a 100644 --- a/app/Features/UserStatisticsLookupHandler.php +++ b/app/Features/UserStatisticsLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\UserStatisticsLookupCommand; use App\Http\Resources\V4\ProfileStatisticsResource; +use App\Support\CachedData; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -17,8 +18,8 @@ final class UserStatisticsLookupHandler extends UserLookupHandler return UserStatisticsLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ProfileStatisticsResource($results->first()); + return new ProfileStatisticsResource($results); } } diff --git a/app/Features/UserUpdatesLookupHandler.php b/app/Features/UserUpdatesLookupHandler.php index f271dc4..9e359ea 100644 --- a/app/Features/UserUpdatesLookupHandler.php +++ b/app/Features/UserUpdatesLookupHandler.php @@ -4,6 +4,7 @@ namespace App\Features; use App\Dto\UserUpdatesLookupCommand; use App\Http\Resources\V4\ProfileLastUpdatesResource; +use App\Support\CachedData; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Collection; @@ -17,8 +18,8 @@ final class UserUpdatesLookupHandler extends UserLookupHandler return UserUpdatesLookupCommand::class; } - protected function resource(Collection $results): JsonResource + protected function resource(CachedData $results): JsonResource { - return new ProfileLastUpdatesResource($results->first()); + return new ProfileLastUpdatesResource($results); } } diff --git a/app/GenreAnime.php b/app/GenreAnime.php index e41017f..077d841 100644 --- a/app/GenreAnime.php +++ b/app/GenreAnime.php @@ -22,7 +22,8 @@ class GenreAnime extends JikanApiSearchableModel * @var array */ protected $fillable = [ - 'mal_id', 'name', 'url', 'count' + 'mal_id', 'name', 'url', 'count', + 'createdAt', 'modifiedAt' ]; /** diff --git a/app/GenreManga.php b/app/GenreManga.php index 27690da..5a871f8 100644 --- a/app/GenreManga.php +++ b/app/GenreManga.php @@ -22,7 +22,8 @@ class GenreManga extends JikanApiSearchableModel * @var array */ protected $fillable = [ - 'mal_id', 'name', 'url', 'count' + 'mal_id', 'name', 'url', 'count', + 'createdAt', 'modifiedAt' ]; /** diff --git a/app/Magazine.php b/app/Magazine.php index a37b924..aab95eb 100644 --- a/app/Magazine.php +++ b/app/Magazine.php @@ -22,7 +22,8 @@ class Magazine extends JikanApiSearchableModel * @var array */ protected $fillable = [ - 'mal_id', 'name', 'url', 'count' + 'mal_id', 'name', 'url', 'count', + 'createdAt', 'modifiedAt' ]; /** diff --git a/app/Manga.php b/app/Manga.php index 1e68c8d..f2e706c 100644 --- a/app/Manga.php +++ b/app/Manga.php @@ -24,8 +24,11 @@ class Manga extends JikanApiSearchableModel * @var array */ protected $fillable = [ - 'mal_id', 'url', 'title', 'title_english', 'title_japanese', 'title_synonyms', 'titles', 'images', 'status', 'type', 'volumes', 'chapters', 'publishing', 'published', 'rank', 'score', - 'scored_by', 'popularity', 'members', 'favorites', 'synopsis', 'background', 'related', 'genres', 'explicit_genres', 'themes', 'demographics', 'authors', 'serializations', + 'mal_id', 'url', 'title', 'title_english', 'title_japanese', 'title_synonyms', 'titles', + 'images', 'status', 'type', 'volumes', 'chapters', 'publishing', 'published', 'rank', 'score', + 'scored_by', 'popularity', 'members', 'favorites', 'synopsis', 'background', 'related', + 'genres', 'explicit_genres', 'themes', 'demographics', 'authors', 'serializations', + 'createdAt', 'modifiedAt' ]; /** @@ -33,7 +36,7 @@ class Manga extends JikanApiSearchableModel * * @var array */ - protected $appends = []; + protected $appends = ['themes']; /** * The table associated with the model. @@ -149,9 +152,15 @@ class Manga extends JikanApiSearchableModel ]; } - public function getThemesAttribute(): array + /** @noinspection PhpUnused */ + public function getThemesAttribute() { - return []; + $result = []; + if (array_key_exists("themes", $this->attributes)) { + $result = $this->attributes["themes"]; + } + + return $result; } public function typesenseQueryBy(): array diff --git a/app/Person.php b/app/Person.php index 076b0a0..eb7dc97 100644 --- a/app/Person.php +++ b/app/Person.php @@ -19,7 +19,10 @@ class Person extends JikanApiSearchableModel * @var array */ protected $fillable = [ - 'mal_id', 'url', 'images', 'website_url', 'name', 'given_name', 'family_name', 'alternative_names', 'birthday', 'member_favorites', 'about', 'voice_acting_roles', 'anime_staff_positions', 'published_manga' + 'mal_id', 'url', 'images', 'website_url', 'name', 'given_name', 'family_name', + 'alternative_names', 'birthday', 'member_favorites', 'about', 'voice_acting_roles', + 'anime_staff_positions', 'published_manga', + 'createdAt', 'modifiedAt' ]; /** @@ -42,7 +45,7 @@ class Person extends JikanApiSearchableModel * @var array */ protected $hidden = [ - '_id', 'images', 'member_favorites' + '_id', 'member_favorites' ]; public function __construct(array $attributes = []) @@ -51,11 +54,17 @@ class Person extends JikanApiSearchableModel $this->displayNameFieldName = "name"; } + /** @noinspection PhpUnused */ public function getFavoritesAttribute() { return $this->attributes['member_favorites']; } + /** @noinspection PhpUnused */ + public function getImagesAttribute() + { + return $this->attributes['images']; + } public static function scrape(int $id) { diff --git a/app/Producers.php b/app/Producers.php index 093bcfb..f28ee5a 100644 --- a/app/Producers.php +++ b/app/Producers.php @@ -17,7 +17,8 @@ class Producers extends JikanApiSearchableModel * @var array */ protected $fillable = [ - 'mal_id', 'url', 'images', 'titles', 'established', 'favorites', 'about', 'external', 'count' + 'mal_id', 'url', 'images', 'titles', 'established', 'favorites', 'about', 'external', 'count', + 'createdAt', 'modifiedAt' ]; /** diff --git a/app/Profile.php b/app/Profile.php index ba5a486..e3d036e 100644 --- a/app/Profile.php +++ b/app/Profile.php @@ -17,7 +17,9 @@ class Profile extends JikanApiSearchableModel * @var array */ protected $fillable = [ - 'mal_id', 'username', 'url', 'images', 'last_online', 'gender', 'birthday', 'location', 'joined', 'anime_stats', 'manga_stats', 'favorites', 'about' + 'mal_id', 'username', 'url', 'images', 'last_online', 'gender', 'birthday', 'location', + 'joined', 'anime_stats', 'manga_stats', 'favorites', 'about', + 'createdAt', 'modifiedAt' ]; /** diff --git a/app/Services/DefaultCachedScraperService.php b/app/Services/DefaultCachedScraperService.php index 1a31709..cfc1e2b 100644 --- a/app/Services/DefaultCachedScraperService.php +++ b/app/Services/DefaultCachedScraperService.php @@ -83,7 +83,7 @@ final class DefaultCachedScraperService implements CachedScraperService $results = $this->dbResultSetToCachedData($dbResults); if ($results->isEmpty() || $results->isExpired()) { - $scraperResponse = $this->repository->scrape($key); + $scraperResponse = $this->repository->scrape($val); $this->raiseNotFoundIfErrors($scraperResponse); @@ -93,8 +93,7 @@ final class DefaultCachedScraperService implements CachedScraperService if ($results->isEmpty()) { $this->repository->insert($response); } - - if ($results->isExpired()) { + else if ($results->isExpired()) { $this->repository->where($key, $val)->update($response); } @@ -156,8 +155,7 @@ final class DefaultCachedScraperService implements CachedScraperService if ($results->isEmpty()) { $this->repository->insert($response); } - - if ($results->isExpired()) { + else if ($results->isExpired()) { $this->repository->queryByMalId($id)->update($response); } diff --git a/app/Support/CachedData.php b/app/Support/CachedData.php index f2eb1e7..e54351d 100644 --- a/app/Support/CachedData.php +++ b/app/Support/CachedData.php @@ -2,15 +2,24 @@ namespace App\Support; -use App\Concerns\ScraperCacheTtl; use App\JikanApiModel; +use ArrayAccess; use Illuminate\Support\Carbon; use Illuminate\Support\Collection; -use Illuminate\Support\Env; +use Illuminate\Support\Traits\ForwardsCalls; +use Illuminate\Support\Traits\Macroable; use MongoDB\BSON\UTCDateTime; -final class CachedData +/** + * A class to represent cached scraper results. This is just a fancy collection which knows about + * cache ttl and whether the data is expired in the cache or not. + */ +final class CachedData implements ArrayAccess { + use ForwardsCalls, Macroable { + __call as macroCall; + } + private int $cacheTimeToLive; private function __construct( @@ -21,6 +30,11 @@ final class CachedData $this->cacheTimeToLive = $cacheTtl; } + /** + * @param Collection $scraperResult Always a collection which has the result from the scraper wrapped under a key + * or a document from the db. + * @return static + */ public static function from(Collection $scraperResult): self { return new self($scraperResult, app(CacheOptions::class)->ttl()); @@ -41,16 +55,6 @@ final class CachedData return $this->scraperResult; } - public function offsetGet(string $key): mixed - { - return $this->scraperResult->offsetGet($key); - } - - public function offsetSet(string $key, mixed $value): void - { - $this->scraperResult->offsetSet($key, $value); - } - public function isEmpty(): bool { return $this->scraperResult->isEmpty(); @@ -98,9 +102,52 @@ final class CachedData return $this->mixedToTimestamp($modifiedAt); } + if (null !== $modifiedAt = $result->get("updated_at")) { + return $this->mixedToTimestamp($modifiedAt); + } + return null; } + /** + * Dynamically get elements by key from the underlying scraper result collection. + * Additionally, this will add support for DelegatesToResource trait which is used by JsonResource class, + * making the instances of this class passable as ctor arg for laravel resources. + * @param string|int $key + * @return \Closure|null + */ + public function __get(string|int $key) + { + return $this->scraperResult->get($key); + } + + /** + * Determine if an element with the specified key exists in the underlying scraper result collection. + * Additionally, this will add support for DelegatesToResource trait which is used by JsonResource class, + * making the instance of this class passable as ctor arg for laravel resources. + * @param string|int $key + * @return bool + */ + public function __isset(string|int $key) + { + return $this->scraperResult->has($key); + } + + /** + * Dynamically pass method calls to the underlying scraper result collection. + * @param $method + * @param $parameters + * @return mixed + */ + public function __call($method, $parameters) + { + if (self::hasMacro($method)) { + return $this->macroCall($method, $parameters); + } + + return $this->forwardCallTo($this->scraperResult, $method, $parameters); + } + private function mixedToTimestamp(mixed $modifiedAt): ?int { if ($modifiedAt instanceof UTCDateTime) { @@ -115,4 +162,24 @@ final class CachedData return null; } + + public function offsetExists(mixed $offset): bool + { + return $this->scraperResult->offsetExists($offset); + } + + public function offsetGet(mixed $offset): mixed + { + return $this->scraperResult->offsetGet($offset); + } + + public function offsetSet(mixed $offset, mixed $value): void + { + // noop, readonly + } + + public function offsetUnset(mixed $offset): void + { + // noop, readonly + } } diff --git a/tests/Integration/AnimeSearchEndpointTest.php b/tests/Integration/AnimeSearchEndpointTest.php index a585429..6de320c 100644 --- a/tests/Integration/AnimeSearchEndpointTest.php +++ b/tests/Integration/AnimeSearchEndpointTest.php @@ -45,7 +45,7 @@ class AnimeSearchEndpointTest extends TestCase { return [ "query string = `?limit=5`" => [ - [5, []] + 5, [] ], "query string = `?limit=5&type=tv`" => [5, ["type" => "tv"]], "query string = `?limit=5&type=tv&min_score=7`" => [