Add anime /relations endpoint

This commit is contained in:
Irfan 2020-11-26 23:31:42 +05:00
parent 4e6c9409ce
commit 92629a8c62
4 changed files with 112 additions and 3 deletions

View File

@ -11,6 +11,8 @@ use App\Http\Resources\V4\AnimeCollection;
use App\Http\Resources\V4\AnimeEpisodeResource;
use App\Http\Resources\V4\AnimeEpisodesResource;
use App\Http\Resources\V4\AnimeForumResource;
use App\Http\Resources\V4\AnimeRelationsCollection;
use App\Http\Resources\V4\AnimeRelationsResource;
use App\Http\Resources\V4\MoreInfoResource;
use App\Http\Resources\V4\AnimeNewsResource;
use App\Http\Resources\V4\PicturesResource;
@ -900,14 +902,14 @@ class AnimeController extends Controller
* path="/anime/{id}/reviews",
* operationId="getAnimeReviews",
* tags={"anime"},
*
*
* @OA\Parameter(
* name="id",
* in="path",
* required=true,
* @OA\Schema(type="integer")
* ),
*
*
* @OA\Parameter(ref="#/components/parameters/page"),
*
* @OA\Response(
@ -950,4 +952,88 @@ class AnimeController extends Controller
$request
);
}
/**
* @OA\Get(
* path="/anime/{id}/relations",
* operationId="getAnimeRelations",
* tags={"anime"},
*
* @OA\Parameter(
* name="id",
* in="path",
* required=true,
* @OA\Schema(type="integer")
* ),
*
* @OA\Parameter(ref="#/components/parameters/page"),
*
* @OA\Response(
* response="200",
* description="Returns anime relations",
* @OA\JsonContent(
* ref="#/components/schemas/anime reviews"
* )
* ),
* @OA\Response(
* response="400",
* description="Error: Bad request. When required parameters were not supplied.",
* ),
* )
*/
public function relations(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 AnimeRelationsResource(
$results->first()
))->response();
return $this->prepareResponse(
$response,
$results,
$request
);
}
}

View File

@ -0,0 +1,20 @@
<?php
namespace App\Http\Resources\V4;
use Illuminate\Http\Resources\Json\JsonResource;
class AnimeRelationsResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return $this['related'];
}
}

View File

@ -285,7 +285,6 @@ class AnimeResource extends JsonResource
'season' => $this->season,
'year' => $this->year,
'broadcast' => $this->broadcast,
'related' => $this->related,
'producers' => $this->producers,
'licensors' => $this->licensors,
'studios' => $this->studios,

View File

@ -80,6 +80,10 @@ $router->group(
$router->get('/reviews', [
'uses' => 'AnimeController@reviews'
]);
$router->get('/relations', [
'uses' => 'AnimeController@relations'
]);
}
);