add v3 Anime backwards compatibility

This commit is contained in:
Irfan 2020-09-12 08:33:37 +05:00
parent 7d20c4efa3
commit 254fb9122d
17 changed files with 1059 additions and 41 deletions

View File

@ -2,7 +2,20 @@
namespace App\Http\Controllers\V3;
use App\Anime;
use App\Http\HttpHelper;
use App\Http\HttpResponse;
use App\Http\Resources\V3\AnimeEpisodesResource;
use App\Http\Resources\V4\AnimeCharactersResource;
use App\Http\Resources\V4\AnimeStatisticsResource;
use App\Http\Resources\V4\AnimeVideosResource;
use App\Http\Resources\V4\ForumResource;
use App\Http\Resources\V4\MoreInfoResource;
use App\Http\Resources\V4\PicturesResource;
use App\Http\Resources\V4\RecommendationsResource;
use App\Http\Resources\V4\ResultsResource;
use App\Http\Resources\V4\ReviewsResource;
use App\Http\Resources\V4\UserUpdatesResource;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Jikan\Request\Anime\AnimeCharactersAndStaffRequest;
@ -17,82 +30,434 @@ use Jikan\Request\Anime\AnimeRequest;
use Jikan\Request\Anime\AnimeReviewsRequest;
use Jikan\Request\Anime\AnimeStatsRequest;
use Jikan\Request\Anime\AnimeVideosRequest;
use MongoDB\BSON\UTCDateTime;
class AnimeController extends Controller
{
public function main(int $id)
public function main(Request $request, int $id)
{
$anime = $this->jikan->getAnime(new AnimeRequest($id));
return response($this->serializer->serialize($anime, 'json'));
$results = Anime::query()
->where('mal_id', $id)
->get();
$isExpired = $this->isExpired($request, $results);
$expiryTtl = $this->getExpiryTtl($request, $results);
$cached = true;
if (
$results->isEmpty()
|| $isExpired
) {
$cached = false;
$response = Anime::scrape($id);
if (HttpHelper::hasError($response)) {
return HttpResponse::notFound($request);
}
if ($results->isEmpty()) {
$meta = [
'createdAt' => new UTCDateTime(),
'modifiedAt' => new UTCDateTime(),
'request_hash' => $this->fingerprint
];
}
$meta['modifiedAt'] = new UTCDateTime();
$response = $meta + $response;
if ($results->isEmpty()) {
Anime::query()
->insert($response);
}
if ($isExpired) {
Anime::query()
->where('request_hash', $this->fingerprint)
->update($response);
}
$results = Anime::query()
->where('mal_id', $id)
->get();
}
if ($results->isEmpty()) {
return HttpResponse::notFound($request);
}
$response = (new \App\Http\Resources\V3\AnimeResource(
$results->first()
))->toArray($request);
return $this->prepareResponse(
response(
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
),
$results,
$request
);
}
public function characters_staff(int $id)
public function characters_staff(Request $request, int $id)
{
$anime = $this->jikan->getAnimeCharactersAndStaff(new AnimeCharactersAndStaffRequest($id));
return response($this->serializer->serialize($anime, 'json'));
$results = DB::table($this->getRouteTable($request))
->where('request_hash', $this->fingerprint)
->get();
$isExpired = $this->isExpired($request, $results);
$expiryTtl = $this->getExpiryTtl($request, $results);
$cached = true;
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$anime = $this->jikan->getAnimeCharactersAndStaff(new AnimeCharactersAndStaffRequest($id));
$response = \json_decode($this->serializer->serialize($anime, 'json'), true);
$results = $this->updateCache($request, $results, $response);
}
$response = (new \App\Http\Resources\V3\AnimeCharactersStaffResource(
$results->first()
))->toArray($request);
return $this->prepareResponse(
response(
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
),
$results,
$request
);
}
public function episodes(int $id, int $page = 1)
public function episodes(Request $request, int $id, int $page = 1)
{
$anime = $this->jikan->getAnimeEpisodes(new AnimeEpisodesRequest($id, $page));
return response($this->serializer->serialize($anime, 'json'));
$results = DB::table($this->getRouteTable($request))
->where('request_hash', $this->fingerprint)
->get();
$expiryTtl = $this->getExpiryTtl($request, $results);
$cached = true;
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$page = $request->get('page') ?? 1;
$anime = $this->jikan->getAnimeEpisodes(new AnimeEpisodesRequest($id, $page));
$response = \json_decode($this->serializer->serialize($anime, 'json'), true);
$results = $this->updateCache($request, $results, $response);
}
$response = (new \App\Http\Resources\V3\AnimeEpisodesResource(
$results->first()
))->toArray($request);
return $this->prepareResponse(
response(
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
),
$results,
$request
);
}
public function news(int $id)
public function news(Request $request, int $id)
{
$anime = ['articles' => $this->jikan->getNewsList(new AnimeNewsRequest($id))];
return response($this->serializer->serialize($anime, 'json'));
$results = DB::table($this->getRouteTable($request))
->where('request_hash', $this->fingerprint)
->get();
$expiryTtl = $this->getExpiryTtl($request, $results);
$cached = true;
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$page = $request->get('page') ?? 1;
$anime = $this->jikan->getNewsList(new AnimeNewsRequest($id, $page));
$response = \json_decode($this->serializer->serialize($anime, 'json'), true);
$results = $this->updateCache($request, $results, $response);
}
$response = (new \App\Http\Resources\V3\AnimeNewsResource(
$results->first()
))->toArray($request);
return $this->prepareResponse(
response(
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
),
$results,
$request
);
}
public function forum(int $id, ?string $topic = null)
public function forum(Request $request, int $id, ?string $topic = null)
{
if ($topic === 'episodes') {
$topic = 'episode';
}
$anime = ['topics' => $this->jikan->getAnimeForum(new AnimeForumRequest($id, $topic))];
return response($this->serializer->serialize($anime, 'json'));
$results = DB::table($this->getRouteTable($request))
->where('request_hash', $this->fingerprint)
->get();
$expiryTtl = $this->getExpiryTtl($request, $results);
$cached = true;
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$topic = $request->get('topic');
$anime = ['topics' => $this->jikan->getAnimeForum(new AnimeForumRequest($id, $topic))];
$response = \json_decode($this->serializer->serialize($anime, 'json'), true);
$results = $this->updateCache($request, $results, $response);
}
$response = (new \App\Http\Resources\V3\ForumResource(
$results->first()
))->toArray($request);
return $this->prepareResponse(
response(
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
),
$results,
$request
);
}
public function videos(int $id)
public function videos(Request $request, int $id)
{
$anime = $this->jikan->getAnimeVideos(new AnimeVideosRequest($id));
return response($this->serializer->serialize($anime, 'json'));
$results = DB::table($this->getRouteTable($request))
->where('request_hash', $this->fingerprint)
->get();
$expiryTtl = $this->getExpiryTtl($request, $results);
$cached = true;
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$anime = $this->jikan->getAnimeVideos(new AnimeVideosRequest($id));
$response = \json_decode($this->serializer->serialize($anime, 'json'), true);
$results = $this->updateCache($request, $results, $response);
}
$response = (new \App\Http\Resources\V3\AnimeVideosResource(
$results->first()
))->toArray($request);
return $this->prepareResponse(
response(
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
),
$results,
$request
);
}
public function pictures(int $id)
public function pictures(Request $request, int $id)
{
$anime = ['pictures' => $this->jikan->getAnimePictures(new AnimePicturesRequest($id))];
return response($this->serializer->serialize($anime, 'json'));
$results = DB::table($this->getRouteTable($request))
->where('request_hash', $this->fingerprint)
->get();
$expiryTtl = $this->getExpiryTtl($request, $results);
$cached = true;
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$anime = ['pictures' => $this->jikan->getAnimePictures(new AnimePicturesRequest($id))];
$response = \json_decode($this->serializer->serialize($anime, 'json'), true);
$results = $this->updateCache($request, $results, $response);
}
$response = (new \App\Http\Resources\V3\PicturesResource(
$results->first()
))->toArray($request);
return $this->prepareResponse(
response(
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
),
$results,
$request
);
}
public function stats(int $id)
public function stats(Request $request, int $id)
{
$anime = $this->jikan->getAnimeStats(new AnimeStatsRequest($id));
return response($this->serializer->serialize($anime, 'json'));
$results = DB::table($this->getRouteTable($request))
->where('request_hash', $this->fingerprint)
->get();
$expiryTtl = $this->getExpiryTtl($request, $results);
$cached = true;
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$anime = $this->jikan->getAnimeStats(new AnimeStatsRequest($id));
$response = \json_decode($this->serializer->serialize($anime, 'json'), true);
$results = $this->updateCache($request, $results, $response);
}
$response = (new \App\Http\Resources\V3\AnimeStatisticsResource(
$results->first()
))->toArray($request);
return $this->prepareResponse(
response(
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
),
$results,
$request
);
}
public function moreInfo(int $id)
public function moreInfo(Request $request, int $id)
{
$anime = ['moreinfo' => $this->jikan->getAnimeMoreInfo(new AnimeMoreInfoRequest($id))];
return response(json_encode($anime));
$results = DB::table($this->getRouteTable($request))
->where('request_hash', $this->fingerprint)
->get();
$expiryTtl = $this->getExpiryTtl($request, $results);
$cached = true;
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$anime = ['moreinfo' => $this->jikan->getAnimeMoreInfo(new AnimeMoreInfoRequest($id))];
$response = \json_decode($this->serializer->serialize($anime, 'json'), true);
$results = $this->updateCache($request, $results, $response);
}
$response = (new \App\Http\Resources\V3\MoreInfoResource(
$results->first()
))->toArray($request);
return $this->prepareResponse(
response(
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
),
$results,
$request
);
}
public function recommendations(int $id)
public function recommendations(Request $request, int $id)
{
$anime = ['recommendations' => $this->jikan->getAnimeRecommendations(new AnimeRecommendationsRequest($id))];
return response($this->serializer->serialize($anime, 'json'));
$results = DB::table($this->getRouteTable($request))
->where('request_hash', $this->fingerprint)
->get();
$expiryTtl = $this->getExpiryTtl($request, $results);
$cached = true;
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$anime = ['recommendations' => $this->jikan->getAnimeRecommendations(new AnimeRecommendationsRequest($id))];
$response = \json_decode($this->serializer->serialize($anime, 'json'), true);
$results = $this->updateCache($request, $results, $response);
}
$response = (new \App\Http\Resources\V3\RecommendationsResource(
$results->first()
))->toArray($request);
return $this->prepareResponse(
response(
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
),
$results,
$request
);
}
public function userupdates(int $id, int $page = 1)
public function userupdates(Request $request, int $id, int $page = 1)
{
$anime = ['users' => $this->jikan->getAnimeRecentlyUpdatedByUsers(new AnimeRecentlyUpdatedByUsersRequest($id, $page))];
return response($this->serializer->serialize($anime, 'json'));
$results = DB::table($this->getRouteTable($request))
->where('request_hash', $this->fingerprint)
->get();
$expiryTtl = $this->getExpiryTtl($request, $results);
$cached = true;
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$page = $request->get('page') ?? 1;
$anime = ['users' => $this->jikan->getAnimeRecentlyUpdatedByUsers(new AnimeRecentlyUpdatedByUsersRequest($id, $page))];
$response = \json_decode($this->serializer->serialize($anime, 'json'), true);
$results = $this->updateCache($request, $results, $response);
}
$response = (new \App\Http\Resources\V3\UserUpdatesResource(
$results->first()
))->toArray($request);
return $this->prepareResponse(
response(
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
),
$results,
$request
);
}
public function reviews(int $id, int $page = 1)
public function reviews(Request $request, int $id, int $page = 1)
{
$anime = ['reviews' => $this->jikan->getAnimeReviews(new AnimeReviewsRequest($id, $page))];
return response($this->serializer->serialize($anime, 'json'));
$results = DB::table($this->getRouteTable($request))
->where('request_hash', $this->fingerprint)
->get();
$expiryTtl = $this->getExpiryTtl($request, $results);
$cached = true;
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$page = $request->get('page') ?? 1;
$anime = $this->jikan->getAnimeReviews(new AnimeReviewsRequest($id, $page));
$response = \json_decode($this->serializer->serialize($anime, 'json'), true);
$results = $this->updateCache($request, $results, $response);
}
$response = (new \App\Http\Resources\V3\ReviewsResource(
$results->first()
))->toArray($request);
return $this->prepareResponse(
response(
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
),
$results,
$request
);
}
}

