Version 5.1 - All the GraphQL #32
@ -21,7 +21,7 @@ use Aviat\AnimeClient\Kitsu as K;
|
||||
use Aviat\AnimeClient\API\Enum\MangaReadingStatus\Kitsu as KitsuReadingStatus;
|
||||
use Aviat\AnimeClient\API\JsonAPI;
|
||||
use Aviat\AnimeClient\API\Kitsu\Transformer\MangaHistoryTransformer;
|
||||
use Aviat\AnimeClient\API\Kitsu\Transformer\MangaListTransformer;
|
||||
use Aviat\AnimeClient\API\Kitsu\Transformer\OldMangaListTransformer;
|
||||
use Aviat\AnimeClient\API\Kitsu\Transformer\MangaTransformer;
|
||||
use Aviat\AnimeClient\API\Mapping\MangaReadingStatus;
|
||||
use Aviat\AnimeClient\API\ParallelAPIRequest;
|
||||
@ -40,9 +40,9 @@ trait MangaTrait {
|
||||
protected MangaTransformer $mangaTransformer;
|
||||
|
||||
/**
|
||||
* @var MangaListTransformer
|
||||
* @var OldMangaListTransformer
|
||||
*/
|
||||
protected MangaListTransformer $mangaListTransformer;
|
||||
protected OldMangaListTransformer $mangaListTransformer;
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// ! Manga-specific methods
|
||||
|
@ -32,7 +32,7 @@ use Aviat\AnimeClient\API\Kitsu\Transformer\{
|
||||
OldAnimeListTransformer,
|
||||
LibraryEntryTransformer,
|
||||
MangaTransformer,
|
||||
MangaListTransformer
|
||||
OldMangaListTransformer
|
||||
};
|
||||
|
||||
use Aviat\Banker\Exception\InvalidArgumentException;
|
||||
@ -68,7 +68,7 @@ final class Model {
|
||||
$this->animeTransformer = new AnimeTransformer();
|
||||
$this->oldListTransformer = new OldAnimeListTransformer();
|
||||
$this->mangaTransformer = new MangaTransformer();
|
||||
$this->mangaListTransformer = new MangaListTransformer();
|
||||
$this->mangaListTransformer = new OldMangaListTransformer();
|
||||
|
||||
$this->listItem = $listItem;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
mutation($id: ID!, $progress: Int) {
|
||||
mutation($id: ID!, $progress: Int!) {
|
||||
libraryEntry{
|
||||
update(input: { id: $id, progress: $progress }) {
|
||||
libraryEntry {
|
||||
|
@ -0,0 +1,148 @@
|
||||
<?php declare(strict_types=1);
|
||||
/**
|
||||
* Hummingbird Anime List Client
|
||||
*
|
||||
* An API client for Kitsu to manage anime and manga watch lists
|
||||
*
|
||||
* PHP version 7.4
|
||||
*
|
||||
* @package HummingbirdAnimeClient
|
||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||
* @copyright 2015 - 2020 Timothy J. Warren
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @version 5.1
|
||||
* @link https://git.timshomepage.net/timw4mail/HummingBirdAnimeClient
|
||||
*/
|
||||
|
||||
namespace Aviat\AnimeClient\API\Kitsu\Transformer;
|
||||
|
||||
use Aviat\AnimeClient\Kitsu;
|
||||
use Aviat\AnimeClient\Types\{
|
||||
FormItem, FormItemData,
|
||||
MangaListItem, MangaListItemDetail
|
||||
};
|
||||
use Aviat\Ion\Transformer\AbstractTransformer;
|
||||
use Aviat\Ion\Type\StringType;
|
||||
|
||||
/**
|
||||
* Data transformation class for zippered Hummingbird manga
|
||||
*/
|
||||
final class OldMangaListTransformer extends AbstractTransformer {
|
||||
/**
|
||||
* Remap zipped anime data to a more logical form
|
||||
*
|
||||
* @param array $item manga entry item
|
||||
* @return MangaListItem
|
||||
*/
|
||||
public function transform($item): MangaListItem
|
||||
{
|
||||
$included = $item['included'];
|
||||
$mangaId = $item['relationships']['media']['data']['id'];
|
||||
$manga = $included['manga'][$mangaId];
|
||||
|
||||
$genres = [];
|
||||
|
||||
foreach ($manga['relationships']['categories'] as $genre)
|
||||
{
|
||||
$genres[] = $genre['title'];
|
||||
}
|
||||
|
||||
sort($genres);
|
||||
|
||||
$rating = (int) $item['attributes']['ratingTwenty'] !== 0
|
||||
? $item['attributes']['ratingTwenty'] / 2
|
||||
: '-';
|
||||
|
||||
$totalChapters = ((int) $manga['chapterCount'] !== 0)
|
||||
? $manga['chapterCount']
|
||||
: '-';
|
||||
|
||||
$totalVolumes = ((int) $manga['volumeCount'] !== 0)
|
||||
? $manga['volumeCount']
|
||||
: '-';
|
||||
|
||||
$readChapters = ((int) $item['attributes']['progress'] !== 0)
|
||||
? $item['attributes']['progress']
|
||||
: '-';
|
||||
|
||||
$MALid = NULL;
|
||||
|
||||
if (array_key_exists('mappings', $manga['relationships']))
|
||||
{
|
||||
foreach ($manga['relationships']['mappings'] as $mapping)
|
||||
{
|
||||
if ($mapping['externalSite'] === 'myanimelist/manga')
|
||||
{
|
||||
$MALid = $mapping['externalId'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$titles = Kitsu::filterTitles($manga);
|
||||
$title = array_shift($titles);
|
||||
|
||||
return MangaListItem::from([
|
||||
'id' => $item['id'],
|
||||
'mal_id' => $MALid,
|
||||
'chapters' => [
|
||||
'read' => $readChapters,
|
||||
'total' => $totalChapters
|
||||
],
|
||||
'volumes' => [
|
||||
'read' => '-', //$item['attributes']['volumes_read'],
|
||||
'total' => $totalVolumes
|
||||
],
|
||||
'manga' => MangaListItemDetail::from([
|
||||
'genres' => $genres,
|
||||
'id' => $mangaId,
|
||||
'image' => $manga['posterImage']['small'],
|
||||
'slug' => $manga['slug'],
|
||||
'title' => $title,
|
||||
'titles' => $titles,
|
||||
'type' => (string)StringType::from($manga['subtype'])->upperCaseFirst(),
|
||||
'url' => 'https://kitsu.io/manga/' . $manga['slug'],
|
||||
]),
|
||||
'reading_status' => $item['attributes']['status'],
|
||||
'notes' => $item['attributes']['notes'],
|
||||
'rereading' => (bool)$item['attributes']['reconsuming'],
|
||||
'reread' => $item['attributes']['reconsumeCount'],
|
||||
'user_rating' => $rating,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Untransform data to update the api
|
||||
*
|
||||
* @param array $item
|
||||
* @return FormItem
|
||||
*/
|
||||
public function untransform($item): FormItem
|
||||
{
|
||||
$rereading = array_key_exists('rereading', $item) && (bool)$item['rereading'];
|
||||
|
||||
$map = FormItem::from([
|
||||
'id' => $item['id'],
|
||||
'mal_id' => $item['mal_id'],
|
||||
'data' => FormItemData::from([
|
||||
'status' => $item['status'],
|
||||
'reconsuming' => $rereading,
|
||||
'reconsumeCount' => (int)$item['reread_count'],
|
||||
'notes' => $item['notes'],
|
||||
]),
|
||||
]);
|
||||
|
||||
if (is_numeric($item['chapters_read']) && $item['chapters_read'] > 0)
|
||||
{
|
||||
$map['data']['progress'] = (int)$item['chapters_read'];
|
||||
}
|
||||
|
||||
if (is_numeric($item['new_rating']) && $item['new_rating'] > 0)
|
||||
{
|
||||
$map['data']['ratingTwenty'] = $item['new_rating'] * 2;
|
||||
}
|
||||
|
||||
return $map;
|
||||
}
|
||||
}
|
||||
// End of MangaListTransformer.php
|
@ -18,7 +18,7 @@ namespace Aviat\AnimeClient\Controller;
|
||||
|
||||
use Aura\Router\Exception\RouteNotFound;
|
||||
use Aviat\AnimeClient\Controller;
|
||||
use Aviat\AnimeClient\API\Kitsu\Transformer\MangaListTransformer;
|
||||
use Aviat\AnimeClient\API\Kitsu\Transformer\OldMangaListTransformer;
|
||||
use Aviat\AnimeClient\API\Mapping\MangaReadingStatus;
|
||||
use Aviat\AnimeClient\Model\Manga as MangaModel;
|
||||
use Aviat\AnimeClient\Types\FormItem;
|
||||
@ -229,7 +229,7 @@ final class Manga extends Controller {
|
||||
|
||||
// Do some minor data manipulation for
|
||||
// large form-based updates
|
||||
$transformer = new MangaListTransformer();
|
||||
$transformer = new OldMangaListTransformer();
|
||||
$post_data = $transformer->untransform($data);
|
||||
$full_result = $this->model->updateLibraryItem(FormItem::from($post_data));
|
||||
|
||||
@ -264,7 +264,9 @@ final class Manga extends Controller {
|
||||
$data = $this->request->getParsedBody();
|
||||
}
|
||||
|
||||
[$body, $statusCode] = $this->model->incrementLibraryItem(FormItem::from($data));
|
||||
$res = $this->model->incrementLibraryItem(FormItem::from($data));
|
||||
$body = $res['body'];
|
||||
$statusCode = $res['statusCode'];
|
||||
|
||||
$this->cache->clear();
|
||||
$this->outputJSON($body, $statusCode);
|
||||
|
@ -17,7 +17,7 @@
|
||||
namespace Aviat\AnimeClient\Tests\API\Kitsu\Transformer;
|
||||
|
||||
use Aviat\AnimeClient\API\JsonAPI;
|
||||
use Aviat\AnimeClient\API\Kitsu\Transformer\MangaListTransformer;
|
||||
use Aviat\AnimeClient\API\Kitsu\Transformer\OldMangaListTransformer;
|
||||
use Aviat\AnimeClient\Tests\AnimeClientTestCase;
|
||||
use Aviat\AnimeClient\Types\{
|
||||
FormItem,
|
||||
@ -52,7 +52,7 @@ class MangaListTransformerTest extends AnimeClientTestCase {
|
||||
$this->beforeTransform = $rawBefore['data'];
|
||||
// $this->afterTransform = Json::decodeFile("{$this->dir}/mangaListAfterTransform.json");
|
||||
|
||||
$this->transformer = new MangaListTransformer();
|
||||
$this->transformer = new OldMangaListTransformer();
|
||||
}
|
||||
|
||||
public function testTransform()
|
||||
|
Loading…
Reference in New Issue
Block a user