People Resource: Add /voices, /anime, /manga endpoints

Removes `published_manga`, `voice_acting_roles`, `anime_staff_positions` from Person resource
This commit is contained in:
Irfan 2020-07-22 22:03:31 +05:00
parent 06af87f9bf
commit f5fc6e36eb
9 changed files with 429 additions and 4 deletions

View File

@ -5,6 +5,11 @@ namespace App\Http\Controllers\V4DB;
use App\Character;
use App\Http\HttpHelper;
use App\Http\HttpResponse;
use App\Http\Resources\V4\PersonAnimeCollection;
use App\Http\Resources\V4\PersonAnimeResource;
use App\Http\Resources\V4\PersonMangaCollection;
use App\Http\Resources\V4\PersonVoiceResource;
use App\Http\Resources\V4\PersonVoicesCollection;
use App\Http\Resources\V4\PicturesResource;
use App\Person;
use Illuminate\Http\Request;
@ -91,6 +96,231 @@ class PersonController extends Controller
);
}
/**
* @OA\Get(
* path="/people/{id}/anime",
* operationId="getPersonAnime",
* tags={"people"},
*
* @OA\Response(
* response="200",
* description="Returns person's anime staff positions",
* @OA\JsonContent()
* ),
* @OA\Response(
* response="400",
* description="Error: Bad request. When required parameters were not supplied.",
* ),
* )
*/
public function anime(Request $request, int $id)
{
$results = Person::query()
->where('mal_id', $id)
->get();
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$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('mal_id', $id)
->update($response);
}
$results = Person::query()
->where('mal_id', $id)
->get();
}
if ($results->isEmpty()) {
return HttpResponse::notFound($request);
}
$response = (new PersonAnimeCollection(
$results->first()['anime_staff_positions']
))->response();
return $this->prepareResponse(
$response,
$results,
$request
);
}
/**
* @OA\Get(
* path="/people/{id}/voices",
* operationId="getPersonVoices",
* tags={"people"},
*
* @OA\Response(
* response="200",
* description="Returns person's voice acting roles",
* @OA\JsonContent()
* ),
* @OA\Response(
* response="400",
* description="Error: Bad request. When required parameters were not supplied.",
* ),
* )
*/
public function voices(Request $request, int $id)
{
$results = Person::query()
->where('mal_id', $id)
->get();
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$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('mal_id', $id)
->update($response);
}
$results = Person::query()
->where('mal_id', $id)
->get();
}
if ($results->isEmpty()) {
return HttpResponse::notFound($request);
}
$response = (new PersonVoicesCollection(
$results->first()['voice_acting_roles']
))->response();
return $this->prepareResponse(
$response,
$results,
$request
);
}
/**
* @OA\Get(
* path="/people/{id}/manga",
* operationId="getPersonManga",
* tags={"people"},
*
* @OA\Response(
* response="200",
* description="Returns person's published manga",
* @OA\JsonContent()
* ),
* @OA\Response(
* response="400",
* description="Error: Bad request. When required parameters were not supplied.",
* ),
* )
*/
public function manga(Request $request, int $id)
{
$results = Person::query()
->where('mal_id', $id)
->get();
if (
$results->isEmpty()
|| $this->isExpired($request, $results)
) {
$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('mal_id', $id)
->update($response);
}
$results = Person::query()
->where('mal_id', $id)
->get();
}
if ($results->isEmpty()) {
return HttpResponse::notFound($request);
}
$response = (new PersonMangaCollection(
$results->first()['published_manga']
))->response();
return $this->prepareResponse(
$response,
$results,
$request
);
}
/**
* @OA\Get(
* path="/people/{id}/pictures",

View File

@ -0,0 +1,32 @@
<?php
namespace App\Http\Resources\V4;
use Illuminate\Http\Resources\Json\ResourceCollection;
class PersonAnimeCollection extends ResourceCollection
{
/**
* The resource that this resource collects.
*/
public $collects = 'App\Http\Resources\V4\PersonAnimeResource';
/**
* Transform the resource collection into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => $this->collection,
'links' => [
'self' => 'link-value',
],
];
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\Http\Resources\V4;
use Illuminate\Http\Resources\Json\JsonResource;
class PersonAnimeResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'position' => $this['position'],
'anime' => [
'mal_id' => $this['anime']['mal_id'],
'url' => $this['anime']['url'],
'image_url' => $this['anime']['image_url'],
'name' => $this['anime']['name']
]
];
}
}

View File

@ -0,0 +1,32 @@
<?php
namespace App\Http\Resources\V4;
use Illuminate\Http\Resources\Json\ResourceCollection;
class PersonMangaCollection extends ResourceCollection
{
/**
* The resource that this resource collects.
*/
public $collects = 'App\Http\Resources\V4\PersonMangaResource';
/**
* Transform the resource collection into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => $this->collection,
'links' => [
'self' => 'link-value',
],
];
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\Http\Resources\V4;
use Illuminate\Http\Resources\Json\JsonResource;
class PersonMangaResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'position' => $this['position'],
'manga' => [
'mal_id' => $this['manga']['mal_id'],
'url' => $this['manga']['url'],
'image_url' => $this['manga']['image_url'],
'name' => $this['manga']['name']
],
];
}
}

View File

@ -165,10 +165,7 @@ class PersonResource extends JsonResource
'alternate_names' => $this->alternate_names,
'birthday' => $this->birthday,
'favorites' => $this->favorites,
'about' => $this->about,
'voice_acting_roles' => $this->voice_acting_roles,
'anime_staff_positions' => $this->anime_staff_positions,
'published_manga' => $this->published_manga,
'about' => $this->about
];
}
}

View File

@ -0,0 +1,34 @@
<?php
namespace App\Http\Resources\V4;
use Illuminate\Http\Resources\Json\JsonResource;
class PersonVoiceResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'role' => $this['role'],
'anime' => [
'mal_id' => $this['anime']['mal_id'],
'url' => $this['anime']['url'],
'image_url' => $this['anime']['image_url'],
'name' => $this['anime']['name']
],
'character' => [
'mal_id' => $this['character']['mal_id'],
'url' => $this['character']['url'],
'image_url' => $this['character']['image_url'],
'name' => $this['character']['name']
]
];
}
}

View File

@ -0,0 +1,32 @@
<?php
namespace App\Http\Resources\V4;
use Illuminate\Http\Resources\Json\ResourceCollection;
class PersonVoicesCollection extends ResourceCollection
{
/**
* The resource that this resource collects.
*/
public $collects = 'App\Http\Resources\V4\PersonVoiceResource';
/**
* Transform the resource collection into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => $this->collection,
'links' => [
'self' => 'link-value',
],
];
}
}

View File

@ -165,6 +165,18 @@ $router->group(
'uses' => 'PersonController@main'
]);
$router->get('/anime', [
'uses' => 'PersonController@anime'
]);
$router->get('/voices', [
'uses' => 'PersonController@voices'
]);
$router->get('/manga', [
'uses' => 'PersonController@manga'
]);
$router->get('/pictures', [
'uses' => 'PersonController@pictures'
]);