View File

@ -2,15 +2,19 @@
namespace App\Http\Controllers\V3;
use App\Http\HttpHelper;
use App\Providers\SerializerFactory;
use App\Providers\SerializerServiceProdivder;
use App\Providers\SerializerServiceProviderV3;
use GuzzleHttp\Client;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Jikan\Jikan;
use Jikan\MyAnimeList\MalClient;
use JMS\Serializer\Context;
use JMS\Serializer\Serializer;
use Laravel\Lumen\Routing\Controller as BaseController;
use MongoDB\BSON\UTCDateTime;
class Controller extends BaseController
{
@ -24,15 +28,199 @@ class Controller extends BaseController
*/
protected $jikan;
protected $fingerprint;
/**
* AnimeController constructor.
*
* @param Serializer $serializer
* @param MalClient $jikan
*/
public function __construct()
public function __construct(Request $request, MalClient $jikan)
{
$this->serializer = SerializerFactory::createV3();
$this->jikan = app('JikanParser');
$this->fingerprint = HttpHelper::resolveRequestFingerprint($request);
}
protected function isExpired($request, $results) : bool
{
$lastModified = $this->getLastModified($results);
if ($lastModified === null) {
return true;
}
$routeName = HttpHelper::getRouteName($request);
$expiry = (int) config("controller.{$routeName}.ttl") + $lastModified;
if (time() > $expiry) {
return true;
}
return false;
}
protected function getExpiryTtl($request, $results) : int
{
$lastModified = $this->getLastModified($results);
if ($lastModified === null) {
return 0;
}
return $lastModified - time();
}
protected function getExpiry($results, $request)
{
$modifiedAt = $this->getLastModified($results);
$routeName = HttpHelper::getRouteName($request);
return (int) config("controller.{$routeName}.ttl") + $modifiedAt;
}
protected function getTtl($results, $request)
{
$routeName = HttpHelper::getRouteName($request);
return (int) config("controller.{$routeName}.ttl");
}
protected function getLastModified($results) : ?int
{
if (is_array($results->first())) {
return (int) $results->first()['modifiedAt']->toDateTime()->format('U');
}
if (is_object($results->first())) {
return (int) $results->first()->modifiedAt->toDateTime()->format('U');
}
return null;
}
protected function serialize($data) : array
{
return \json_decode(
$this->serializer->serialize($data, 'json')
);
}
protected function getRouteName($request) : string
{
return HttpHelper::getRouteName($request);
}
protected function getRouteTable($request) : string
{
return config("controller.{$this->getRouteName($request)}.table_name");
}
protected function prepareResponse($response, $results, $request)
{
return $response
->header('X-Request-Fingerprint', $this->fingerprint)
->setTtl($this->getTtl($results, $request))
->setExpires(
(new \DateTimeImmutable())->setTimestamp(
$this->getExpiry($results, $request)
)
)
->setLastModified(
(new \DateTimeImmutable())->setTimestamp(
$this->getLastModified($results)
)
);
}
protected function bcMeta($response, $fingerprint, $cached, $cacheTtl) : array
{
return [
'request_hash' => $fingerprint,
'request_cached' => $cached,
'request_cache_expiry' => $cacheTtl
] + $response;
}
protected function updateCache($request, $results, $response)
{
// If resource doesn't exist, prepare meta
if ($results->isEmpty()) {
$meta = [
'createdAt' => new UTCDateTime(),
'modifiedAt' => new UTCDateTime(),
'request_hash' => $this->fingerprint
];
}
// Update `modifiedAt` meta
$meta['modifiedAt'] = new UTCDateTime();
// join meta data with response
$response = $meta + $response;
// insert cache if resource doesn't exist
if ($results->isEmpty()) {
DB::table($this->getRouteTable($request))
->insert($response);
}
// update cache if resource exists
if ($this->isExpired($request, $results)) {
DB::table($this->getRouteTable($request))
->where('request_hash', $this->fingerprint)
->update($response);
}
// return results
return DB::table($this->getRouteTable($request))
->where('request_hash', $this->fingerprint)
->get();
}
/**
* @param array $response
* @return array
*/
// protected function prepareResponse(Request $request, array $response) : array
// {
// $this->request = $request;
// $this->response = $response;
//
// unset($this->response['_id']);
//
// $this->mutation();
//
// $this->response = ['data' => $this->response];
// return $this->response;
// }
/**
* @param Request $request
* @param array $response
* @return array
*/
private function mutation() : void
{
$requestType = HttpHelper::requestType($this->request);
if (($requestType === 'anime' || $requestType === 'manga')) {
// Fix JSON response for empty related object
if (isset($this->response['related']) && \count($this->response['related']) === 0) {
$this->response['related'] = new \stdClass();
}
if (isset($this->response['related']) && !is_object($this->response['related']) && !empty($this->response['related'])) {
$relation = [];
foreach ($this->response['related'] as $relationType => $related) {
$relation[] = [
'relation' => $relationType,
'items' => $related
];
}
$this->response['related'] = $relation;
}
}
}
}

