mirror of
https://github.com/jikan-me/jikan-rest.git
synced 2025-02-20 11:23:35 +08:00
add v3 Anime backwards compatibility
This commit is contained in:
parent
7d20c4efa3
commit
254fb9122d
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
43
app/Http/Resources/V3/AnimeCharactersStaffResource.php
Normal file
43
app/Http/Resources/V3/AnimeCharactersStaffResource.php
Normal 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;
|
||||
}
|
||||
}
|
41
app/Http/Resources/V3/AnimeEpisodesResource.php
Normal file
41
app/Http/Resources/V3/AnimeEpisodesResource.php
Normal 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;
|
||||
}
|
||||
}
|
40
app/Http/Resources/V3/AnimeNewsResource.php
Normal file
40
app/Http/Resources/V3/AnimeNewsResource.php
Normal 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;
|
||||
}
|
||||
}
|
79
app/Http/Resources/V3/AnimeResource.php
Normal file
79
app/Http/Resources/V3/AnimeResource.php
Normal 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;
|
||||
}
|
||||
}
|
30
app/Http/Resources/V3/AnimeStatisticsResource.php
Normal file
30
app/Http/Resources/V3/AnimeStatisticsResource.php
Normal 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;
|
||||
}
|
||||
}
|
43
app/Http/Resources/V3/AnimeVideosResource.php
Normal file
43
app/Http/Resources/V3/AnimeVideosResource.php
Normal 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;
|
||||
}
|
||||
}
|
38
app/Http/Resources/V3/ForumResource.php
Normal file
38
app/Http/Resources/V3/ForumResource.php
Normal 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;
|
||||
}
|
||||
}
|
16
app/Http/Resources/V3/MoreInfoResource.php
Normal file
16
app/Http/Resources/V3/MoreInfoResource.php
Normal 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']
|
||||
];
|
||||
}
|
||||
}
|
27
app/Http/Resources/V3/PicturesResource.php
Normal file
27
app/Http/Resources/V3/PicturesResource.php
Normal 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;
|
||||
}
|
||||
}
|
31
app/Http/Resources/V3/RecommendationsResource.php
Normal file
31
app/Http/Resources/V3/RecommendationsResource.php
Normal 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;
|
||||
}
|
||||
}
|
44
app/Http/Resources/V3/ReviewsResource.php
Normal file
44
app/Http/Resources/V3/ReviewsResource.php
Normal 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;
|
||||
}
|
||||
}
|
33
app/Http/Resources/V3/UserUpdatesResource.php
Normal file
33
app/Http/Resources/V3/UserUpdatesResource.php
Normal 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;
|
||||
}
|
||||
}
|
@ -46,6 +46,6 @@ class ReviewsResource extends JsonResource
|
||||
*/
|
||||
public function toArray($request)
|
||||
{
|
||||
return $this['reviews'];
|
||||
return $this['results'];
|
||||
}
|
||||
}
|
@ -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(
|
||||
[
|
||||
|
Loading…
x
Reference in New Issue
Block a user