Skip to content

Commit

Permalink
[Update] Anime & Studio
Browse files Browse the repository at this point in the history
- Added anime studio relationship to anime model
- Added casting on anime studio attributes
- Added AnimeStudioResource
- Updated AnimeResource to make use of AnimeStudioResource
- Updated anime staff factory
  • Loading branch information
kiritokatklian committed May 15, 2021
1 parent 0dd39d9 commit ed0113d
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 3 deletions.
2 changes: 1 addition & 1 deletion app/Http/Resources/AnimeResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ protected function getStudiosRelationship(): array
return [
'studios' => [
'href' => route('api.anime.studios', $anime, false),
'data' => StudioResource::collection($anime->getStudios(Anime::MAXIMUM_RELATIONSHIPS_LIMIT))
'data' => AnimeStudioResource::collection($anime->getAnimeStudios(Anime::MAXIMUM_RELATIONSHIPS_LIMIT))
]
];
}
Expand Down
55 changes: 55 additions & 0 deletions app/Http/Resources/AnimeStudioResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php

namespace App\Http\Resources;

use App\Models\AnimeStudio;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class AnimeStudioResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param Request $request
* @return array
*/
public function toArray($request): array
{
/** @var AnimeStudio $animeStudio */
$animeStudio = $this->resource;

$resource = [
'id' => $animeStudio->id,
'type' => 'studio',
'href' => route('api.anime.studios', $animeStudio->anime, false),
'attributes' => $animeStudio->only(['is_licensor', 'is_producer', 'is_studio']),
];

$relationships = [];

$relationships = array_merge($relationships, $this->getStudioRelationship());

$resource = array_merge($resource, ['relationships' => $relationships]);

return $resource;
}

/**
* Returns the person relationship for the resource.
*
* @return array
*/
protected function getStudioRelationship(): array
{
/** @var AnimeStudio $animeStudio */
$animeStudio = $this->resource;

return [
'studio' => [
'href' => route('api.studios.details', $animeStudio, false),
'data' => StudioResourceBasic::make($animeStudio->studio),
]
];
}
}
27 changes: 27 additions & 0 deletions app/Models/Anime.php
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,33 @@ public function studios(): BelongsToMany
return $this->belongsToMany(Studio::class);
}

/**
* Retrieves the studios for an Anime item in an array
*
* @param ?int $limit
* @return mixed
*/
public function getAnimeStudios(?int $limit = null): mixed
{
// Find location of cached data
$cacheKey = self::cacheKey(['name' => 'anime.anime_studios', 'id' => $this->id, 'limit' => $limit]);

// Retrieve or save cached result
return Cache::remember($cacheKey, self::CACHE_KEY_STUDIOS_SECONDS, function () use ($limit) {
return $this->anime_studios()->limit($limit)->get();
});
}

/**
* Get the Anime's studios
*
* @return HasMany
*/
public function anime_studios(): HasMany
{
return $this->hasMany(AnimeStudio::class);
}

/**
* Get the Anime's ratings
*
Expand Down
6 changes: 6 additions & 0 deletions app/Models/AnimeStudio.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ class AnimeStudio extends KModel
const TABLE_NAME = 'anime_studio';
protected $table = self::TABLE_NAME;

protected $casts = [
'is_licensor' => 'boolean',
'is_producer' => 'boolean',
'is_studio' => 'boolean',
];

/**
* Returns the anime belonging to the studio.
*
Expand Down
2 changes: 1 addition & 1 deletion config/app.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
| or any other location as required by the application or its packages.
*/

'version' => '1.2.0-alpha.63',
'version' => '1.2.0-alpha.64',

/*
|--------------------------------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion database/factories/AnimeStaffFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public function definition(): array
return [
'anime_id' => $anime,
'person_id' => $person,
'staff_role_id' => $this->faker->randomElement([$staffRole, null])
'staff_role_id' => $staffRole, null,
];
}
}

0 comments on commit ed0113d

Please sign in to comment.