diff --git a/app/Http/Controllers/V4DB/AnimeController.php b/app/Http/Controllers/V4DB/AnimeController.php index e10a83a..67ae0ab 100644 --- a/app/Http/Controllers/V4DB/AnimeController.php +++ b/app/Http/Controllers/V4DB/AnimeController.php @@ -10,6 +10,7 @@ use App\Http\Resources\V4\AnimeCharactersResource; use App\Http\Resources\V4\AnimeCollection; use App\Http\Resources\V4\AnimeEpisodeResource; use App\Http\Resources\V4\AnimeEpisodesResource; +use App\Http\Resources\V4\ExternalLinksResource; use App\Http\Resources\V4\AnimeForumResource; use App\Http\Resources\V4\AnimeRelationsCollection; use App\Http\Resources\V4\AnimeRelationsResource; @@ -28,6 +29,7 @@ use App\Http\Resources\V4\CommonResource; use App\Http\Resources\V4\ForumResource; use App\Http\Resources\V4\NewsResource; use Illuminate\Http\Request; +use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Facades\DB; use Jikan\Request\Anime\AnimeCharactersAndStaffRequest; use Jikan\Request\Anime\AnimeEpisodeRequest; @@ -1085,4 +1087,85 @@ class AnimeController extends Controller $request ); } + + /** + * @OA\Get( + * path="/anime/{id}/external", + * operationId="getAnimeExternal", + * tags={"anime"}, + * + * @OA\Parameter( + * name="id", + * in="path", + * required=true, + * @OA\Schema(type="integer") + * ), + * + * @OA\Response( + * response="200", + * description="Returns anime external links", + * @OA\JsonContent( + * ref="#/components/schemas/external links" + * ) + * ), + * @OA\Response( + * response="400", + * description="Error: Bad request. When required parameters were not supplied.", + * ), + * ) + */ + public function external(Request $request, int $id) + { + $results = Anime::query() + ->where('mal_id', $id) + ->get(); + + if ( + $results->isEmpty() + || $this->isExpired($request, $results) + ) { + $response = Anime::scrape($id); + + 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 ($this->isExpired($request, $results)) { + Anime::query() + ->where('mal_id', $id) + ->update($response); + } + + $results = Anime::query() + ->where('mal_id', $id) + ->get(); + } + + if ($results->isEmpty()) { + return HttpResponse::notFound($request); + } + + + $response = (new ExternalLinksResource( + $results->first() + ))->response(); + + return $this->prepareResponse( + $response, + $results, + $request + ); + } } diff --git a/app/Http/Controllers/V4DB/MangaController.php b/app/Http/Controllers/V4DB/MangaController.php index 6b21e6f..d653f79 100644 --- a/app/Http/Controllers/V4DB/MangaController.php +++ b/app/Http/Controllers/V4DB/MangaController.php @@ -7,6 +7,7 @@ use App\Http\HttpHelper; use App\Http\HttpResponse; use App\Http\Resources\V4\AnimeCharactersResource; use App\Http\Resources\V4\AnimeForumResource; +use App\Http\Resources\V4\ExternalLinksResource; use App\Http\Resources\V4\MangaRelationsResource; use App\Http\Resources\V4\ResultsResource; use App\Http\Resources\V4\ReviewsResource; @@ -22,6 +23,7 @@ use App\Http\Resources\V4\NewsResource; use App\Http\Resources\V4\PicturesResource; use App\Manga; use Illuminate\Http\Request; +use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Facades\DB; use Jikan\Request\Anime\AnimeCharactersAndStaffRequest; use Jikan\Request\Anime\AnimeForumRequest; @@ -655,4 +657,84 @@ class MangaController extends Controller $request ); } + + /** + * @OA\Get( + * path="/manga/{id}/external", + * operationId="getMangaExternal", + * tags={"manga"}, + * + * @OA\Parameter( + * name="id", + * in="path", + * required=true, + * @OA\Schema(type="integer") + * ), + * + * @OA\Response( + * response="200", + * description="Returns manga external links", + * @OA\JsonContent( + * ref="#/components/schemas/external links" + * ) + * ), + * @OA\Response( + * response="400", + * description="Error: Bad request. When required parameters were not supplied.", + * ), + * ) + */ + public function external(Request $request, int $id) + { + $results = Manga::query() + ->where('mal_id', $id) + ->get(); + + if ( + $results->isEmpty() + || $this->isExpired($request, $results) + ) { + $response = Manga::scrape($id); + + 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('mal_id', $id) + ->update($response); + } + + $results = Manga::query() + ->where('mal_id', $id) + ->get(); + } + + if ($results->isEmpty()) { + return HttpResponse::notFound($request); + } + + $response = (new ExternalLinksResource( + $results->first() + ))->response(); + + return $this->prepareResponse( + $response, + $results, + $request + ); + } } diff --git a/app/Http/Resources/V4/ExternalLinksResource.php b/app/Http/Resources/V4/ExternalLinksResource.php new file mode 100644 index 0000000..cb08268 --- /dev/null +++ b/app/Http/Resources/V4/ExternalLinksResource.php @@ -0,0 +1,45 @@ +external_links; + } +} \ No newline at end of file diff --git a/routes/web.v4.php b/routes/web.v4.php index ead338e..aad9139 100755 --- a/routes/web.v4.php +++ b/routes/web.v4.php @@ -94,6 +94,10 @@ $router->group( $router->get('/themes', [ 'uses' => 'AnimeController@themes' ]); + + $router->get('/external', [ + 'uses' => 'AnimeController@external' + ]); } ); @@ -149,6 +153,10 @@ $router->group( $router->get('/relations', [ 'uses' => 'MangaController@relations' ]); + + $router->get('/external', [ + 'uses' => 'MangaController@external' + ]); } ); diff --git a/storage/api-docs/api-docs.json b/storage/api-docs/api-docs.json index 2d471ba..9f1b1e1 100644 --- a/storage/api-docs/api-docs.json +++ b/storage/api-docs/api-docs.json @@ -568,6 +568,39 @@ } } }, + "/anime/{id}/external": { + "get": { + "tags": [ + "anime" + ], + "operationId": "getAnimeExternal", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Returns anime external links", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/external links" + } + } + } + }, + "400": { + "description": "Error: Bad request. When required parameters were not supplied." + } + } + } + }, "/characters/{id}": { "get": { "tags": [ @@ -1207,6 +1240,39 @@ } } }, + "/manga/{id}/external": { + "get": { + "tags": [ + "manga" + ], + "operationId": "getMangaExternal", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Returns manga external links", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/external links" + } + } + } + }, + "400": { + "description": "Error: Bad request. When required parameters were not supplied." + } + } + } + }, "/people/{id}": { "get": { "tags": [ @@ -5136,6 +5202,26 @@ }, "type": "object" }, + "external links": { + "description": "External links", + "properties": { + "data": { + "type": "array", + "items": { + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + } + } + }, + "type": "object" + }, "forum": { "description": "Forum Resource", "properties": {