add anime/manga external links endpoint

This commit is contained in:
Irfan 2022-02-11 14:41:08 +05:00
parent e6d59d926a
commit ec36214bac
5 changed files with 304 additions and 0 deletions

View File

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

View File

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

View File

@ -0,0 +1,45 @@
<?php
namespace App\Http\Resources\V4;
use Illuminate\Http\Resources\Json\JsonResource;
class ExternalLinksResource extends JsonResource
{
/**
* @OA\Schema(
* schema="external links",
* description="External links",
*
* @OA\Property(
* property="data",
* type="array",
*
* @OA\Items(
* type="object",
*
* @OA\Property(
* property="name",
* type="string",
* ),
* @OA\Property(
* property="url",
* type="string",
* ),
* ),
* ),
* )
*/
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return $this->external_links;
}
}

View File

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

View File

@ -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": {