remove v3 bc

- screw it lmao. causing a mess.
This commit is contained in:
Irfan 2020-09-13 12:48:07 +05:00
parent 6bd07cb265
commit 9e687057f9
41 changed files with 17 additions and 4264 deletions

View File

@ -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)
{
}
}

View File

@ -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
);
}
}

View File

@ -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
);
}
}

View File

@ -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'));
}
}

View File

@ -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;
}
}
}
}

View File

@ -1,18 +0,0 @@
<?php
namespace App\Http\Controllers;
class ExampleController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
//
}
//
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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
);
}
}

View File

@ -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)
);
}
}

View File

@ -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
);
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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');
}
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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']
];
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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

View File

@ -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',
];

View File

@ -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'
]);
}
);