View File

@ -935,7 +935,7 @@ class AnimeController extends Controller
|| $this->isExpired($request, $results)
) {
$page = $request->get('page') ?? 1;
$anime = ['reviews' => $this->jikan->getAnimeReviews(new AnimeReviewsRequest($id, $page))];
$anime = $this->jikan->getAnimeReviews(new AnimeReviewsRequest($id, $page));
$response = \json_decode($this->serializer->serialize($anime, 'json'), true);
$results = $this->updateCache($request, $results, $response);

View File

@ -0,0 +1,43 @@
<?php
namespace App\Http\Resources\V3;
use Illuminate\Http\Resources\Json\JsonResource;
class AnimeCharactersStaffResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'characters' => $this->bcCharacters($this['characters']),
'staff' => $this['staff'],
];
}
private function bcCharacters($characters) : array
{
$bcCharacters = [];
foreach ($characters as $key => $character) {
$bcCharacters[$key] = $character;
foreach ($bcCharacters[$key]['voice_actors'] as &$voiceActor) {
$voiceActor = [
'mal_id' => $voiceActor['person']['mal_id'],
'name' => $voiceActor['person']['name'],
'url' => $voiceActor['person']['url'],
'image_url' => $voiceActor['person']['images']['jpg']['image_url'],
'language' => $voiceActor['language'],
];
}
}
return $bcCharacters;
}
}

