From 3714a93dcfe11c57ffc6d6a49926b5fb73cdf102 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Wed, 26 Aug 2020 15:24:49 -0400 Subject: [PATCH] Extract common methods for Anime and Manga models into a trait --- src/AnimeClient/Model/Anime.php | 182 +---------------------- src/AnimeClient/Model/Manga.php | 167 +-------------------- src/AnimeClient/Model/MediaTrait.php | 213 +++++++++++++++++++++++++++ 3 files changed, 217 insertions(+), 345 deletions(-) create mode 100644 src/AnimeClient/Model/MediaTrait.php diff --git a/src/AnimeClient/Model/Anime.php b/src/AnimeClient/Model/Anime.php index 825c9ffe..143f8314 100644 --- a/src/AnimeClient/Model/Anime.php +++ b/src/AnimeClient/Model/Anime.php @@ -16,9 +16,6 @@ namespace Aviat\AnimeClient\Model; -use Aviat\AnimeClient\API\Anilist\Model as AnilistModel; -use Aviat\AnimeClient\API\Kitsu\Model as KitsuModel; -use Aviat\AnimeClient\API\Kitsu\Transformer\LibraryEntryTransformer; use Aviat\AnimeClient\API\ParallelAPIRequest; use Aviat\AnimeClient\API\Mapping\AnimeWatchingStatus; use Aviat\AnimeClient\Types\{ @@ -26,7 +23,6 @@ use Aviat\AnimeClient\Types\{ FormItem, AnimeListItem }; -use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Json; use Throwable; @@ -36,41 +32,9 @@ use function is_array; * Model for handling requests dealing with the anime list */ class Anime extends API { + use MediaTrait; - /** - * Is the Anilist API enabled? - * - * @var boolean - */ - protected bool $anilistEnabled; - - /** - * Model for making requests to Anilist API - * - * @var AnilistModel - */ - protected AnilistModel $anilistModel; - - /** - * Model for making requests to Kitsu API - * - * @var KitsuModel - */ - protected KitsuModel $kitsuModel; - - /** - * Anime constructor. - * - * @param ContainerInterface $container - */ - public function __construct(ContainerInterface $container) - { - $this->anilistModel = $container->get('anilist-model'); - $this->kitsuModel = $container->get('kitsu-model'); - - $config = $container->get('config'); - $this->anilistEnabled = (bool) $config->get(['anilist', 'enabled']); - } + protected string $type = 'anime'; /** * Get a category out of the full list @@ -140,147 +104,5 @@ class Anime extends API { return $this->kitsuModel->getAnimeHistory(); } - /** - * Search for anime by name - * - * @param string $name - * @return array - */ - public function search(string $name): array - { - return $this->kitsuModel->search('anime', urldecode($name)); - } - /** - * Get information about a specific list item - * for editing/updating that item - * - * @param string $itemId - * @return AnimeListItem - */ - public function getLibraryItem(string $itemId): AnimeListItem - { - return $this->kitsuModel->getListItem($itemId); - } - - /** - * Add an anime to your list - * - * @param array $data - * @return bool - * @throws Throwable - */ - public function createLibraryItem(array $data): bool - { - $requester = new ParallelAPIRequest(); - $requester->addRequest($this->kitsuModel->createListItem($data), 'kitsu'); - - if ($this->anilistEnabled && $data['mal_id'] !== null) - { - // If can't map MAL id, this will be null - $maybeRequest = $this->anilistModel->createListItem($data, 'ANIME'); - if ($maybeRequest !== NULL) - { - $requester->addRequest($maybeRequest, 'anilist'); - } - } - - $results = $requester->makeRequests(); - - return count($results) > 0; - } - - /** - * Increment progress for the specified anime - * - * @param FormItem $data - * @return array - * @throws Throwable - */ - public function incrementLibraryItem(FormItem $data): array - { - $requester = new ParallelAPIRequest(); - $requester->addRequest($this->kitsuModel->incrementListItem($data), 'kitsu'); - - if (( ! empty($data['mal_id'])) && $this->anilistEnabled) - { - // If can't map MAL id, this will be null - $maybeRequest = $this->anilistModel->incrementListItem($data, 'ANIME'); - if ($maybeRequest !== NULL) - { - $requester->addRequest($maybeRequest, 'anilist'); - } - } - - $results = $requester->makeRequests(); - - $body = Json::decode($results['kitsu']); - $statusCode = array_key_exists('error', $body) ? 400 : 200; - - return [ - 'body' => Json::decode($results['kitsu']), - 'statusCode' => $statusCode - ]; - } - - /** - * Update a list entry - * - * @param FormItem $data - * @return array - * @throws Throwable - */ - public function updateLibraryItem(FormItem $data): array - { - $requester = new ParallelAPIRequest(); - $requester->addRequest($this->kitsuModel->updateListItem($data), 'kitsu'); - - if (( ! empty($data['mal_id'])) && $this->anilistEnabled) - { - // If can't map MAL id, this will be null - $maybeRequest = $this->anilistModel->updateListItem($data, 'ANIME'); - if ($maybeRequest !== NULL) - { - $requester->addRequest($maybeRequest, 'anilist'); - } - } - - $results = $requester->makeRequests(); - - $body = Json::decode($results['kitsu']); - $statusCode = array_key_exists('errors', $body) ? 400: 200; - - return [ - 'body' => Json::decode($results['kitsu']), - 'statusCode' => $statusCode - ]; - } - - /** - * Delete a list entry - * - * @param string $id - * @param string|null $malId - * @return bool - * @throws Throwable - */ - public function deleteLibraryItem(string $id, string $malId = NULL): bool - { - $requester = new ParallelAPIRequest(); - $requester->addRequest($this->kitsuModel->deleteListItem($id), 'kitsu'); - - if ($this->anilistEnabled && $malId !== null) - { - // If can't map MAL id, this will be null - $maybeRequest = $this->anilistModel->deleteListItem($malId, 'ANIME'); - if ($maybeRequest !== NULL) - { - $requester->addRequest($maybeRequest, 'anilist'); - } - } - - $results = $requester->makeRequests(); - - return count($results) > 0; - } } \ No newline at end of file diff --git a/src/AnimeClient/Model/Manga.php b/src/AnimeClient/Model/Manga.php index 9aa9ab1a..d7e81d1d 100644 --- a/src/AnimeClient/Model/Manga.php +++ b/src/AnimeClient/Model/Manga.php @@ -19,55 +19,18 @@ namespace Aviat\AnimeClient\Model; use Aviat\AnimeClient\API\{ Enum\MangaReadingStatus\Title, Mapping\MangaReadingStatus, - ParallelAPIRequest }; use Aviat\AnimeClient\Types\{ - FormItem, - MangaListItem, MangaPage }; -use Aviat\AnimeClient\API\{Anilist, Kitsu}; -use Aviat\Ion\Di\ContainerInterface; -use Aviat\Ion\Json; - -use Throwable; /** * Model for handling requests dealing with the manga list */ class Manga extends API { - /** - * Is the Anilist API enabled? - * - * @var boolean - */ - protected bool $anilistEnabled; + use MediaTrait; - /** - * Model for making requests to the Anilist API - * @var Anilist\Model - */ - protected Anilist\Model $anilistModel; - - /** - * Model for making requests to Kitsu API - * @var Kitsu\Model - */ - protected Kitsu\Model $kitsuModel; - - /** - * Constructor - * - * @param ContainerInterface $container - */ - public function __construct(ContainerInterface $container) - { - $this->anilistModel = $container->get('anilist-model'); - $this->kitsuModel = $container->get('kitsu-model'); - - $config = $container->get('config'); - $this->anilistEnabled = (bool)$config->get(['anilist', 'enabled']); - } + protected string $type = 'manga'; /** * Get a category out of the full list @@ -116,132 +79,6 @@ class Manga extends API { return $this->kitsuModel->getMangaById($animeId); } - /** - * Get information about a specific list item - * for editing/updating that item - * - * @param string $itemId - * @return MangaListItem - */ - public function getLibraryItem(string $itemId): MangaListItem - { - return $this->kitsuModel->getListItem($itemId); - } - - /** - * Create a new manga list item - * - * @param array $data - * @return bool - * @throws Throwable - */ - public function createLibraryItem(array $data): bool - { - $requester = new ParallelAPIRequest(); - $requester->addRequest($this->kitsuModel->createListItem($data), 'kitsu'); - - if ($this->anilistEnabled && array_key_exists('mal_id', $data)) - { - $requester->addRequest($this->anilistModel->createListItem($data, 'MANGA'), 'anilist'); - } - - $results = $requester->makeRequests(); - - return count($results) > 0; - } - - /** - * Update a list entry - * - * @param FormItem $data - * @return array - * @throws Throwable - */ - public function updateLibraryItem(FormItem $data): array - { - $requester = new ParallelAPIRequest(); - $requester->addRequest($this->kitsuModel->updateListItem($data), 'kitsu'); - - $array = $data->toArray(); - - if ($this->anilistEnabled && array_key_exists('mal_id', $array)) - { - $requester->addRequest($this->anilistModel->updateListItem($data, 'MANGA'), 'anilist'); - } - - $results = $requester->makeRequests(); - $body = Json::decode($results['kitsu']); - $statusCode = array_key_exists('errors', $body) ? 400: 200; - - return [ - 'body' => Json::decode($results['kitsu']), - 'statusCode' => $statusCode - ]; - } - - /** - * Increase the progress of a list entry - * - * @param FormItem $data - * @return array - * @throws Throwable - */ - public function incrementLibraryItem(FormItem $data): array - { - $requester = new ParallelAPIRequest(); - $requester->addRequest($this->kitsuModel->incrementListItem($data), 'kitsu'); - - $array = $data->toArray(); - - if ($this->anilistEnabled && array_key_exists('mal_id', $array)) - { - $requester->addRequest($this->anilistModel->incrementListItem($data, 'MANGA'), 'anilist'); - } - - $results = $requester->makeRequests(); - - $body = Json::decode($results['kitsu']); - $statusCode = array_key_exists('errors', $body) - ? $body['errors'][0]['status'] - : 200; - - return [$body, $statusCode]; - } - - /** - * Delete a list entry - * - * @param string $id - * @param string|null $malId - * @return bool - * @throws Throwable - */ - public function deleteLibraryItem(string $id, string $malId = NULL): bool - { - $requester = new ParallelAPIRequest(); - $requester->addRequest($this->kitsuModel->deleteListItem($id), 'kitsu'); - - if ($this->anilistEnabled && $malId !== null) - { - $requester->addRequest($this->anilistModel->deleteListItem($malId, 'MANGA'), 'anilist'); - } - - $results = $requester->makeRequests(); - - return count($results) > 0; - } - - /** - * Search for manga by name - * - * @param string $name - * @return array - */ - public function search($name): array - { - return $this->kitsuModel->search('manga', $name); - } - /** * Get recent reading history * diff --git a/src/AnimeClient/Model/MediaTrait.php b/src/AnimeClient/Model/MediaTrait.php new file mode 100644 index 00000000..57ed4109 --- /dev/null +++ b/src/AnimeClient/Model/MediaTrait.php @@ -0,0 +1,213 @@ + + * @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\Model; + +use Aviat\AnimeClient\API\Anilist; +use Aviat\AnimeClient\API\Kitsu; +use Aviat\AnimeClient\API\ParallelAPIRequest; +use Aviat\AnimeClient\Types\AnimeListItem; +use Aviat\AnimeClient\Types\FormItem; +use Aviat\AnimeClient\Types\MangaListItem; +use Aviat\Ion\Di\ContainerInterface; +use Aviat\Ion\Json; + +use Throwable; + +/** + * Common functionality for Anime/Manga Models + */ +trait MediaTrait { + + /** + * Is the Anilist API enabled? + * + * @var boolean + */ + protected bool $anilistEnabled; + + /** + * Model for making requests to Anilist API + * + * @var Anilist\Model + */ + protected Anilist\Model $anilistModel; + + /** + * Model for making requests to Kitsu API + * + * @var Kitsu\Model + */ + protected Kitsu\Model $kitsuModel; + + /** + * Anime constructor. + * + * @param ContainerInterface $container + */ + public function __construct(ContainerInterface $container) + { + $this->anilistModel = $container->get('anilist-model'); + $this->kitsuModel = $container->get('kitsu-model'); + + $config = $container->get('config'); + $this->anilistEnabled = (bool) $config->get(['anilist', 'enabled']); + } + + /** + * Search for anime by name + * + * @param string $name + * @return array + */ + public function search(string $name): array + { + return $this->kitsuModel->search($this->type, urldecode($name)); + } + + /** + * Get information about a specific list item + * for editing/updating that item + * + * @param string $itemId + * @return AnimeListItem|MangaListItem + */ + public function getLibraryItem(string $itemId) + { + return $this->kitsuModel->getListItem($itemId); + } + + /** + * Add an anime to your list + * + * @param array $data + * @return bool + * @throws Throwable + */ + public function createLibraryItem(array $data): bool + { + $requester = new ParallelAPIRequest(); + $requester->addRequest($this->kitsuModel->createListItem($data), 'kitsu'); + + if ($this->anilistEnabled && $data['mal_id'] !== null) + { + // If can't map MAL id, this will be null + $maybeRequest = $this->anilistModel->createListItem($data, strtoupper($this->type)); + if ($maybeRequest !== NULL) + { + $requester->addRequest($maybeRequest, 'anilist'); + } + } + + $results = $requester->makeRequests(); + + return count($results) > 0; + } + + /** + * Increment progress for the specified anime + * + * @param FormItem $data + * @return array + * @throws Throwable + */ + public function incrementLibraryItem(FormItem $data): array + { + $requester = new ParallelAPIRequest(); + $requester->addRequest($this->kitsuModel->incrementListItem($data), 'kitsu'); + + if (( ! empty($data['mal_id'])) && $this->anilistEnabled) + { + // If can't map MAL id, this will be null + $maybeRequest = $this->anilistModel->incrementListItem($data, strtoupper($this->type)); + if ($maybeRequest !== NULL) + { + $requester->addRequest($maybeRequest, 'anilist'); + } + } + + $results = $requester->makeRequests(); + + $body = Json::decode($results['kitsu']); + $statusCode = array_key_exists('error', $body) ? 400 : 200; + + return [ + 'body' => Json::decode($results['kitsu']), + 'statusCode' => $statusCode + ]; + } + + /** + * Update a list entry + * + * @param FormItem $data + * @return array + * @throws Throwable + */ + public function updateLibraryItem(FormItem $data): array + { + $requester = new ParallelAPIRequest(); + $requester->addRequest($this->kitsuModel->updateListItem($data), 'kitsu'); + + if (( ! empty($data['mal_id'])) && $this->anilistEnabled) + { + // If can't map MAL id, this will be null + $maybeRequest = $this->anilistModel->updateListItem($data, strtoupper($this->type)); + if ($maybeRequest !== NULL) + { + $requester->addRequest($maybeRequest, 'anilist'); + } + } + + $results = $requester->makeRequests(); + + $body = Json::decode($results['kitsu']); + $statusCode = array_key_exists('errors', $body) ? 400: 200; + + return [ + 'body' => Json::decode($results['kitsu']), + 'statusCode' => $statusCode + ]; + } + + /** + * Delete a list entry + * + * @param string $id + * @param string|null $malId + * @return bool + * @throws Throwable + */ + public function deleteLibraryItem(string $id, string $malId = NULL): bool + { + $requester = new ParallelAPIRequest(); + $requester->addRequest($this->kitsuModel->deleteListItem($id), 'kitsu'); + + if ($this->anilistEnabled && $malId !== null) + { + // If can't map MAL id, this will be null + $maybeRequest = $this->anilistModel->deleteListItem($malId, strtoupper($this->type)); + if ($maybeRequest !== NULL) + { + $requester->addRequest($maybeRequest, 'anilist'); + } + } + + $results = $requester->makeRequests(); + + return count($results) > 0; + } +} \ No newline at end of file