mirror of
https://github.com/jikan-me/jikan-rest.git
synced 2025-02-20 11:23:35 +08:00
remove v3 bc
- screw it lmao. causing a mess.
This commit is contained in:
parent
6bd07cb265
commit
9e687057f9
@ -1,26 +0,0 @@
|
||||
<?php
|
||||
namespace App;
|
||||
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class DatabaseHandler
|
||||
{
|
||||
public function resolve(string $table, $fingerprint, array $data)
|
||||
{
|
||||
|
||||
if (DB::table($table)->where('fingerprint', $fingerprint)) {
|
||||
return DB::table($table)->get();
|
||||
}
|
||||
|
||||
DB::table('anime')->insert($data);
|
||||
}
|
||||
|
||||
public static function getMappedTableName(string $controller)
|
||||
{
|
||||
return config('controller-to-table-mapping.'.$controller);
|
||||
}
|
||||
|
||||
public function prepare(array $response)
|
||||
{
|
||||
}
|
||||
}
|
@ -1,463 +0,0 @@
|
||||
<?php
|
||||
|
||||
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;
|
||||
use Jikan\Request\Anime\AnimeEpisodesRequest;
|
||||
use Jikan\Request\Anime\AnimeForumRequest;
|
||||
use Jikan\Request\Anime\AnimeMoreInfoRequest;
|
||||
use Jikan\Request\Anime\AnimeNewsRequest;
|
||||
use Jikan\Request\Anime\AnimePicturesRequest;
|
||||
use Jikan\Request\Anime\AnimeRecentlyUpdatedByUsersRequest;
|
||||
use Jikan\Request\Anime\AnimeRecommendationsRequest;
|
||||
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(Request $request, int $id)
|
||||
{
|
||||
$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(Request $request, int $id)
|
||||
{
|
||||
$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(Request $request, int $id, int $page = 1)
|
||||
{
|
||||
$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(Request $request, int $id)
|
||||
{
|
||||
$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(Request $request, int $id, ?string $topic = null)
|
||||
{
|
||||
if ($topic === 'episodes') {
|
||||
$topic = 'episode';
|
||||
}
|
||||
|
||||
$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(Request $request, int $id)
|
||||
{
|
||||
$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(Request $request, int $id)
|
||||
{
|
||||
$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(Request $request, int $id)
|
||||
{
|
||||
$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(Request $request, int $id)
|
||||
{
|
||||
$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(Request $request, int $id)
|
||||
{
|
||||
$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(Request $request, int $id, int $page = 1)
|
||||
{
|
||||
$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\AnimeUserUpdatesResource(
|
||||
$results->first()
|
||||
))->toArray($request);
|
||||
|
||||
return $this->prepareResponse(
|
||||
response(
|
||||
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
|
||||
),
|
||||
$results,
|
||||
$request
|
||||
);
|
||||
}
|
||||
|
||||
public function reviews(Request $request, int $id, int $page = 1)
|
||||
{
|
||||
$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\AnimeReviewsResource(
|
||||
$results->first()
|
||||
))->toArray($request);
|
||||
|
||||
return $this->prepareResponse(
|
||||
response(
|
||||
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
|
||||
),
|
||||
$results,
|
||||
$request
|
||||
);
|
||||
}
|
||||
}
|
@ -1,113 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\V3;
|
||||
|
||||
use App\Character;
|
||||
use App\Http\HttpHelper;
|
||||
use App\Http\HttpResponse;
|
||||
use App\Http\Resources\V4\PicturesResource;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Jikan\Request\Character\CharacterPicturesRequest;
|
||||
use MongoDB\BSON\UTCDateTime;
|
||||
|
||||
class CharacterController extends Controller
|
||||
{
|
||||
public function main(Request $request, int $id)
|
||||
{
|
||||
$results = Character::query()
|
||||
->where('mal_id', $id)
|
||||
->get();
|
||||
|
||||
$isExpired = $this->isExpired($request, $results);
|
||||
$expiryTtl = $this->getExpiryTtl($request, $results);
|
||||
$cached = true;
|
||||
|
||||
if (
|
||||
$results->isEmpty()
|
||||
|| $isExpired
|
||||
) {
|
||||
$response = Character::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()) {
|
||||
Character::query()
|
||||
->insert($response);
|
||||
}
|
||||
|
||||
if ($this->isExpired($request, $results)) {
|
||||
Character::query()
|
||||
->where('request_hash', $this->fingerprint)
|
||||
->update($response);
|
||||
}
|
||||
|
||||
$results = Character::query()
|
||||
->where('mal_id', $id)
|
||||
->get();
|
||||
}
|
||||
|
||||
if ($results->isEmpty()) {
|
||||
return HttpResponse::notFound($request);
|
||||
}
|
||||
|
||||
$response = (new \App\Http\Resources\V3\CharacterResource(
|
||||
$results->first()
|
||||
))->toArray($request);
|
||||
|
||||
return $this->prepareResponse(
|
||||
response(
|
||||
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
|
||||
),
|
||||
$results,
|
||||
$request
|
||||
);
|
||||
}
|
||||
|
||||
public function pictures(Request $request, int $id)
|
||||
{
|
||||
$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()
|
||||
|| $isExpired
|
||||
) {
|
||||
$character = ['pictures' => $this->jikan->getCharacterPictures(new CharacterPicturesRequest($id))];
|
||||
$response = \json_decode($this->serializer->serialize($character, '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
|
||||
);
|
||||
}
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\V3;
|
||||
|
||||
use Jikan\Request\Club\ClubRequest;
|
||||
use Jikan\Request\Club\UserListRequest;
|
||||
|
||||
class ClubController extends Controller
|
||||
{
|
||||
public function main(int $id)
|
||||
{
|
||||
$club = $this->jikan->getClub(new ClubRequest($id));
|
||||
return response($this->serializer->serialize($club, 'json'));
|
||||
}
|
||||
|
||||
public function members(int $id, int $page = 1)
|
||||
{
|
||||
$club = ['members' => $this->jikan->getClubUsers(new UserListRequest($id, $page))];
|
||||
return response($this->serializer->serialize($club, 'json'));
|
||||
}
|
||||
}
|
@ -1,226 +0,0 @@
|
||||
<?php
|
||||
|
||||
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
|
||||
{
|
||||
/**
|
||||
* @var Serializer
|
||||
*/
|
||||
protected $serializer;
|
||||
|
||||
/**
|
||||
* @var MalClient
|
||||
*/
|
||||
protected $jikan;
|
||||
|
||||
protected $fingerprint;
|
||||
|
||||
/**
|
||||
* AnimeController constructor.
|
||||
*
|
||||
* @param Serializer $serializer
|
||||
* @param MalClient $jikan
|
||||
*/
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
class ExampleController extends Controller
|
||||
{
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
}
|
@ -1,149 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\V3;
|
||||
|
||||
use App\Http\HttpHelper;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Jikan\Request\Genre\AnimeGenreRequest;
|
||||
use Jikan\Request\Genre\MangaGenreRequest;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class GenreController extends Controller
|
||||
{
|
||||
|
||||
private $request;
|
||||
const MAX_RESULTS_PER_PAGE = 25;
|
||||
|
||||
public function anime(Request $request, int $id, int $page = 1)
|
||||
{
|
||||
$this->request = $request;
|
||||
|
||||
$results = DB::table('anime')
|
||||
->where('genres.mal_id', $id)
|
||||
->orderBy('title');
|
||||
|
||||
$results = $results
|
||||
->paginate(
|
||||
self::MAX_RESULTS_PER_PAGE,
|
||||
[
|
||||
'mal_id', 'url', 'title', 'image_url', 'synopsis', 'type', 'airing_start', 'episodes', 'members', 'genres', 'source', 'producers', 'score', 'licensors', 'rating'
|
||||
],
|
||||
null,
|
||||
$page
|
||||
);
|
||||
|
||||
$items = $this->applyBackwardsCompatibility($results, 'anime');
|
||||
|
||||
return response()->json($items);
|
||||
|
||||
// $person = $this->jikan->getAnimeGenre(new AnimeGenreRequest($id, $page));
|
||||
// return response($this->serializer->serialize($person, 'json'));
|
||||
}
|
||||
|
||||
public function manga(Request $request, int $id, int $page = 1)
|
||||
{
|
||||
$this->request = $request;
|
||||
|
||||
$results = DB::table('manga')
|
||||
->where('genres.mal_id', $id)
|
||||
->orderBy('title');
|
||||
|
||||
$results = $results
|
||||
->paginate(
|
||||
self::MAX_RESULTS_PER_PAGE,
|
||||
[
|
||||
'mal_id', 'url', 'title', 'image_url', 'synopsis', 'type', 'aired.from', 'volumes', 'members', 'genres', 'authors', 'score', 'serializations'
|
||||
],
|
||||
null,
|
||||
$page
|
||||
);
|
||||
|
||||
$items = $this->applyBackwardsCompatibility($results, 'manga');
|
||||
|
||||
return response()->json($items);
|
||||
|
||||
// $person = $this->jikan->getMangaGenre(new MangaGenreRequest($id, $page));
|
||||
// return response($this->serializer->serialize($person, 'json'));
|
||||
}
|
||||
|
||||
private function applyBackwardsCompatibility($data, $type)
|
||||
{
|
||||
$fingerprint = HttpHelper::resolveRequestFingerprint($this->request);
|
||||
|
||||
$meta = [
|
||||
'request_hash' => $fingerprint,
|
||||
'request_cached' => true,
|
||||
'request_cache_expiry' => 0,
|
||||
'last_page' => $data->lastPage(),
|
||||
'mal_url' => [
|
||||
'mal_id' => 0,
|
||||
'type' => $type,
|
||||
'name' => '',
|
||||
'url' => ''
|
||||
],
|
||||
'item_count' => $data->total()
|
||||
];
|
||||
|
||||
$items = $data->items() ?? [];
|
||||
foreach ($items as &$item) {
|
||||
|
||||
if (isset($item['aired']['from'])) {
|
||||
$item['airing_start'] = $item['aired']['from'];
|
||||
}
|
||||
|
||||
if (isset($item['published']['from'])) {
|
||||
$item['publishing_start'] = $item['aired']['from'];
|
||||
}
|
||||
|
||||
if (isset($item['serializations'])) {
|
||||
$serializations = [];
|
||||
foreach ($item['serializations'] as $serialization) {
|
||||
$serializations[] = $serialization['name'];
|
||||
}
|
||||
|
||||
$item['serialization'] = $serializations;
|
||||
}
|
||||
|
||||
if (isset($item['serializations'])) {
|
||||
$serializations = [];
|
||||
foreach ($item['serializations'] as $serialization) {
|
||||
$serializations[] = $serialization['name'];
|
||||
}
|
||||
|
||||
$item['serialization'] = $serializations;
|
||||
}
|
||||
|
||||
if (isset($item['licensors'])) {
|
||||
$licensors = [];
|
||||
foreach ($item['licensors'] as $licensor) {
|
||||
$licensors[] = $licensor['name'];
|
||||
}
|
||||
|
||||
$item['licensors'] = $licensors;
|
||||
}
|
||||
|
||||
if ($type === 'anime') {
|
||||
|
||||
$item['kids'] = false;
|
||||
if (isset($item['rating'])) {
|
||||
if ($item['rating'] === 'G - All Ages' || $item['rating'] === 'PG - Children') {
|
||||
$item['kids'] = true;
|
||||
}
|
||||
}
|
||||
|
||||
$item['r18'] = false;
|
||||
if (isset($item['rating'])) {
|
||||
if ($item['rating'] === 'R+ - Mild Nudity' || $item['rating'] === 'Rx - Hentai') {
|
||||
$item['r18'] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unset($item['_id'], $item['oid'], $item['expiresAt'], $item['aired'], $item['published'], $item['serializations']);
|
||||
}
|
||||
|
||||
$items = [$type => $items];
|
||||
|
||||
return $meta+$items;
|
||||
}
|
||||
}
|
@ -1,123 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\V3;
|
||||
|
||||
use App\Http\HttpHelper;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Jikan\Request\Magazine\MagazineRequest;
|
||||
|
||||
class MagazineController extends Controller
|
||||
{
|
||||
private $request;
|
||||
const MAX_RESULTS_PER_PAGE = 25;
|
||||
|
||||
public function main(Request $request, int $id, int $page = 1)
|
||||
{
|
||||
|
||||
$this->request = $request;
|
||||
|
||||
$results = DB::table('manga')
|
||||
->where('serializations.mal_id', $id)
|
||||
->orderBy('title');
|
||||
|
||||
$results = $results
|
||||
->paginate(
|
||||
self::MAX_RESULTS_PER_PAGE,
|
||||
[
|
||||
'mal_id', 'url', 'title', 'image_url', 'synopsis', 'type', 'aired.from', 'volumes', 'members', 'genres', 'authors', 'score', 'serializations'
|
||||
],
|
||||
null,
|
||||
$page
|
||||
);
|
||||
|
||||
$items = $this->applyBackwardsCompatibility($results, 'manga');
|
||||
|
||||
return response()->json($items);
|
||||
|
||||
// $magazine = $this->jikan->getMagazine(new MagazineRequest($id, $page));
|
||||
// return response($this->serializer->serialize($magazine, 'json'));
|
||||
}
|
||||
|
||||
private function applyBackwardsCompatibility($data, $type)
|
||||
{
|
||||
$fingerprint = HttpHelper::resolveRequestFingerprint($this->request);
|
||||
|
||||
$meta = [
|
||||
'request_hash' => $fingerprint,
|
||||
'request_cached' => true,
|
||||
'request_cache_expiry' => 0,
|
||||
'last_page' => $data->lastPage(),
|
||||
'meta' => [
|
||||
'mal_id' => 0,
|
||||
'type' => $type,
|
||||
'name' => '',
|
||||
'url' => ''
|
||||
],
|
||||
'item_count' => $data->total()
|
||||
];
|
||||
|
||||
$items = $data->items() ?? [];
|
||||
foreach ($items as &$item) {
|
||||
|
||||
if (isset($item['aired']['from'])) {
|
||||
$item['airing_start'] = $item['aired']['from'];
|
||||
}
|
||||
|
||||
if (isset($item['published']['from'])) {
|
||||
$item['publishing_start'] = $item['aired']['from'];
|
||||
}
|
||||
|
||||
if (isset($item['serializations'])) {
|
||||
$serializations = [];
|
||||
foreach ($item['serializations'] as $serialization) {
|
||||
$serializations[] = $serialization['name'];
|
||||
}
|
||||
|
||||
$item['serialization'] = $serializations;
|
||||
}
|
||||
|
||||
if (isset($item['serializations'])) {
|
||||
$serializations = [];
|
||||
foreach ($item['serializations'] as $serialization) {
|
||||
$serializations[] = $serialization['name'];
|
||||
}
|
||||
|
||||
$item['serialization'] = $serializations;
|
||||
}
|
||||
|
||||
if (isset($item['licensors'])) {
|
||||
$licensors = [];
|
||||
foreach ($item['licensors'] as $licensor) {
|
||||
$licensors[] = $licensor['name'];
|
||||
}
|
||||
|
||||
$item['licensors'] = $licensors;
|
||||
}
|
||||
|
||||
if ($type === 'anime') {
|
||||
|
||||
$item['kids'] = false;
|
||||
if (isset($item['rating'])) {
|
||||
if ($item['rating'] === 'G - All Ages' || $item['rating'] === 'PG - Children') {
|
||||
$item['kids'] = true;
|
||||
}
|
||||
}
|
||||
|
||||
$item['r18'] = false;
|
||||
if (isset($item['rating'])) {
|
||||
if ($item['rating'] === 'R+ - Mild Nudity' || $item['rating'] === 'Rx - Hentai') {
|
||||
$item['r18'] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unset($item['_id'], $item['oid'], $item['expiresAt'], $item['aired'], $item['published'], $item['serializations']);
|
||||
}
|
||||
|
||||
$items = [$type => $items];
|
||||
|
||||
return $meta+$items;
|
||||
}
|
||||
|
||||
}
|
@ -1,393 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\V3;
|
||||
|
||||
use App\Http\HttpHelper;
|
||||
use App\Http\HttpResponse;
|
||||
use App\Manga;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Jikan\Request\Manga\MangaCharactersRequest;
|
||||
use Jikan\Request\Manga\MangaForumRequest;
|
||||
use Jikan\Request\Manga\MangaMoreInfoRequest;
|
||||
use Jikan\Request\Manga\MangaNewsRequest;
|
||||
use Jikan\Request\Manga\MangaPicturesRequest;
|
||||
use Jikan\Request\Manga\MangaRecentlyUpdatedByUsersRequest;
|
||||
use Jikan\Request\Manga\MangaRecommendationsRequest;
|
||||
use Jikan\Request\Manga\MangaReviewsRequest;
|
||||
use Jikan\Request\Manga\MangaStatsRequest;
|
||||
use MongoDB\BSON\UTCDateTime;
|
||||
|
||||
class MangaController extends Controller
|
||||
{
|
||||
public function main(Request $request, int $id)
|
||||
{
|
||||
$results = Manga::query()
|
||||
->where('mal_id', $id)
|
||||
->get();
|
||||
|
||||
$isExpired = $this->isExpired($request, $results);
|
||||
$expiryTtl = $this->getExpiryTtl($request, $results);
|
||||
$cached = true;
|
||||
|
||||
if (
|
||||
$results->isEmpty()
|
||||
|| $isExpired
|
||||
) {
|
||||
$response = Manga::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()) {
|
||||
Manga::query()
|
||||
->insert($response);
|
||||
}
|
||||
|
||||
if ($this->isExpired($request, $results)) {
|
||||
Manga::query()
|
||||
->where('request_hash', $this->fingerprint)
|
||||
->update($response);
|
||||
}
|
||||
|
||||
$results = Manga::query()
|
||||
->where('mal_id', $id)
|
||||
->get();
|
||||
}
|
||||
|
||||
|
||||
if ($results->isEmpty()) {
|
||||
return HttpResponse::notFound($request);
|
||||
}
|
||||
|
||||
$response = (new \App\Http\Resources\V3\MangaResource(
|
||||
$results->first()
|
||||
))->toArray($request);
|
||||
|
||||
return $this->prepareResponse(
|
||||
response(
|
||||
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
|
||||
),
|
||||
$results,
|
||||
$request
|
||||
);
|
||||
}
|
||||
|
||||
public function characters(Request $request, int $id)
|
||||
{
|
||||
$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()
|
||||
|| $isExpired
|
||||
) {
|
||||
$manga = ['characters' => $this->jikan->getMangaCharacters(new MangaCharactersRequest($id))];
|
||||
$response = \json_decode($this->serializer->serialize($manga, 'json'), true);
|
||||
|
||||
$results = $this->updateCache($request, $results, $response);
|
||||
}
|
||||
|
||||
$response = (new \App\Http\Resources\V3\MangaCharactersResource(
|
||||
$results->first()
|
||||
))->toArray($request);
|
||||
|
||||
return $this->prepareResponse(
|
||||
response(
|
||||
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
|
||||
),
|
||||
$results,
|
||||
$request
|
||||
);
|
||||
}
|
||||
|
||||
public function news(Request $request, int $id)
|
||||
{
|
||||
$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()
|
||||
|| $isExpired
|
||||
) {
|
||||
$page = $request->get('page') ?? 1;
|
||||
$manga = $this->jikan->getNewsList(new MangaNewsRequest($id, $page));
|
||||
$response = \json_decode($this->serializer->serialize($manga, 'json'), true);
|
||||
|
||||
$results = $this->updateCache($request, $results, $response);
|
||||
}
|
||||
|
||||
$response = (new \App\Http\Resources\V3\MangaNewsResource(
|
||||
$results->first()
|
||||
))->toArray($request);
|
||||
|
||||
return $this->prepareResponse(
|
||||
response(
|
||||
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
|
||||
),
|
||||
$results,
|
||||
$request
|
||||
);
|
||||
}
|
||||
|
||||
public function forum(Request $request, int $id, ?string $topic = null)
|
||||
{
|
||||
// safely bypass MAL's naming schemes
|
||||
if ($topic === 'chapters') {
|
||||
$topic = 'chapter';
|
||||
}
|
||||
|
||||
$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()
|
||||
|| $isExpired
|
||||
) {
|
||||
$topic = $request->get('topic');
|
||||
$manga = ['topics' => $this->jikan->getMangaForum(new MangaForumRequest($id))];
|
||||
$response = \json_decode($this->serializer->serialize($manga, '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 pictures(Request $request, int $id)
|
||||
{
|
||||
$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()
|
||||
|| $isExpired
|
||||
) {
|
||||
$manga = ['pictures' => $this->jikan->getMangaPictures(new MangaPicturesRequest($id))];
|
||||
$response = \json_decode($this->serializer->serialize($manga, '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(Request $request, int $id)
|
||||
{
|
||||
$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()
|
||||
|| $isExpired
|
||||
) {
|
||||
$manga = $this->jikan->getMangaStats(new MangaStatsRequest($id));
|
||||
$response = \json_decode($this->serializer->serialize($manga, 'json'), true);
|
||||
|
||||
$results = $this->updateCache($request, $results, $response);
|
||||
}
|
||||
|
||||
$response = (new \App\Http\Resources\V3\MangaStatisticsResource(
|
||||
$results->first()
|
||||
))->toArray($request);
|
||||
|
||||
return $this->prepareResponse(
|
||||
response(
|
||||
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
|
||||
),
|
||||
$results,
|
||||
$request
|
||||
);
|
||||
}
|
||||
|
||||
public function moreInfo(Request $request, int $id)
|
||||
{
|
||||
$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()
|
||||
|| $isExpired
|
||||
) {
|
||||
$manga = ['moreinfo' => $this->jikan->getMangaMoreInfo(new MangaMoreInfoRequest($id))];
|
||||
$response = \json_decode($this->serializer->serialize($manga, '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(Request $request, int $id)
|
||||
{
|
||||
$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()
|
||||
|| $isExpired
|
||||
) {
|
||||
$manga = ['recommendations' => $this->jikan->getMangaRecommendations(new MangaRecommendationsRequest($id))];
|
||||
$response = \json_decode($this->serializer->serialize($manga, '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(Request $request, int $id, int $page = 1)
|
||||
{
|
||||
$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()
|
||||
|| $isExpired
|
||||
) {
|
||||
$page = $request->get('page') ?? 1;
|
||||
$manga = ['users' => $this->jikan->getMangaRecentlyUpdatedByUsers(new MangaRecentlyUpdatedByUsersRequest($id, $page))];
|
||||
$response = \json_decode($this->serializer->serialize($manga, 'json'), true);
|
||||
|
||||
$results = $this->updateCache($request, $results, $response);
|
||||
}
|
||||
|
||||
$response = (new \App\Http\Resources\V3\MangaUserUpdatesResource(
|
||||
$results->first()
|
||||
))->toArray($request);
|
||||
|
||||
return $this->prepareResponse(
|
||||
response(
|
||||
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
|
||||
),
|
||||
$results,
|
||||
$request
|
||||
);
|
||||
}
|
||||
|
||||
public function reviews(Request $request, int $id, int $page = 1)
|
||||
{
|
||||
$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()
|
||||
|| $isExpired
|
||||
) {
|
||||
$page = $request->get('page') ?? 1;
|
||||
$manga = $this->jikan->getMangaReviews(new MangaReviewsRequest($id, $page));
|
||||
$response = \json_decode($this->serializer->serialize($manga, 'json'), true);
|
||||
|
||||
$results = $this->updateCache($request, $results, $response);
|
||||
}
|
||||
|
||||
$response = (new \App\Http\Resources\V3\MangaReviewsResource(
|
||||
$results->first()
|
||||
))->toArray($request);
|
||||
|
||||
return $this->prepareResponse(
|
||||
response(
|
||||
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
|
||||
),
|
||||
$results,
|
||||
$request
|
||||
);
|
||||
}
|
||||
}
|
@ -1,50 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\V3;
|
||||
|
||||
class MetaController extends Controller
|
||||
{
|
||||
public function status()
|
||||
{
|
||||
$info = app('redis')->info();
|
||||
|
||||
return response()->json([
|
||||
'cached_requests' => count(app('redis')->keys('request:*')),
|
||||
'requests_today' => count(app('redis')->keys('requests:today:*')),
|
||||
'requests_this_week' => count(app('redis')->keys('requests:weekly:*')),
|
||||
'requests_this_month' => count(app('redis')->keys('requests:monthly:*')),
|
||||
'connected_clients' => $info['Clients']['connected_clients'],
|
||||
'total_connections_received' => $info['Stats']['total_connections_received'],
|
||||
]);
|
||||
}
|
||||
|
||||
public function requests($type, $period, $offset = 0)
|
||||
{
|
||||
if (!\in_array($type, [
|
||||
'anime', 'manga', 'character', 'person', 'people', 'search', 'top', 'season', 'schedule', 'user', 'producer', 'magazine', 'genre'
|
||||
])) {
|
||||
return response()->json([
|
||||
'error' => 'Bad Request'
|
||||
], 400);
|
||||
}
|
||||
|
||||
if (!\in_array($period, ['today', 'weekly', 'monthly'])) {
|
||||
return response()->json([
|
||||
'error' => 'Bad Request'
|
||||
], 400);
|
||||
}
|
||||
|
||||
$requests = [];
|
||||
$data = app('redis')->keys("requests:{$period}:*{$type}*");
|
||||
|
||||
foreach ($data as $key) {
|
||||
$requests[explode(":", $key)[2]] = (int) app('redis')->get($key);
|
||||
}
|
||||
|
||||
arsort($requests);
|
||||
|
||||
return response()->json(
|
||||
\array_slice($requests, $offset, 1000)
|
||||
);
|
||||
}
|
||||
}
|
@ -1,114 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\V3;
|
||||
|
||||
use App\Http\HttpHelper;
|
||||
use App\Http\HttpResponse;
|
||||
use App\Person;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Jikan\Exception\BadResponseException;
|
||||
use Jikan\Request\Manga\MangaPicturesRequest;
|
||||
use Jikan\Request\Person\PersonRequest;
|
||||
use Jikan\Request\Person\PersonPicturesRequest;
|
||||
use MongoDB\BSON\UTCDateTime;
|
||||
|
||||
class PersonController extends Controller
|
||||
{
|
||||
public function main(Request $request, int $id)
|
||||
{
|
||||
$results = Person::query()
|
||||
->where('mal_id', $id)
|
||||
->get();
|
||||
|
||||
$isExpired = $this->isExpired($request, $results);
|
||||
$expiryTtl = $this->getExpiryTtl($request, $results);
|
||||
$cached = true;
|
||||
|
||||
if (
|
||||
$results->isEmpty()
|
||||
|| $isExpired
|
||||
) {
|
||||
$response = Person::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()) {
|
||||
Person::query()
|
||||
->insert($response);
|
||||
}
|
||||
|
||||
if ($this->isExpired($request, $results)) {
|
||||
Person::query()
|
||||
->where('request_hash', $this->fingerprint)
|
||||
->update($response);
|
||||
}
|
||||
|
||||
$results = Person::query()
|
||||
->where('mal_id', $id)
|
||||
->get();
|
||||
}
|
||||
|
||||
if ($results->isEmpty()) {
|
||||
return HttpResponse::notFound($request);
|
||||
}
|
||||
|
||||
$response = (new \App\Http\Resources\V3\PersonResource(
|
||||
$results->first()
|
||||
))->toArray($request);
|
||||
|
||||
return $this->prepareResponse(
|
||||
response(
|
||||
$this->bcMeta($response, $this->fingerprint, $cached, $expiryTtl)
|
||||
),
|
||||
$results,
|
||||
$request
|
||||
);
|
||||
}
|
||||
|
||||
public function pictures(Request $request, int $id)
|
||||
{
|
||||
$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()
|
||||
|| $isExpired
|
||||
) {
|
||||
$person = ['pictures' => $this->jikan->getPersonPictures(new PersonPicturesRequest($id))];
|
||||
$response = \json_decode($this->serializer->serialize($person, '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
|
||||
);
|
||||
}
|
||||
}
|
@ -1,122 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\V3;
|
||||
|
||||
use App\Http\HttpHelper;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Jikan\Request\Producer\ProducerRequest;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ProducerController extends Controller
|
||||
{
|
||||
private $request;
|
||||
const MAX_RESULTS_PER_PAGE = 25;
|
||||
|
||||
public function main(Request $request, int $id, int $page = 1)
|
||||
{
|
||||
|
||||
$this->request = $request;
|
||||
|
||||
$results = DB::table('anime')
|
||||
->where('producers.mal_id', $id)
|
||||
->orderBy('title');
|
||||
|
||||
$results = $results
|
||||
->paginate(
|
||||
self::MAX_RESULTS_PER_PAGE,
|
||||
[
|
||||
'mal_id', 'url', 'title', 'image_url', 'synopsis', 'type', 'airing_start', 'episodes', 'members', 'genres', 'source', 'producers', 'score', 'licensors', 'rating'
|
||||
],
|
||||
null,
|
||||
$page
|
||||
);
|
||||
|
||||
$items = $this->applyBackwardsCompatibility($results, 'anime');
|
||||
|
||||
return response()->json($items);
|
||||
|
||||
// $producer = $this->jikan->getProducer(new ProducerRequest($id, $page));
|
||||
// return response($this->serializer->serialize($producer, 'json'));
|
||||
}
|
||||
|
||||
private function applyBackwardsCompatibility($data, $type)
|
||||
{
|
||||
$fingerprint = HttpHelper::resolveRequestFingerprint($this->request);
|
||||
|
||||
$meta = [
|
||||
'request_hash' => $fingerprint,
|
||||
'request_cached' => true,
|
||||
'request_cache_expiry' => 0,
|
||||
'last_page' => $data->lastPage(),
|
||||
'meta' => [
|
||||
'mal_id' => 0,
|
||||
'type' => $type,
|
||||
'name' => '',
|
||||
'url' => ''
|
||||
],
|
||||
'item_count' => $data->total()
|
||||
];
|
||||
|
||||
$items = $data->items() ?? [];
|
||||
foreach ($items as &$item) {
|
||||
|
||||
if (isset($item['aired']['from'])) {
|
||||
$item['airing_start'] = $item['aired']['from'];
|
||||
}
|
||||
|
||||
if (isset($item['published']['from'])) {
|
||||
$item['publishing_start'] = $item['aired']['from'];
|
||||
}
|
||||
|
||||
if (isset($item['serializations'])) {
|
||||
$serializations = [];
|
||||
foreach ($item['serializations'] as $serialization) {
|
||||
$serializations[] = $serialization['name'];
|
||||
}
|
||||
|
||||
$item['serialization'] = $serializations;
|
||||
}
|
||||
|
||||
if (isset($item['serializations'])) {
|
||||
$serializations = [];
|
||||
foreach ($item['serializations'] as $serialization) {
|
||||
$serializations[] = $serialization['name'];
|
||||
}
|
||||
|
||||
$item['serialization'] = $serializations;
|
||||
}
|
||||
|
||||
if (isset($item['licensors'])) {
|
||||
$licensors = [];
|
||||
foreach ($item['licensors'] as $licensor) {
|
||||
$licensors[] = $licensor['name'];
|
||||
}
|
||||
|
||||
$item['licensors'] = $licensors;
|
||||
}
|
||||
|
||||
if ($type === 'anime') {
|
||||
|
||||
$item['kids'] = false;
|
||||
if (isset($item['rating'])) {
|
||||
if ($item['rating'] === 'G - All Ages' || $item['rating'] === 'PG - Children') {
|
||||
$item['kids'] = true;
|
||||
}
|
||||
}
|
||||
|
||||
$item['r18'] = false;
|
||||
if (isset($item['rating'])) {
|
||||
if ($item['rating'] === 'R+ - Mild Nudity' || $item['rating'] === 'Rx - Hentai') {
|
||||
$item['r18'] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unset($item['_id'], $item['oid'], $item['expiresAt'], $item['aired'], $item['published'], $item['serializations']);
|
||||
}
|
||||
|
||||
$items = [$type => $items];
|
||||
|
||||
return $meta+$items;
|
||||
}
|
||||
}
|
@ -1,159 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\V3;
|
||||
|
||||
use App\Http\HttpHelper;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Jikan\Request\Schedule\ScheduleRequest;
|
||||
use phpDocumentor\Reflection\Types\Self_;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ScheduleController extends Controller
|
||||
{
|
||||
private const VALID_FILTERS = [
|
||||
'monday',
|
||||
'tuesday',
|
||||
'wednesday',
|
||||
'thursday',
|
||||
'friday',
|
||||
'saturday',
|
||||
'sunday',
|
||||
'other',
|
||||
'unknown',
|
||||
];
|
||||
|
||||
private const VALID_DAYS = [
|
||||
'monday',
|
||||
'tuesday',
|
||||
'wednesday',
|
||||
'thursday',
|
||||
'friday',
|
||||
'saturday',
|
||||
'sunday',
|
||||
];
|
||||
|
||||
private $request;
|
||||
private $day;
|
||||
|
||||
public function main(Request $request, ?string $day = null)
|
||||
{
|
||||
$this->request = $request;
|
||||
|
||||
if (!is_null($day)) {
|
||||
$this->day = strtolower($day);
|
||||
}
|
||||
|
||||
if (null !== $day && !\in_array($this->day, self::VALID_FILTERS, true)) {
|
||||
return response()->json([
|
||||
'error' => 'Bad Request',
|
||||
])->setStatusCode(400);
|
||||
}
|
||||
|
||||
$results = DB::table('anime')
|
||||
->orderBy('members')
|
||||
->where('type', 'TV')
|
||||
->where('status', 'Currently Airing');
|
||||
|
||||
$results = $results
|
||||
->get([
|
||||
'mal_id', 'url', 'title', 'image_url', 'synopsis', 'type', 'airing.from', 'episodes', 'members', 'genres', 'source', 'producers', 'score', 'licensors', 'rating', 'broadcast'
|
||||
]);
|
||||
|
||||
|
||||
$items = $this->applyBackwardsCompatibility($results);
|
||||
|
||||
return response()->json($items);
|
||||
|
||||
// $schedule = $this->jikan->getSchedule(new ScheduleRequest());
|
||||
// if (null !== $day) {
|
||||
// $schedule = [
|
||||
// strtolower($day) => $schedule->{'get'.ucfirst(strtolower($day))}(),
|
||||
// ];
|
||||
// }
|
||||
//
|
||||
// return response($this->serializer->serialize($schedule, 'json'));
|
||||
}
|
||||
|
||||
private function applyBackwardsCompatibility($data)
|
||||
{
|
||||
$fingerprint = HttpHelper::resolveRequestFingerprint($this->request);
|
||||
|
||||
$meta = [
|
||||
'request_hash' => $fingerprint,
|
||||
'request_cached' => true,
|
||||
'request_cache_expiry' => 0,
|
||||
];
|
||||
|
||||
$results = [
|
||||
'monday' => [],
|
||||
'tuesday' => [],
|
||||
'wednesday' => [],
|
||||
'thursday' => [],
|
||||
'friday' => [],
|
||||
'saturday' => [],
|
||||
'sunday' => [],
|
||||
'other' => [],
|
||||
'unknown' => []
|
||||
];
|
||||
|
||||
$items = $data->all() ?? [];
|
||||
foreach ($items as &$item) {
|
||||
|
||||
if (isset($item['aired']['from'])) {
|
||||
$item['airing_start'] = $item['aired']['from'];
|
||||
}
|
||||
|
||||
if (isset($item['licensors'])) {
|
||||
$licensors = [];
|
||||
foreach ($item['licensors'] as $licensor) {
|
||||
$licensors[] = $licensor['name'];
|
||||
}
|
||||
|
||||
$item['licensors'] = $licensors;
|
||||
}
|
||||
|
||||
$item['kids'] = false;
|
||||
if (isset($item['rating'])) {
|
||||
if ($item['rating'] === 'G - All Ages' || $item['rating'] === 'PG - Children') {
|
||||
$item['kids'] = true;
|
||||
}
|
||||
}
|
||||
|
||||
$item['r18'] = false;
|
||||
if (isset($item['rating'])) {
|
||||
if ($item['rating'] === 'R+ - Mild Nudity' || $item['rating'] === 'Rx - Hentai') {
|
||||
$item['r18'] = true;
|
||||
}
|
||||
}
|
||||
|
||||
unset($item['_id'], $item['oid'], $item['expiresAt'], $item['aired']);
|
||||
|
||||
if (!isset($item['broadcast'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach (self::VALID_FILTERS as $day) {
|
||||
$broadcastDay = ucfirst($day);
|
||||
|
||||
if (!isset($item['broadcast'])) {
|
||||
continue 2;
|
||||
}
|
||||
|
||||
if (preg_match("~^{$broadcastDay}~", $item['broadcast'])) {
|
||||
unset($item['broadcast']);
|
||||
$results[$day][] = $item;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($results as &$day) {
|
||||
$day = array_reverse($day);
|
||||
}
|
||||
|
||||
if (!is_null($this->day)) {
|
||||
$results = [$this->day => $results[$this->day]];
|
||||
}
|
||||
|
||||
return $meta+$results;
|
||||
}
|
||||
}
|
@ -1,405 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\V3;
|
||||
|
||||
use App\Http\HttpHelper;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Pagination\LengthAwarePaginator;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Jikan\Jikan;
|
||||
use Jikan\MyAnimeList\MalClient;
|
||||
use Jikan\Request\Search\AnimeSearchRequest;
|
||||
use Jikan\Request\Search\MangaSearchRequest;
|
||||
use Jikan\Request\Search\CharacterSearchRequest;
|
||||
use Jikan\Request\Search\PersonSearchRequest;
|
||||
use Jikan\Helper\Constants as JikanConstants;
|
||||
use App\Providers\SearchQueryBuilder;
|
||||
use JMS\Serializer\Serializer;
|
||||
use MongoDB\BSON\UTCDateTime;
|
||||
use phpDocumentor\Reflection\Types\Object_;
|
||||
|
||||
class SearchController extends Controller
|
||||
{
|
||||
|
||||
private $request;
|
||||
const MAX_RESULTS_PER_PAGE = 25;
|
||||
|
||||
public function anime(Request $request, int $page = 1)
|
||||
{
|
||||
$this->request = $request;
|
||||
|
||||
$query = $request->get('q');
|
||||
$page = $request->get('page');
|
||||
$limit = $request->get('limit') ?? self::MAX_RESULTS_PER_PAGE;
|
||||
$score = $request->get('score') ?? 0;
|
||||
$type = $this->getAnimeType($request->get('type'));
|
||||
$status = $this->getStatusType($request->get('status'));
|
||||
$rating = $this->getRatingType($request->get('rated'));
|
||||
$genres = $request->get('genre');
|
||||
$orderBy = $this->getOrderBy($request->get('order_by'));
|
||||
$sort = $this->getSort($request->get('sort'));
|
||||
|
||||
$results = DB::table('anime')
|
||||
->select('mal_id', 'url', 'image_url', 'title', 'airing', 'synopsis', 'type', 'episodes', 'score', 'aired.from', 'aired.to', 'members', 'rating');
|
||||
|
||||
if (!empty($query)) {
|
||||
$results
|
||||
->where('title', 'like', "%$query%")
|
||||
->orWhere('title_english', 'like', "%$query%")
|
||||
->orWhere('title_japanese', 'like', "%$query%");
|
||||
} else {
|
||||
$results
|
||||
->orderBy('mal_id');
|
||||
}
|
||||
|
||||
if (!empty($type)) {
|
||||
$results = $results
|
||||
->where('type', $type);
|
||||
}
|
||||
|
||||
if (!empty($score)) {
|
||||
$score = (float) $score;
|
||||
$results = $results
|
||||
->where('score', '>=', $score);
|
||||
}
|
||||
|
||||
if (!is_null($status)) {
|
||||
$results = $results
|
||||
->where('status', $status);
|
||||
}
|
||||
|
||||
if (!is_null($rating)) {
|
||||
$results = $results
|
||||
->where('rating', $rating);
|
||||
}
|
||||
|
||||
if (!is_null($genres)) {
|
||||
$genres = explode(',', $genres);
|
||||
|
||||
// @todo WIP. Need genre indexing
|
||||
}
|
||||
|
||||
if (!is_null($orderBy)) {
|
||||
$results = $results
|
||||
->orderBy($orderBy, $sort ?? 'asc');
|
||||
}
|
||||
|
||||
if (!empty($limit)) {
|
||||
$limit = (int) $limit;
|
||||
|
||||
if ($limit <= 0) {
|
||||
$limit = 1;
|
||||
}
|
||||
|
||||
if ($limit > self::MAX_RESULTS_PER_PAGE) {
|
||||
$limit = self::MAX_RESULTS_PER_PAGE;
|
||||
}
|
||||
}
|
||||
|
||||
$results = $results
|
||||
->paginate(
|
||||
$limit,
|
||||
null,
|
||||
null,
|
||||
$page
|
||||
);
|
||||
|
||||
$items = $this->applyBackwardsCompatibility($results);
|
||||
|
||||
return response()->json($items);
|
||||
|
||||
|
||||
// $search = $this->jikan->getAnimeSearch(
|
||||
// SearchQueryBuilder::create(
|
||||
// (new AnimeSearchRequest())->setPage($page)
|
||||
// )
|
||||
// );
|
||||
//
|
||||
// return response($this->filter($search));
|
||||
}
|
||||
|
||||
public function manga(Request $request, int $page = 1)
|
||||
{
|
||||
$this->request = $request;
|
||||
|
||||
$query = $request->get('q');
|
||||
$page = $request->get('page');
|
||||
$limit = $request->get('limit') ?? self::MAX_RESULTS_PER_PAGE;
|
||||
$score = $request->get('score') ?? 0;
|
||||
$type = $this->getAnimeType($request->get('type'));
|
||||
$status = $this->getStatusType($request->get('status'));
|
||||
$genres = $request->get('genre');
|
||||
$orderBy = $this->getOrderBy($request->get('order_by'));
|
||||
$sort = $this->getSort($request->get('sort'));
|
||||
|
||||
$results = DB::table('manga')
|
||||
->select('mal_id', 'url', 'image_url', 'title', 'publishing', 'synopsis', 'type', 'chapters', 'volumes', 'score', 'published.from', 'published.to', 'members');
|
||||
|
||||
if (!empty($query)) {
|
||||
$results
|
||||
->where('title', 'like', "%$query%")
|
||||
->orWhere('title_english', 'like', "%$query%")
|
||||
->orWhere('title_japanese', 'like', "%$query%");
|
||||
} else {
|
||||
$results
|
||||
->orderBy('mal_id');
|
||||
}
|
||||
|
||||
if (!empty($type)) {
|
||||
$results = $results
|
||||
->where('type', $type);
|
||||
}
|
||||
|
||||
if (!empty($score)) {
|
||||
$score = (float) $score;
|
||||
$results = $results
|
||||
->where('score', '>=', $score);
|
||||
}
|
||||
|
||||
if (!is_null($status)) {
|
||||
$results = $results
|
||||
->where('status', $status);
|
||||
}
|
||||
|
||||
|
||||
if (!is_null($genres)) {
|
||||
$genres = explode(',', $genres);
|
||||
|
||||
// @todo WIP. Need genre indexing
|
||||
}
|
||||
|
||||
if (!is_null($orderBy)) {
|
||||
$results = $results
|
||||
->orderBy($orderBy, $sort ?? 'asc');
|
||||
}
|
||||
|
||||
if (!empty($limit)) {
|
||||
$limit = (int) $limit;
|
||||
|
||||
if ($limit <= 0) {
|
||||
$limit = 1;
|
||||
}
|
||||
|
||||
if ($limit > self::MAX_RESULTS_PER_PAGE) {
|
||||
$limit = self::MAX_RESULTS_PER_PAGE;
|
||||
}
|
||||
}
|
||||
|
||||
$results = $results
|
||||
->paginate(
|
||||
$limit,
|
||||
null,
|
||||
null,
|
||||
$page
|
||||
);
|
||||
|
||||
$items = $this->applyBackwardsCompatibility($results);
|
||||
|
||||
return response()->json($items);
|
||||
|
||||
$search = $this->jikan->getMangaSearch(
|
||||
SearchQueryBuilder::create(
|
||||
(new MangaSearchRequest())->setPage($page)
|
||||
)
|
||||
);
|
||||
return response($this->filter($search));
|
||||
}
|
||||
|
||||
public function people(int $page = 1)
|
||||
{
|
||||
$search = $this->jikan->getPersonSearch(
|
||||
SearchQueryBuilder::create(
|
||||
(new PersonSearchRequest())->setPage($page)
|
||||
)
|
||||
);
|
||||
|
||||
return response($this->filter($search));
|
||||
}
|
||||
|
||||
public function character(int $page = 1)
|
||||
{
|
||||
$search = $this->jikan->getCharacterSearch(
|
||||
SearchQueryBuilder::create(
|
||||
(new CharacterSearchRequest())->setPage($page)
|
||||
)
|
||||
);
|
||||
|
||||
return response($this->filter($search));
|
||||
}
|
||||
|
||||
|
||||
private function filter($object)
|
||||
{
|
||||
$limit = $_GET['limit'] ?? null;
|
||||
|
||||
$data = json_decode(
|
||||
$this->serializer->serialize($object, 'json'),
|
||||
true
|
||||
);
|
||||
|
||||
if (!is_null($limit)) {
|
||||
$data['results'] = array_slice($data['results'], 0, $limit);
|
||||
}
|
||||
|
||||
return json_encode(
|
||||
$data
|
||||
);
|
||||
}
|
||||
|
||||
private function applyBackwardsCompatibility($data)
|
||||
{
|
||||
$fingerprint = HttpHelper::resolveRequestFingerprint($this->request);
|
||||
|
||||
$meta = [
|
||||
'request_hash' => $fingerprint,
|
||||
'request_cached' => true,
|
||||
'request_cache_expiry' => 0,
|
||||
'last_page' => $data->lastPage()
|
||||
];
|
||||
|
||||
$items = $data->items() ?? [];
|
||||
foreach ($items as &$item) {
|
||||
if (isset($item['aired']['from'])) {
|
||||
$item['start_date'] = $item['aired']['from'];
|
||||
}
|
||||
|
||||
if (isset($item['aired']['to'])) {
|
||||
$item['end_date'] = $item['aired']['to'];
|
||||
}
|
||||
if (isset($item['published']['from'])) {
|
||||
$item['start_date'] = $item['published']['from'];
|
||||
}
|
||||
|
||||
if (isset($item['published']['to'])) {
|
||||
$item['end_date'] = $item['published']['to'];
|
||||
}
|
||||
|
||||
if (isset($item['rating'])) {
|
||||
$item['rated'] = $item['rating'];
|
||||
}
|
||||
|
||||
unset($item['_id'], $item['oid'], $item['expiresAt'], $item['aired'], $item['published'], $item['rating']);
|
||||
}
|
||||
$items = ['results' => $items];
|
||||
|
||||
return $meta+$items;
|
||||
}
|
||||
|
||||
private $animeTypes = [
|
||||
'tv' => 'TV',
|
||||
'movie' => 'Movie',
|
||||
'ova' => 'OVA',
|
||||
'special' => 'Special',
|
||||
'ona' => 'ONA',
|
||||
'music' => 'Music'
|
||||
];
|
||||
private function getAnimeType($type)
|
||||
{
|
||||
if (is_null($type)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$type = strtolower($type);
|
||||
|
||||
return $this->animeTypes[$type] ?? null;
|
||||
}
|
||||
|
||||
private $mangaTypes = [
|
||||
'manga' => 'Manga',
|
||||
'novel' => 'Novel',
|
||||
'oneshot' => 'One-shot',
|
||||
'doujin' => 'Doujinshi',
|
||||
'manhwa' => 'Manhwa',
|
||||
'manhua' => 'Manhua'
|
||||
];
|
||||
private function getMangaTypes($type)
|
||||
{
|
||||
if (is_null($type)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$type = strtolower($type);
|
||||
|
||||
return $this->mangaTypes[$type] ?? null;
|
||||
}
|
||||
|
||||
private $statusTypes = [
|
||||
'airing' => 'Currently Airing',
|
||||
'completed' => 'Finished Airing',
|
||||
'complete' => 'Finished Airing',
|
||||
'to_be_aired' => 'Not yet aired',
|
||||
'tba' => 'Not yet aired',
|
||||
'upcoming' => 'Not yet aired',
|
||||
];
|
||||
private function getStatusType($type)
|
||||
{
|
||||
if (is_null($type)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$type = strtolower($type);
|
||||
|
||||
return $this->statusTypes[$type] ?? null;
|
||||
}
|
||||
|
||||
private $ratingType = [
|
||||
'g' => 'G - All Ages',
|
||||
'pg' => 'PG - Children',
|
||||
'pg13' => 'PG-13 - Teens 13 or older',
|
||||
'r17' => 'R - 17+ (violence & profanity)',
|
||||
'r' => 'R+ - Mild Nudity',
|
||||
'rx' => 'Rx - Hentai'
|
||||
];
|
||||
private function getRatingType($type)
|
||||
{
|
||||
if (is_null($type)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$type = strtolower($type);
|
||||
|
||||
return $this->ratingType[$type] ?? null;
|
||||
}
|
||||
|
||||
private $orderByType = [
|
||||
'title' => 'title',
|
||||
'start_date' => 'aired.from',
|
||||
'end_date' => 'aired.to',
|
||||
'score' => 'score',
|
||||
'type' => 'type',
|
||||
'members' => 'members',
|
||||
'id' => 'mal_id',
|
||||
'episodes' => 'episodes',
|
||||
'chapters' => 'chapters',
|
||||
'volumes' => 'volumes',
|
||||
'rating' => 'rating'
|
||||
];
|
||||
private function getOrderBy($orderBy) {
|
||||
$orderBy = strtolower($orderBy);
|
||||
|
||||
if (!in_array($orderBy, [
|
||||
'title', 'start_date', 'end_date', 'score', 'type', 'members', 'id', 'episodes', 'rating'
|
||||
])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
return $this->orderByType[$orderBy] ?? null;
|
||||
}
|
||||
|
||||
private $sortType = [
|
||||
'ascending' => 'asc',
|
||||
'asc' => 'asc',
|
||||
'descending' => 'desc',
|
||||
'desc' => 'desc',
|
||||
];
|
||||
private function getSort($sort) {
|
||||
if (is_null($sort)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$sort = strtolower($sort);
|
||||
|
||||
return $this->sortType[$sort] ?? null;
|
||||
}
|
||||
}
|
@ -1,175 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\V3;
|
||||
|
||||
use App\Http\HttpHelper;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Jikan\Request\Seasonal\SeasonalRequest;
|
||||
use Jikan\Request\SeasonList\SeasonListRequest;
|
||||
|
||||
class SeasonController extends Controller
|
||||
{
|
||||
private const VALID_SEASONS = [
|
||||
'summer',
|
||||
'spring',
|
||||
'winter',
|
||||
'fall'
|
||||
];
|
||||
|
||||
private $request;
|
||||
private $season;
|
||||
private $year;
|
||||
|
||||
public function main(Request $request, ?int $year = null, ?string $season = null)
|
||||
{
|
||||
$this->request = $request;
|
||||
|
||||
if (!is_null($season) && !\in_array(strtolower($season), self::VALID_SEASONS)) {
|
||||
return response()->json([
|
||||
'error' => 'Bad Request'
|
||||
])->setStatusCode(400);
|
||||
}
|
||||
|
||||
if (!is_null($season)) {
|
||||
$this->season = ucfirst(
|
||||
strtolower($season)
|
||||
);
|
||||
}
|
||||
|
||||
if (!is_null($year)) {
|
||||
$this->year = (int) $year;
|
||||
}
|
||||
|
||||
if (is_null($season) && is_null($year)) {
|
||||
list($this->season, $this->year) = $this->getSeasonStr();
|
||||
}
|
||||
|
||||
$results = DB::table('anime')
|
||||
->where('premiered', "{$this->season} $this->year")
|
||||
->orderBy('members', 'desc')
|
||||
->get([
|
||||
'mal_id', 'url', 'title', 'image_url', 'synopsis', 'type', 'airing_start', 'episodes', 'members', 'genres', 'source', 'producers', 'score', 'licensors', 'rating'
|
||||
]);
|
||||
|
||||
$items = $this->applyBackwardsCompatibility($results, 'anime');
|
||||
|
||||
return response($items);
|
||||
|
||||
// $season = $this->jikan->getSeasonal(new SeasonalRequest($year, $season));
|
||||
//
|
||||
// return response($this->serializer->serialize($season, 'json'));
|
||||
}
|
||||
|
||||
public function archive()
|
||||
{
|
||||
return response(
|
||||
$this->serializer->serialize(
|
||||
['archive' => $this->jikan->getSeasonList(new SeasonListRequest())],
|
||||
'json'
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public function later(Request $request)
|
||||
{
|
||||
$this->request = $request;
|
||||
$nextYear = (new \DateTime(null, new \DateTimeZone('Asia/Tokyo')))
|
||||
->modify('+1 year')
|
||||
->format('Y');
|
||||
|
||||
$results = DB::table('anime')
|
||||
->where('status', 'Not yet aired')
|
||||
->where('premiered', 'like', "%{$nextYear}%")
|
||||
->orderBy('members', 'desc')
|
||||
->get([
|
||||
'mal_id', 'url', 'title', 'image_url', 'synopsis', 'type', 'airing_start', 'episodes', 'members', 'genres', 'source', 'producers', 'score', 'licensors', 'rating'
|
||||
]);
|
||||
|
||||
$this->season = 'Later';
|
||||
$items = $this->applyBackwardsCompatibility($results, 'anime');
|
||||
|
||||
return response($items);
|
||||
|
||||
// $season = $this->jikan->getSeasonal(new SeasonalRequest(null, null, true));
|
||||
// return response($this->serializer->serialize($season, 'json'));
|
||||
}
|
||||
|
||||
private function applyBackwardsCompatibility($data, $type)
|
||||
{
|
||||
$fingerprint = HttpHelper::resolveRequestFingerprint($this->request);
|
||||
|
||||
$meta = [
|
||||
'request_hash' => $fingerprint,
|
||||
'request_cached' => true,
|
||||
'request_cache_expiry' => 0,
|
||||
'season_name' => $this->season,
|
||||
'season_year' => $this->year
|
||||
];
|
||||
|
||||
$items = $data->all() ?? [];
|
||||
foreach ($items as &$item) {
|
||||
|
||||
if (isset($item['aired']['from'])) {
|
||||
$item['airing_start'] = $item['aired']['from'];
|
||||
}
|
||||
|
||||
if (isset($item['published']['from'])) {
|
||||
$item['publishing_start'] = $item['aired']['from'];
|
||||
}
|
||||
|
||||
if (isset($item['licensors'])) {
|
||||
$licensors = [];
|
||||
foreach ($item['licensors'] as $licensor) {
|
||||
$licensors[] = $licensor['name'];
|
||||
}
|
||||
|
||||
$item['licensors'] = $licensors;
|
||||
}
|
||||
|
||||
|
||||
$item['kids'] = false;
|
||||
if (isset($item['rating'])) {
|
||||
if ($item['rating'] === 'G - All Ages' || $item['rating'] === 'PG - Children') {
|
||||
$item['kids'] = true;
|
||||
}
|
||||
}
|
||||
|
||||
$item['r18'] = false;
|
||||
if (isset($item['rating'])) {
|
||||
if ($item['rating'] === 'R+ - Mild Nudity' || $item['rating'] === 'Rx - Hentai') {
|
||||
$item['r18'] = true;
|
||||
}
|
||||
}
|
||||
|
||||
// @todo : no way of knowing this at the moment; defaulted to false
|
||||
$item['continuing'] = false;
|
||||
|
||||
unset($item['_id'], $item['oid'], $item['expiresAt'], $item['aired'], $item['rating']);
|
||||
}
|
||||
|
||||
$items = [$type => $items];
|
||||
|
||||
return $meta+$items;
|
||||
}
|
||||
|
||||
private function getSeasonStr() : array
|
||||
{
|
||||
$date = new \DateTime(null, new \DateTimeZone('Asia/Tokyo'));
|
||||
|
||||
$year = (int) $date->format('Y');
|
||||
$month = (int) $date->format('n');
|
||||
|
||||
switch ($month) {
|
||||
case \in_array($month, range(1, 3)):
|
||||
return ['Winter', $year];
|
||||
case \in_array($month, range(4, 6)):
|
||||
return ['Spring', $year];
|
||||
case \in_array($month, range(7, 9)):
|
||||
return ['Summer', $year];
|
||||
case \in_array($month, range(10, 12)):
|
||||
return ['Fall', $year];
|
||||
default: throw new \Exception('Could not generate seasonal string');
|
||||
}
|
||||
}
|
||||
}
|
@ -1,271 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\V3;
|
||||
|
||||
use App\Http\HttpHelper;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Jikan\Request\Top\TopAnimeRequest;
|
||||
use Jikan\Request\Top\TopMangaRequest;
|
||||
use Jikan\Request\Top\TopCharactersRequest;
|
||||
use Jikan\Request\Top\TopPeopleRequest;
|
||||
use Jikan\Helper\Constants as JikanConstants;
|
||||
|
||||
class TopController extends Controller
|
||||
{
|
||||
|
||||
private $request;
|
||||
const MAX_RESULTS_PER_PAGE = 25;
|
||||
|
||||
public function anime(Request $request, int $page = 1, string $type = null)
|
||||
{
|
||||
$this->request = $request;
|
||||
|
||||
$animeType = $this->getAnimeType($type);
|
||||
$filterType = $this->getFilterType($type);
|
||||
|
||||
if (!is_null($type) && !\in_array(strtolower($type), [
|
||||
JikanConstants::TOP_AIRING,
|
||||
JikanConstants::TOP_UPCOMING,
|
||||
JikanConstants::TOP_TV,
|
||||
JikanConstants::TOP_MOVIE,
|
||||
JikanConstants::TOP_OVA,
|
||||
JikanConstants::TOP_SPECIAL,
|
||||
JikanConstants::TOP_BY_POPULARITY,
|
||||
JikanConstants::TOP_BY_FAVORITES,
|
||||
])) {
|
||||
return response()->json([
|
||||
'error' => 'Bad Request'
|
||||
])->setStatusCode(400);
|
||||
}
|
||||
$results = DB::table('anime')
|
||||
->whereNotNull('rank')
|
||||
->where('rank', '>', 0)
|
||||
->orderBy('rank', 'asc')
|
||||
->where('status', '!=', 'Not yet aired')
|
||||
->where('rating', '!=', 'Rx - Hentai');
|
||||
|
||||
if (!is_null($animeType)) {
|
||||
$results = $results
|
||||
->where('type', $animeType);
|
||||
}
|
||||
|
||||
if (!is_null($filterType) && $filterType === 'airing') {
|
||||
$results = $results
|
||||
->where('airing', true);
|
||||
}
|
||||
|
||||
if (!is_null($filterType) && $filterType === 'upcoming') {
|
||||
$results = $results
|
||||
->where('status', 'Not yet aired');
|
||||
}
|
||||
|
||||
if (!is_null($filterType) && $filterType === 'bypopularity') {
|
||||
$results = $results
|
||||
->orderBy('members', 'desc');
|
||||
}
|
||||
|
||||
if (!is_null($filterType) && $filterType === 'favorite') {
|
||||
$results = $results
|
||||
->orderBy('favorites', 'desc');
|
||||
}
|
||||
$results = $results
|
||||
->paginate(
|
||||
self::MAX_RESULTS_PER_PAGE,
|
||||
[
|
||||
'mal_id', 'rank', 'title', 'url', 'image_url', 'type', 'episodes', 'aired.from', 'aired.to', 'members', 'score'
|
||||
],
|
||||
null,
|
||||
$page
|
||||
);
|
||||
|
||||
$items = $this->applyBackwardsCompatibility($results);
|
||||
|
||||
return response()->json($items);
|
||||
//
|
||||
// $anime = $this->jikan->getTopAnime(new TopAnimeRequest($page, $type));
|
||||
//
|
||||
// $top = ['top' => $this->jikan->getTopAnime(new TopAnimeRequest($page, $type))];
|
||||
//
|
||||
// return response($this->serializer->serialize($top, 'json'));
|
||||
}
|
||||
|
||||
public function manga(Request $request, int $page = 1, string $type = null)
|
||||
{
|
||||
$this->request = $request;
|
||||
|
||||
$mangaType = $this->getMangaType($type);
|
||||
$filterType = $this->getFilterType($type);
|
||||
|
||||
if (!is_null($type) && !\in_array(
|
||||
strtolower($type),
|
||||
[
|
||||
JikanConstants::TOP_MANGA,
|
||||
JikanConstants::TOP_NOVEL,
|
||||
JikanConstants::TOP_ONE_SHOT,
|
||||
JikanConstants::TOP_DOUJINSHI,
|
||||
JikanConstants::TOP_MANHWA,
|
||||
JikanConstants::TOP_MANHUA,
|
||||
JikanConstants::TOP_BY_POPULARITY,
|
||||
JikanConstants::TOP_BY_FAVORITES,
|
||||
]
|
||||
)) {
|
||||
return response()->json([
|
||||
'error' => 'Bad Request'
|
||||
])->setStatusCode(400);
|
||||
}
|
||||
|
||||
$results = DB::table('manga')
|
||||
->whereNotNull('rank')
|
||||
->where('rank', '>', 0)
|
||||
->orderBy('rank', 'asc')
|
||||
->where('type', '!=', 'Doujinshi');
|
||||
|
||||
if (!is_null($mangaType)) {
|
||||
$results = $results
|
||||
->where('type', $type);
|
||||
}
|
||||
|
||||
if (!is_null($filterType) && $filterType === 'publishing') {
|
||||
$results = $results
|
||||
->where('publishing', true);
|
||||
}
|
||||
|
||||
if (!is_null($filterType) && $filterType === 'bypopularity') {
|
||||
$results = $results
|
||||
->orderBy('popularity', 'desc');
|
||||
}
|
||||
|
||||
if (!is_null($filterType) && $filterType === 'favorite') {
|
||||
$results = $results
|
||||
->orderBy('favorites', 'desc');
|
||||
}
|
||||
|
||||
$results = $results
|
||||
->paginate(
|
||||
self::MAX_RESULTS_PER_PAGE,
|
||||
[
|
||||
'mal_id', 'rank', 'title', 'url', 'image_url', 'type', 'episodes', 'aired.from', 'aired.to', 'members', 'score'
|
||||
],
|
||||
null,
|
||||
$page
|
||||
);
|
||||
|
||||
$items = $this->applyBackwardsCompatibility($results);
|
||||
|
||||
return response()->json($items);
|
||||
|
||||
// $top = ['top' => $this->jikan->getTopManga(new TopMangaRequest($page, $type))];
|
||||
//
|
||||
// return response($this->serializer->serialize($top, 'json'));
|
||||
}
|
||||
|
||||
public function people(int $page = 1)
|
||||
{
|
||||
$top = ['top' => $this->jikan->getTopPeople(new TopPeopleRequest($page))];
|
||||
|
||||
return response($this->serializer->serialize($top, 'json'));
|
||||
}
|
||||
|
||||
public function characters(int $page = 1)
|
||||
{
|
||||
$top = ['top' => $this->jikan->getTopCharacters(new TopCharactersRequest($page))];
|
||||
|
||||
return response($this->serializer->serialize($top, 'json'));
|
||||
}
|
||||
|
||||
private function applyBackwardsCompatibility($data)
|
||||
{
|
||||
$fingerprint = HttpHelper::resolveRequestFingerprint($this->request);
|
||||
|
||||
$meta = [
|
||||
'request_hash' => $fingerprint,
|
||||
'request_cached' => true,
|
||||
'request_cache_expiry' => 0,
|
||||
'last_page' => $data->lastPage()
|
||||
];
|
||||
|
||||
$items = $data->items() ?? [];
|
||||
foreach ($items as &$item) {
|
||||
if (isset($item['aired']['from'])) {
|
||||
$item['start_date'] = $item['aired']['from'];
|
||||
}
|
||||
|
||||
if (isset($item['aired']['to'])) {
|
||||
$item['end_date'] = $item['aired']['to'];
|
||||
}
|
||||
if (isset($item['published']['from'])) {
|
||||
$item['start_date'] = $item['published']['from'];
|
||||
}
|
||||
|
||||
if (isset($item['published']['to'])) {
|
||||
$item['end_date'] = $item['published']['to'];
|
||||
}
|
||||
|
||||
if (isset($item['rating'])) {
|
||||
$item['rated'] = $item['rating'];
|
||||
}
|
||||
|
||||
unset($item['_id'], $item['oid'], $item['expiresAt'], $item['aired'], $item['published']);
|
||||
}
|
||||
$items = ['top' => $items];
|
||||
|
||||
return $meta+$items;
|
||||
}
|
||||
|
||||
private $animeTypes = [
|
||||
'tv' => 'TV',
|
||||
'movie' => 'Movie',
|
||||
'ova' => 'OVA',
|
||||
'special' => 'Special',
|
||||
'ona' => 'ONA',
|
||||
'music' => 'Music',
|
||||
];
|
||||
private function getAnimeType($type)
|
||||
{
|
||||
if (is_null($type)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$type = strtolower($type);
|
||||
|
||||
return $this->animeTypes[$type] ?? null;
|
||||
}
|
||||
|
||||
private $mangaTypes = [
|
||||
'manga' => 'Manga',
|
||||
'novels' => 'Novel',
|
||||
'oneshots' => 'One-shot',
|
||||
'doujin' => 'Doujinshi',
|
||||
'manhwa' => 'Manhwa',
|
||||
'manhua' => 'Manhua'
|
||||
];
|
||||
private function getMangaType($type)
|
||||
{
|
||||
if (is_null($type)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$type = strtolower($type);
|
||||
|
||||
return $this->mangaTypes[$type] ?? null;
|
||||
}
|
||||
|
||||
private $filterTypes = [
|
||||
'airing', 'upcoming', 'bypopularity', 'favorites'
|
||||
];
|
||||
private function getFilterType($type)
|
||||
{
|
||||
if (is_null($type)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$type = strtolower($type);
|
||||
|
||||
if (in_array($type, $this->filterTypes)) {
|
||||
return $type;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
@ -1,125 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\V3;
|
||||
|
||||
use App\Providers\UserListQueryBuilder;
|
||||
use Jikan\Request\User\UserAnimeListRequest;
|
||||
use Jikan\Request\User\UserMangaListRequest;
|
||||
use Jikan\Request\User\UserProfileRequest;
|
||||
use Jikan\Request\User\UserFriendsRequest;
|
||||
use Jikan\Request\User\UserHistoryRequest;
|
||||
|
||||
class UserController extends Controller
|
||||
{
|
||||
public function profile(string $username)
|
||||
{
|
||||
$person = $this->jikan->getUserProfile(new UserProfileRequest($username));
|
||||
return response($this->serializer->serialize($person, 'json'));
|
||||
}
|
||||
|
||||
public function history(string $username, ?string $type = null)
|
||||
{
|
||||
if (!is_null($type) && !\in_array(strtolower($type), ['anime', 'manga'])) {
|
||||
return response()->json([
|
||||
'error' => 'Bad Request'
|
||||
])->setStatusCode(400);
|
||||
}
|
||||
|
||||
$person = ['history' => $this->jikan->getUserHistory(new UserHistoryRequest($username, $type))];
|
||||
|
||||
return response($this->serializer->serialize($person, 'json'));
|
||||
}
|
||||
|
||||
public function friends(string $username, int $page = 1)
|
||||
{
|
||||
$person = ['friends' => $this->jikan->getUserFriends(new UserFriendsRequest($username, $page))];
|
||||
return response($this->serializer->serialize($person, 'json'));
|
||||
}
|
||||
|
||||
public function animelist(string $username, ?string $status = null, int $page = 1)
|
||||
{
|
||||
if (!is_null($status)) {
|
||||
$status = strtolower($status);
|
||||
|
||||
if (!\in_array($status, ['all', 'watching', 'completed', 'onhold', 'dropped', 'plantowatch', 'ptw'])) {
|
||||
return response()->json([
|
||||
'error' => 'Bad Request'
|
||||
])->setStatusCode(400);
|
||||
}
|
||||
}
|
||||
$status = $this->listStatusToId($status);
|
||||
|
||||
return response(
|
||||
$this->serializer->serialize(
|
||||
[
|
||||
'anime' => $this->jikan->getUserAnimeList(
|
||||
UserListQueryBuilder::create(
|
||||
(new UserAnimeListRequest($username))
|
||||
->setPage($page)
|
||||
->setStatus($status)
|
||||
)
|
||||
)
|
||||
],
|
||||
'json'
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public function mangalist(string $username, ?string $status = null, int $page = 1)
|
||||
{
|
||||
if (!is_null($status)) {
|
||||
$status = strtolower($status);
|
||||
|
||||
if (!\in_array($status, ['all', 'reading', 'completed', 'onhold', 'dropped', 'plantoread', 'ptr'])) {
|
||||
return response()->json([
|
||||
'error' => 'Bad Request'
|
||||
])->setStatusCode(400);
|
||||
}
|
||||
}
|
||||
$status = $this->listStatusToId($status);
|
||||
|
||||
return response(
|
||||
$this->serializer->serialize(
|
||||
[
|
||||
'manga' => $this->jikan->getUserMangaList(
|
||||
UserListQueryBuilder::create(
|
||||
(new UserMangaListRequest($username))
|
||||
->setPage($page)
|
||||
->setStatus($status)
|
||||
)
|
||||
)
|
||||
],
|
||||
'json'
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
private function listStatusToId(?string $status) : int
|
||||
{
|
||||
if (is_null($status)) {
|
||||
return 7;
|
||||
}
|
||||
|
||||
switch ($status) {
|
||||
case 'all':
|
||||
return 7;
|
||||
case 'watching':
|
||||
case 'reading':
|
||||
return 1;
|
||||
case 'completed':
|
||||
return 2;
|
||||
case 'onhold':
|
||||
return 3;
|
||||
case 'dropped':
|
||||
return 4;
|
||||
case 'plantowatch':
|
||||
case 'ptw':
|
||||
case 'plantoread':
|
||||
case 'ptr':
|
||||
return 6;
|
||||
default:
|
||||
return 7;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
@ -1,41 +0,0 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
@ -1,40 +0,0 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
@ -1,79 +0,0 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources\V3;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class AnimeReviewsResource 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;
|
||||
}
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources\V3;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class AnimeUserUpdatesResource 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;
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
@ -1,77 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources\V3;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class CharacterResource extends JsonResource
|
||||
{
|
||||
|
||||
/**
|
||||
* Transform the resource into an array.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return array
|
||||
*/
|
||||
public function toArray($request)
|
||||
{
|
||||
return [
|
||||
'mal_id' => $this->mal_id,
|
||||
'url' => $this->url,
|
||||
'image_url' => $this->images['jpg']['image_url'],
|
||||
'name' => $this->name,
|
||||
'nicknames' => $this->nicknames,
|
||||
'member_favorites' => $this->favorites,
|
||||
'about' => $this->about,
|
||||
'animeography' => $this->bcAnimeography($this->animeography),
|
||||
'mangaography' => $this->bcMangaography($this->mangaography),
|
||||
'voice_actors' => $this->bcVoiceActors($this->voice_actors)
|
||||
];
|
||||
}
|
||||
|
||||
private function bcAnimeography($ography) : array
|
||||
{
|
||||
foreach ($ography as &$entry) {
|
||||
$entry = [
|
||||
'mal_id' => $entry['anime']['mal_id'],
|
||||
'name' => $entry['anime']['title'],
|
||||
'url' => $entry['anime']['url'],
|
||||
'image_url' => $entry['anime']['images']['jpg']['image_url'],
|
||||
'role' => $entry['role'],
|
||||
];
|
||||
}
|
||||
|
||||
return $ography;
|
||||
}
|
||||
|
||||
private function bcMangaography($ography) : array
|
||||
{
|
||||
foreach ($ography as &$entry) {
|
||||
$entry = [
|
||||
'mal_id' => $entry['manga']['mal_id'],
|
||||
'name' => $entry['manga']['title'],
|
||||
'url' => $entry['manga']['url'],
|
||||
'image_url' => $entry['manga']['images']['jpg']['image_url'],
|
||||
'role' => $entry['role'],
|
||||
];
|
||||
}
|
||||
|
||||
return $ography;
|
||||
}
|
||||
|
||||
private function bcVoiceActors($voiceActors) : array
|
||||
{
|
||||
foreach ($voiceActors as &$person) {
|
||||
$person = [
|
||||
'mal_id' => $person['person']['mal_id'],
|
||||
'name' => $person['person']['name'],
|
||||
'url' => $person['person']['url'],
|
||||
'image_url' => $person['person']['images']['jpg']['image_url'],
|
||||
'language' => $person['language'],
|
||||
];
|
||||
}
|
||||
|
||||
return $voiceActors;
|
||||
}
|
||||
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources\V3;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class MangaCharactersResource extends JsonResource
|
||||
{
|
||||
public function toArray($request)
|
||||
{
|
||||
return [
|
||||
'characters' => $this->bcCharacters($this['characters'])
|
||||
];
|
||||
}
|
||||
|
||||
private function bcCharacters($characters) : array
|
||||
{
|
||||
|
||||
return $characters;
|
||||
}
|
||||
}
|
@ -1,40 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources\V3;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class MangaNewsResource 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;
|
||||
}
|
||||
}
|
@ -1,69 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources\V3;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class MangaResource 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'],
|
||||
'title' => $this->title,
|
||||
'title_english' => $this->title_english,
|
||||
'title_japanese' => $this->title_japanese,
|
||||
'title_synonyms' => $this->title_synonyms,
|
||||
'type' => $this->type,
|
||||
'chapters' => $this->chapters,
|
||||
'volumes' => $this->volumes,
|
||||
'publishing' => $this->publishing,
|
||||
'published' => $this->published,
|
||||
'scored' => $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,
|
||||
'related' => $this->bcRelations($this->related),
|
||||
'authors' => $this->authors,
|
||||
'serializations' => $this->serializations,
|
||||
'genres' => $this->genres,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources\V3;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class MangaReviewsResource 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'],
|
||||
'chapters_read' => $review['chapters_read'],
|
||||
'scores' => $review['scores'],
|
||||
],
|
||||
'content' => $review['review'],
|
||||
];
|
||||
}
|
||||
|
||||
return $reviews;
|
||||
}
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources\V3;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class MangaStatisticsResource extends JsonResource
|
||||
{
|
||||
public function toArray($request)
|
||||
{
|
||||
return [
|
||||
'reading' => $this['reading'],
|
||||
'completed' => $this['completed'],
|
||||
'on_hold' => $this['on_hold'],
|
||||
'dropped' => $this['dropped'],
|
||||
'plan_to_read' => $this['plan_to_read'],
|
||||
'total' => $this['total'],
|
||||
'scores' => $this->bcScores($this['scores'])
|
||||
];
|
||||
}
|
||||
|
||||
private function bcScores($scores) : array
|
||||
{
|
||||
foreach ($scores as &$score) {
|
||||
unset($score['score']);
|
||||
}
|
||||
|
||||
return $scores;
|
||||
}
|
||||
}
|
@ -1,35 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources\V3;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class MangaUserUpdatesResource 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'],
|
||||
'volumes_read' => $user['volumes_read'],
|
||||
'volumes_total' => $user['volumes_total'],
|
||||
'chapters_read' => $user['chapters_read'],
|
||||
'chapters_total' => $user['chapters_total'],
|
||||
'date' => $user['date'],
|
||||
];
|
||||
}
|
||||
|
||||
return $users;
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources\V3;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class MoreInfoResource extends JsonResource
|
||||
{
|
||||
|
||||
public function toArray($request)
|
||||
{
|
||||
return [
|
||||
'moreinfo' => $this['moreinfo']
|
||||
];
|
||||
}
|
||||
}
|
@ -1,91 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources\V3;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class PersonResource extends JsonResource
|
||||
{
|
||||
/**
|
||||
* Transform the resource into an array.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return array
|
||||
*/
|
||||
public function toArray($request)
|
||||
{
|
||||
return [
|
||||
'mal_id' => $this->mal_id,
|
||||
'url' => $this->url,
|
||||
'website_url' => $this->website_url,
|
||||
'image_url' => $this->images['jpg']['image_url'],
|
||||
'name' => $this->name,
|
||||
'given_name' => $this->given_name,
|
||||
'family_name' => $this->family_name,
|
||||
'alternate_names' => $this->alternate_names,
|
||||
'birthday' => $this->birthday,
|
||||
'member_favorites' => $this->favorites,
|
||||
'about' => $this->about,
|
||||
'voice_acting_roles' => $this->bcVoiceActingRoles($this->voice_acting_roles),
|
||||
'anime_staff_positions' => $this->bcAnimeStaffPositions($this->anime_staff_positions),
|
||||
'published_manga' => $this->bcPublishedManga($this->published_manga),
|
||||
];
|
||||
}
|
||||
|
||||
private function bcVoiceActingRoles($voiceActingRoles) : array
|
||||
{
|
||||
foreach ($voiceActingRoles as &$voiceActor) {
|
||||
$voiceActor = [
|
||||
'role' => $voiceActor['role'],
|
||||
'anime' => [
|
||||
'mal_id' => $voiceActor['anime']['mal_id'],
|
||||
'url' => $voiceActor['anime']['url'],
|
||||
'image_url' => $voiceActor['anime']['images']['jpg']['image_url'],
|
||||
'name' => $voiceActor['anime']['title'],
|
||||
],
|
||||
'character' => [
|
||||
'mal_id' => $voiceActor['character']['mal_id'],
|
||||
'url' => $voiceActor['character']['url'],
|
||||
'image_url' => $voiceActor['character']['images']['jpg']['image_url'],
|
||||
'name' => $voiceActor['character']['name'],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
return $voiceActingRoles;
|
||||
}
|
||||
|
||||
private function bcAnimeStaffPositions($animeStaffPositions) : array
|
||||
{
|
||||
foreach ($animeStaffPositions as &$anime) {
|
||||
$anime = [
|
||||
'position' => $anime['position'],
|
||||
'anime' => [
|
||||
'mal_id' => $anime['anime']['mal_id'],
|
||||
'url' => $anime['anime']['url'],
|
||||
'image_url' => $anime['anime']['images']['jpg']['image_url'],
|
||||
'name' => $anime['anime']['title'],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
return $animeStaffPositions;
|
||||
}
|
||||
|
||||
private function bcPublishedManga($publishedManga) : array
|
||||
{
|
||||
foreach ($publishedManga as &$manga) {
|
||||
$manga = [
|
||||
'position' => $manga['position'],
|
||||
'manga' => [
|
||||
'mal_id' => $manga['manga']['mal_id'],
|
||||
'url' => $manga['manga']['url'],
|
||||
'image_url' => $manga['manga']['images']['jpg']['image_url'],
|
||||
'name' => $manga['manga']['title'],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
return $publishedManga;
|
||||
}
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
@ -167,36 +167,6 @@ $app->router->group(
|
||||
}
|
||||
);
|
||||
|
||||
$app->router->group(
|
||||
[
|
||||
'prefix' => 'v3',
|
||||
'namespace' => 'App\Http\Controllers\V3',
|
||||
'middleware' => $commonMiddleware
|
||||
],
|
||||
function ($router) {
|
||||
require __DIR__.'/../routes/web.v3.php';
|
||||
}
|
||||
);
|
||||
|
||||
$app->router->group(
|
||||
[
|
||||
'prefix' => 'v3',
|
||||
'namespace' => 'App\Http\Controllers\V3',
|
||||
'middleware' => $commonMiddleware
|
||||
],
|
||||
function ($router) {
|
||||
$router->get('/', function () {
|
||||
return response()
|
||||
->json([
|
||||
'status' => 400,
|
||||
'type' => 'HttpException',
|
||||
'message' => 'Unavailable on test endpoint.',
|
||||
'error' => null
|
||||
], 400);
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
$app->router->group(
|
||||
[
|
||||
'prefix' => '/',
|
||||
@ -253,5 +223,22 @@ $app->router->group(
|
||||
}
|
||||
);
|
||||
|
||||
$app->router->group(
|
||||
[
|
||||
'prefix' => 'v3',
|
||||
],
|
||||
function ($router) {
|
||||
$router->get('/', function () {
|
||||
return response()
|
||||
->json([
|
||||
'status' => 400,
|
||||
'type' => 'HttpException',
|
||||
'message' => 'This version is discontinued. Please check the documentation for supported version(s).',
|
||||
'error' => null
|
||||
], 400);
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
return $app;
|
||||
|
@ -1,12 +0,0 @@
|
||||
[program:jikan-worker]
|
||||
process_name=%(program_name)s_%(process_num)02d
|
||||
command=php /var/www/jikan-rest/artisan queue:work --queue=high,low --tries=3
|
||||
autostart=true
|
||||
autorestart=true
|
||||
;user=forge
|
||||
; Number of active jikan workers, you can change this
|
||||
numprocs=3
|
||||
;redirect_stderr=true
|
||||
; Feel free to comment out `stdout_logfile`, it's just for debugging purposes
|
||||
stdout_logfile=/var/www/jikan-rest/storage/logs/worker.log
|
||||
stderr_logfile=/var/www/jikan-rest/storage/logs/worker.error.log
|
@ -1,90 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'AnimeController@main' => 'anime',
|
||||
'AnimeController@characters_staff' => 'anime_characters_staff',
|
||||
'AnimeController@episodes' => 'anime_episodes',
|
||||
'AnimeController@episode' => 'anime_episode',
|
||||
'AnimeController@news' => 'anime_news',
|
||||
'AnimeController@forum' => 'anime_forum',
|
||||
'AnimeController@videos' => 'anime_videos',
|
||||
'AnimeController@pictures' => 'anime_pictures',
|
||||
'AnimeController@stats' => 'anime_stats',
|
||||
'AnimeController@moreInfo' => 'anime_moreinfo',
|
||||
'AnimeController@recommendations' => 'anime_recommendations',
|
||||
'AnimeController@userupdates' => 'anime_userupdates',
|
||||
'AnimeController@reviews' => 'anime_reviews',
|
||||
|
||||
'MangaController@main' => 'manga',
|
||||
'MangaController@characters' => 'manga_characters',
|
||||
'MangaController@news' => 'manga_news',
|
||||
'MangaController@forum' => 'manga_forum',
|
||||
'MangaController@pictures' => 'manga_pictures',
|
||||
'MangaController@stats' => 'manga_stats',
|
||||
'MangaController@moreInfo' => 'manga_moreinfo',
|
||||
'MangaController@recommendations' => 'manga_recommendations',
|
||||
'MangaController@userupdates' => 'manga_userupdates',
|
||||
'MangaController@reviews' => 'manga_reviews',
|
||||
|
||||
'CharacterController@main' => 'characters',
|
||||
'CharacterController@pictures' => 'characters_pictures',
|
||||
|
||||
'PersonController@main' => 'people',
|
||||
'PersonController@pictures' => 'people_pictures',
|
||||
|
||||
'SeasonController@archive' => 'season_archive',
|
||||
'SeasonController@later' => 'season_later',
|
||||
'SeasonController@main' => 'season',
|
||||
|
||||
'ScheduleController@main' => 'schedule',
|
||||
|
||||
'ProducerController@main' => 'producers',
|
||||
'ProducerController@resource' => 'producers_anime',
|
||||
|
||||
'MagazineController@main' => 'magazines',
|
||||
'MagazineController@resource' => 'magazines_manga',
|
||||
|
||||
'UserController@recentlyOnline' => 'users_recently_online',
|
||||
'UserController@profile' => 'users',
|
||||
'UserController@history' => 'users_history',
|
||||
'UserController@friends' => 'users_friends',
|
||||
'UserController@animelist' => 'users_animelist',
|
||||
'UserController@mangalist' => 'users_mangalist',
|
||||
'UserController@recommendations' => 'users_recommendations',
|
||||
'UserController@reviews' => 'users_reviews',
|
||||
'UserController@clubs' => 'users_clubs',
|
||||
|
||||
'GenreController@animeListing' => 'genres',
|
||||
'GenreController@mangaListing' => 'genres',
|
||||
'GenreController@anime' => 'genres_anime',
|
||||
'GenreController@manga' => 'genres_manga',
|
||||
|
||||
'TopController@anime' => 'top_anime',
|
||||
'TopController@manga' => 'top_manga',
|
||||
'TopController@characters' => 'top_characters',
|
||||
'TopController@people' => 'top_people',
|
||||
'ReviewsController@bestVoted' => 'top_reviews',
|
||||
|
||||
'SearchController@anime' => 'search_anime',
|
||||
'SearchController@manga' => 'search_manga',
|
||||
'SearchController@character' => 'search_characters',
|
||||
'SearchController@people' => 'search_people',
|
||||
'SearchController@users' => 'search_users',
|
||||
'SearchController@userById' => 'search_users_by_id',
|
||||
|
||||
'ClubController@main' => 'clubs',
|
||||
'ClubController@members' => 'clubs_members',
|
||||
|
||||
'ReviewsController@anime' => 'reviews',
|
||||
'ReviewsController@manga' => 'reviews',
|
||||
|
||||
'RecommendationsController@anime' => 'recommendations',
|
||||
'RecommendationsController@manga' => 'recommendations',
|
||||
|
||||
'WatchController@recentEpisodes' => 'watch',
|
||||
'WatchController@popularEpisodes' => 'watch',
|
||||
'WatchController@recentPromos' => 'watch',
|
||||
'WatchController@popularPromos' => 'watch',
|
||||
|
||||
];
|
@ -1,305 +0,0 @@
|
||||
<?php
|
||||
|
||||
|
||||
$router->get('/', function () use ($router) {
|
||||
return response()->json([
|
||||
'Author' => '@irfanDahir',
|
||||
'Discord' => 'https://discord.gg/4tvCr36',
|
||||
'Version' => '3.4',
|
||||
'JikanPHP' => JIKAN_PARSER_VERSION,
|
||||
'Website' => 'https://jikan.moe',
|
||||
'Docs' => 'https://jikan.docs.apiary.io',
|
||||
'GitHub' => 'https://github.com/jikan-me/jikan',
|
||||
'PRODUCTION_API_URL' => 'https://api.jikan.moe/v3/',
|
||||
'STATUS_URL' => 'https://status.jikan.moe'
|
||||
]);
|
||||
});
|
||||
|
||||
$router->group(
|
||||
[
|
||||
'prefix' => 'meta'
|
||||
],
|
||||
function () use ($router) {
|
||||
$router->get('/status', [
|
||||
'uses' => 'MetaController@status'
|
||||
]);
|
||||
|
||||
$router->group(
|
||||
[
|
||||
'prefix' => 'requests'
|
||||
],
|
||||
function () use ($router) {
|
||||
$router->get('/{type:[a-z]+}/{period:[a-z]+}[/{offset:[0-9]+}]', [
|
||||
'uses' => 'MetaController@requests'
|
||||
]);
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
$router->group(
|
||||
[
|
||||
'prefix' => 'anime/{id:[0-9]+}'
|
||||
],
|
||||
function () use ($router) {
|
||||
$router->get('/', [
|
||||
'uses' => 'AnimeController@main'
|
||||
]);
|
||||
|
||||
$router->get('/characters_staff', [
|
||||
'uses' => 'AnimeController@characters_staff'
|
||||
]);
|
||||
|
||||
$router->get('/episodes[/{page:[0-9]+}]', [
|
||||
'uses' => 'AnimeController@episodes'
|
||||
]);
|
||||
|
||||
$router->get('/news', [
|
||||
'uses' => 'AnimeController@news'
|
||||
]);
|
||||
|
||||
$router->get('/forum[/{topic:[A-Za-z]+}]', [
|
||||
'uses' => 'AnimeController@forum'
|
||||
]);
|
||||
|
||||
$router->get('/videos', [
|
||||
'uses' => 'AnimeController@videos'
|
||||
]);
|
||||
|
||||
$router->get('/pictures', [
|
||||
'uses' => 'AnimeController@pictures'
|
||||
]);
|
||||
|
||||
$router->get('/stats', [
|
||||
'uses' => 'AnimeController@stats'
|
||||
]);
|
||||
|
||||
$router->get('/moreinfo', [
|
||||
'uses' => 'AnimeController@moreInfo'
|
||||
]);
|
||||
|
||||
$router->get('/recommendations', [
|
||||
'uses' => 'AnimeController@recommendations'
|
||||
]);
|
||||
|
||||
$router->get('/userupdates[/{page:[0-9]+}]', [
|
||||
'uses' => 'AnimeController@userupdates'
|
||||
]);
|
||||
|
||||
$router->get('/reviews[/{page:[0-9]+}]', [
|
||||
'uses' => 'AnimeController@reviews'
|
||||
]);
|
||||
}
|
||||
);
|
||||
|
||||
$router->group(
|
||||
[
|
||||
'prefix' => 'manga/{id:[0-9]+}'
|
||||
],
|
||||
function () use ($router) {
|
||||
$router->get('/', [
|
||||
'uses' => 'MangaController@main'
|
||||
]);
|
||||
|
||||
$router->get('/characters', [
|
||||
'uses' => 'MangaController@characters'
|
||||
]);
|
||||
|
||||
$router->get('/news', [
|
||||
'uses' => 'MangaController@news'
|
||||
]);
|
||||
|
||||
$router->get('/forum[/{topic:[A-Za-z]+}]', [
|
||||
'uses' => 'MangaController@forum'
|
||||
]);
|
||||
|
||||
$router->get('/pictures', [
|
||||
'uses' => 'MangaController@pictures'
|
||||
]);
|
||||
|
||||
$router->get('/stats', [
|
||||
'uses' => 'MangaController@stats'
|
||||
]);
|
||||
|
||||
$router->get('/moreinfo', [
|
||||
'uses' => 'MangaController@moreInfo'
|
||||
]);
|
||||
|
||||
$router->get('/recommendations', [
|
||||
'uses' => 'MangaController@recommendations'
|
||||
]);
|
||||
|
||||
$router->get('/userupdates[/{page:[0-9]+}]', [
|
||||
'uses' => 'MangaController@userupdates'
|
||||
]);
|
||||
|
||||
$router->get('/reviews[/{page:[0-9]+}]', [
|
||||
'uses' => 'MangaController@reviews'
|
||||
]);
|
||||
}
|
||||
);
|
||||
|
||||
$router->group(
|
||||
[
|
||||
'prefix' => 'character/{id:[0-9]+}'
|
||||
],
|
||||
function () use ($router) {
|
||||
$router->get('/', [
|
||||
'uses' => 'CharacterController@main'
|
||||
]);
|
||||
|
||||
$router->get('/pictures', [
|
||||
'uses' => 'CharacterController@pictures'
|
||||
]);
|
||||
}
|
||||
);
|
||||
|
||||
$router->group(
|
||||
[
|
||||
'prefix' => 'person/{id:[0-9]+}'
|
||||
],
|
||||
function () use ($router) {
|
||||
$router->get('/', [
|
||||
'uses' => 'PersonController@main'
|
||||
]);
|
||||
|
||||
$router->get('/pictures', [
|
||||
'uses' => 'PersonController@pictures'
|
||||
]);
|
||||
}
|
||||
);
|
||||
|
||||
$router->get('season/archive', [
|
||||
'uses' => 'SeasonController@archive'
|
||||
]);
|
||||
|
||||
$router->get('season/later', [
|
||||
'uses' => 'SeasonController@later'
|
||||
]);
|
||||
|
||||
$router->get('season[/{year:[0-9]{4}}/{season:[A-Za-z]+}]', [
|
||||
'uses' => 'SeasonController@main'
|
||||
]);
|
||||
|
||||
$router->get('schedule[/{day:[A-Za-z]+}]', [
|
||||
'uses' => 'ScheduleController@main'
|
||||
]);
|
||||
|
||||
$router->get('producer/{id:[0-9]+}[/{page:[0-9]+}]', [
|
||||
'uses' => 'ProducerController@main'
|
||||
]);
|
||||
|
||||
$router->get('magazine/{id:[0-9]+}[/{page:[0-9]+}]', [
|
||||
'uses' => 'MagazineController@main'
|
||||
]);
|
||||
|
||||
$router->group(
|
||||
[
|
||||
'prefix' => 'user/{username:[\w\-]+}'
|
||||
],
|
||||
function () use ($router) {
|
||||
$router->get('/', [
|
||||
'uses' => 'UserController@profile'
|
||||
]);
|
||||
|
||||
$router->get('/profile', [
|
||||
'uses' => 'UserController@profile'
|
||||
]);
|
||||
|
||||
$router->get('/history[/{type:[A-Za-z]+}]', [
|
||||
'uses' => 'UserController@history'
|
||||
]);
|
||||
|
||||
$router->get('/friends[/{page:[0-9]+}]', [
|
||||
'uses' => 'UserController@friends'
|
||||
]);
|
||||
|
||||
$router->get('/animelist[/{status:[A-Za-z]+}[/{page:[0-9]+}]]', [
|
||||
'uses' => 'UserController@animelist'
|
||||
]);
|
||||
|
||||
$router->get('/mangalist[/{status:[A-Za-z]+}[/{page:[0-9]+}]]', [
|
||||
'uses' => 'UserController@mangalist'
|
||||
]);
|
||||
}
|
||||
);
|
||||
|
||||
$router->group(
|
||||
[
|
||||
'prefix' => 'genre'
|
||||
],
|
||||
function () use ($router) {
|
||||
$router->get('/anime/{id:[0-9]+}[/{page:[0-9]+}]', [
|
||||
'uses' => 'GenreController@anime'
|
||||
]);
|
||||
|
||||
$router->get('/manga/{id:[0-9]+}[/{page:[0-9]+}]', [
|
||||
'uses' => 'GenreController@manga'
|
||||
]);
|
||||
}
|
||||
);
|
||||
|
||||
$router->group(
|
||||
[
|
||||
'prefix' => 'top'
|
||||
],
|
||||
function () use ($router) {
|
||||
$router->get('/anime[/{page:[0-9]+}[/{type:[A-Za-z]+}]]', [
|
||||
'uses' => 'TopController@anime'
|
||||
]);
|
||||
|
||||
$router->get('/manga[/{page:[0-9]+}[/{type:[A-Za-z]+}]]', [
|
||||
'uses' => 'TopController@manga'
|
||||
]);
|
||||
|
||||
$router->get('/characters[/{page:[0-9]+}]', [
|
||||
'uses' => 'TopController@characters'
|
||||
]);
|
||||
|
||||
$router->get('/people[/{page:[0-9]+}]', [
|
||||
'uses' => 'TopController@people'
|
||||
]);
|
||||
}
|
||||
);
|
||||
|
||||
$router->group(
|
||||
[
|
||||
'prefix' => 'search'
|
||||
],
|
||||
function () use ($router) {
|
||||
$router->get('/anime[/{page:[0-9]+}]', [
|
||||
'uses' => 'SearchController@anime'
|
||||
]);
|
||||
|
||||
$router->get('/manga[/{page:[0-9]+}]', [
|
||||
'uses' => 'SearchController@manga'
|
||||
]);
|
||||
|
||||
$router->get('/character[/{page:[0-9]+}]', [
|
||||
'uses' => 'SearchController@character'
|
||||
]);
|
||||
|
||||
$router->get('/person[/{page:[0-9]+}]', [
|
||||
'uses' => 'SearchController@people'
|
||||
]);
|
||||
|
||||
$router->get('/people[/{page:[0-9]+}]', [
|
||||
'uses' => 'SearchController@people'
|
||||
]);
|
||||
}
|
||||
);
|
||||
|
||||
$router->group(
|
||||
[
|
||||
'prefix' => 'club/{id:[0-9]+}'
|
||||
],
|
||||
function () use ($router) {
|
||||
$router->get('/', [
|
||||
'uses' => 'ClubController@main'
|
||||
]);
|
||||
|
||||
$router->get('/members[/{page:[0-9]+}]', [
|
||||
'uses' => 'ClubController@members'
|
||||
]);
|
||||
}
|
||||
);
|
Loading…
x
Reference in New Issue
Block a user