View File

@ -0,0 +1,41 @@
<?php
namespace App\Http\Resources\V3;
use Illuminate\Http\Resources\Json\JsonResource;
class AnimeEpisodesResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'episodes_last_page' => $this['last_visible_page'] ?? 1,
'episodes' => $this->bcEpisodes($this['results'])
];
}
private function bcEpisodes($episodes) : array
{
foreach ($episodes as &$episode) {
$episode = [
'episode_id' => $episode['mal_id'],
'title' => $episode['title'],
'title_japanese' => $episode['title_japanese'],
'title_romanji' => $episode['title_romanji'],
'aired' => $episode['aired'],
'filler' => $episode['filler'],
'recap' => $episode['recap'],
'video_url' => $episode['url'],
'forum_url' => $episode['forum_url'],
];
}
return $episodes;
}
}

View File

@ -0,0 +1,40 @@
<?php
namespace App\Http\Resources\V3;
use Illuminate\Http\Resources\Json\JsonResource;
class AnimeNewsResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'articles' => $this->bcArticles($this['results'])
];
}
private function bcArticles($articles) : array
{
foreach ($articles as &$article) {
$article = [
'url' => $article['url'],
'title' => $article['title'],
'date' => $article['date'],
'author_name' => $article['author_username'],
'author_url' => $article['author_url'],
'forum_url' => $article['forum_url'],
'image_url' => $article['images']['jpg']['image_url'],
'comments' => $article['comments'],
'intro' => $article['excerpt'],
];
}
return $articles;
}
}

View File

@ -0,0 +1,79 @@
<?php
namespace App\Http\Resources\V3;
use Illuminate\Http\Resources\Json\JsonResource;
class AnimeResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$this::withoutWrapping();
return [
'mal_id' => $this->mal_id,
'url' => $this->url,
'image_url' => $this->images['jpg']['image_url'],
'trailer_url' => $this->trailer['embed_url'],
'title' => $this->title,
'title_english' => $this->title_english,
'title_japanese' => $this->title_japanese,
'title_synonyms' => $this->title_synonyms,
'type' => $this->type,
'source' => $this->source,
'episodes' => $this->episodes,
'status' => $this->status,
'airing' => $this->airing,
'aired' => $this->aired,
'duration' => $this->duration,
'rating' => $this->rating,
'score' => $this->score,
'scored_by' => $this->scored_by,
'rank' => $this->rank,
'popularity' => $this->popularity,
'members' => $this->members,
'favorites' => $this->favorites,
'synopsis' => $this->synopsis,
'background' => $this->background,
'season' => $this->season,
'year' => $this->year,
'broadcast' => $this->broadcast['string'],
'related' => $this->bcRelations($this->related),
'producers' => $this->producers,
'licensors' => $this->licensors,
'studios' => $this->studios,
'genres' => $this->genres,
'opening_themes' => $this->themes['openings'],
'ending_themes' => $this->themes['endings'],
];
}
/**
* Backwards Compatability Methods
*/
/**
* @param $relations
* @return array
*/
private function bcRelations($relations) : array
{
if (empty($relations)) {
return [];
}
$related = [];
foreach ($relations as $relation) {
$related[$relation['relation']] = $relation['items'];
}
return $related;
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace App\Http\Resources\V3;
use Illuminate\Http\Resources\Json\JsonResource;
class AnimeStatisticsResource extends JsonResource
{
public function toArray($request)
{
return [
'watching' => $this['watching'],
'completed' => $this['completed'],
'on_hold' => $this['on_hold'],
'dropped' => $this['dropped'],
'plan_to_watch' => $this['plan_to_watch'],
'total' => $this['total'],
'scores' => $this->bcScores($this['scores'])
];
}
private function bcScores($scores) : array
{
foreach ($scores as &$score) {
unset($score['score']);
}
return $scores;
}
}

View File

@ -0,0 +1,43 @@
<?php
namespace App\Http\Resources\V3;
use Illuminate\Http\Resources\Json\JsonResource;
class AnimeVideosResource extends JsonResource
{
public function toArray($request)
{
return [
'promo' => $this->bcPromos($this['promo']),
'episodes' => $this->bcEpisodes($this['episodes'])
];
}
private function bcPromos($promos) : array
{
foreach ($promos as &$promo) {
$promo = [
'title' => $promo['title'],
'image_url' => $promo['trailer']['images']['medium_image_url'],
'video_url' => $promo['trailer']['embed_url'],
];
}
return $promos;
}
private function bcEpisodes($episodes) : array
{
foreach ($episodes as &$episode) {
$episode = [
'title' => $episode['title'],
'episode' => $episode['episode'],
'url' => $episode['url'],
'image_url' => $episode['images']['jpg']['image_url'],
];
}
return $episodes;
}
}

View File

@ -0,0 +1,38 @@
<?php
namespace App\Http\Resources\V3;
use Illuminate\Http\Resources\Json\JsonResource;
class ForumResource extends JsonResource
{
public function toArray($request)
{
return [
'topics' => $this->bcTopics($this['topics'])
];
}
private function bcTopics($topics) : array
{
foreach ($topics as &$topic) {
$topic = [
'topic_id' => $topic['mal_id'],
'url' => $topic['url'],
'title' => $topic['title'],
'date_posted' => $topic['date'],
'author_name' => $topic['author_username'],
'author_url' => $topic['author_url'],
'replies' => $topic['comments'],
'last_post' => [
'url' => $topic['url'],
'author_name' => $topic['author_username'],
'author_url' => $topic['author_url'],
'date_posted' => $topic['date'],
],
];
}
return $topics;
}
}

View File

@ -0,0 +1,16 @@
<?php
namespace App\Http\Resources\V3;
use Illuminate\Http\Resources\Json\JsonResource;
class MoreInfoResource extends JsonResource
{
public function toArray($request)
{
return [
'moreinfo' => $this['moreinfo']
];
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace App\Http\Resources\V3;
use Illuminate\Http\Resources\Json\JsonResource;
class PicturesResource extends JsonResource
{
public function toArray($request)
{
return [
'pictures' => $this->bcPictures($this['pictures'])
];
}
private function bcPictures($pictures) : array
{
foreach($pictures as &$picture) {
$picture = [
'large' => $picture['large_image_url'],
'small' => $picture['image_url'],
];
}
return $pictures;
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace App\Http\Resources\V3;
use Illuminate\Http\Resources\Json\JsonResource;
class RecommendationsResource extends JsonResource
{
public function toArray($request)
{
return [
'recommendations' => $this->bcRecommendations($this['recommendations'])
];
}
private function bcRecommendations($recommendations) : array
{
foreach ($recommendations as &$recommendation) {
$recommendation = [
'mal_id' => $recommendation['mal_id'],
'url' => $recommendation['url'],
'image_url' => $recommendation['images']['jpg']['image_url'],
'recommendation_url' => $recommendation['recommendation_url'],
'title' => $recommendation['title'],
'recommendation_count' => $recommendation['recommendation_count'],
];
}
return $recommendations;
}
}

View File

@ -0,0 +1,44 @@
<?php
namespace App\Http\Resources\V3;
use Illuminate\Http\Resources\Json\JsonResource;
class ReviewsResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'reviews' => $this->bcReviews($this['results']),
];
}
private function bcReviews($reviews) : array
{
foreach ($reviews as &$review) {
$review = [
'mal_id' => $review['mal_id'],
'url' => $review['url'],
'type' => $review['type'],
'helpful_count' => $review['votes'],
'date' => $review['date'],
'reviewer' => [
'url' => $review['user']['url'],
'image_url' => $review['user']['images']['jpg']['image_url'],
'username' => $review['user']['username'],
'episodes_seen' => $review['episodes_watched'],
'scores' => $review['scores'],
],
'content' => $review['review'],
];
}
return $reviews;
}
}

View File

@ -0,0 +1,33 @@
<?php
namespace App\Http\Resources\V3;
use Illuminate\Http\Resources\Json\JsonResource;
class UserUpdatesResource extends JsonResource
{
public function toArray($request)
{
return [
'users' => $this->bcUsers($this['users']),
];
}
private function bcUsers($users) : array
{
foreach ($users as &$user) {
$user = [
'username' => $user['username'],
'url' => $user['url'],
'image_url' => $user['images']['jpg']['image_url'],
'score' => $user['score'],
'status' => $user['status'],
'episodes_seen' => $user['episodes_seen'],
'episodes_total' => $user['episodes_total'],
'date' => $user['date'],
];
}
return $users;
}
}

View File

@ -46,6 +46,6 @@ class ReviewsResource extends JsonResource
*/
public function toArray($request)
{
return $this['reviews'];
return $this['results'];
}
}

View File

@ -167,7 +167,7 @@ $app->router->group(
}
);
/*$app->router->group(
$app->router->group(
[
'prefix' => 'v3',
'namespace' => 'App\Http\Controllers\V3',
@ -176,7 +176,7 @@ $app->router->group(
function ($router) {
require __DIR__.'/../routes/web.v3.php';
}
);*/
);
$app->router->group(
[