Add new mapping class for Anime watching statuses

This commit is contained in:
Timothy Warren 2017-03-01 20:51:40 -05:00
parent 2223243a45
commit 1f86d4460c
2 changed files with 80 additions and 48 deletions

View File

@ -0,0 +1,67 @@
<?php declare(strict_types=1);
/**
* Hummingbird Anime List Client
*
* An API client for Kitsu and MyAnimeList to manage anime and manga watch lists
*
* PHP version 7
*
* @package HummingbirdAnimeClient
* @author Timothy J. Warren <tim@timshomepage.net>
* @copyright 2015 - 2017 Timothy J. Warren
* @license http://www.opensource.org/licenses/mit-license.html MIT License
* @version 4.0
* @link https://github.com/timw4mail/HummingBirdAnimeClient
*/
namespace Aviat\AnimeClient\API\Mapping;
use Aviat\AnimeClient\API\{
Kitsu\Enum\AnimeWatchingStatus as Kitsu,
MAL\Enum\AnimeWatchingStatus as MAL
};
use Aviat\Ion\Enum;
class AnimeWatchingStatus extends Enum {
const MAL_TO_KITSU = [
Kitsu::WATCHING => MAL::WATCHING,
Kitsu::PLAN_TO_WATCH => MAL::PLAN_TO_WATCH,
Kitsu::COMPLETED => MAL::COMPLETED,
Kitsu::ON_HOLD => MAL::ON_HOLD,
Kitsu::DROPPED => MAL::DROPPED
];
const KITSU_TO_MAL = [
MAL::WATCHING => Kitsu::WATCHING,
MAL::PLAN_TO_WATCH => Kitsu::PLAN_TO_WATCH,
MAL::COMPLETED => Kitsu::COMPLETED,
MAL::ON_HOLD => Kitsu::ON_HOLD,
MAL::DROPPED => Kitsu::DROPPED
];
const ROUTE_TO_KITSU = [
'watching' => Kitsu::WATCHING,
'plan_to_watch' => Kitsu::PLAN_TO_WATCH,
'on_hold' => Kitsu::ON_HOLD,
'all' => 'all',
'dropped' => Kitsu::DROPPED,
'completed' => Kitsu::COMPLETED
];
const ROUTE_TO_TITLE = [
'all' => 'All',
'watching' => 'Currently Watching',
'plan_to_watch' => 'Plan to Watch',
'on_hold' => 'On Hold',
'dropped' => 'Dropped',
'completed' => 'Completed'
];
const KITSU_TO_TITLE = [
Kitsu::WATCHING => 'Currently Watching',
Kitsu::PLAN_TO_WATCH => 'Plan to Watch',
Kitsu::ON_HOLD => 'On Hold',
Kitsu::DROPPED => 'Dropped',
Kitsu::COMPLETED => 'Completed'
];
}

View File

@ -18,8 +18,11 @@ namespace Aviat\AnimeClient\Controller;
use Aviat\AnimeClient\Controller as BaseController; use Aviat\AnimeClient\Controller as BaseController;
use Aviat\AnimeClient\API\Kitsu; use Aviat\AnimeClient\API\Kitsu;
use Aviat\AnimeClient\API\Kitsu\Enum\AnimeWatchingStatus; use Aviat\AnimeClient\API\Kitsu\{
use Aviat\AnimeClient\API\Kitsu\Transformer\AnimeListTransformer; Enum\AnimeWatchingStatus as KitsuWatchingStatus,
Transformer\AnimeListTransformer
};
use Aviat\AnimeClient\API\Mapping\AnimeWatchingStatus;
use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Di\ContainerInterface;
use Aviat\Ion\Json; use Aviat\Ion\Json;
use Aviat\Ion\StringWrapper; use Aviat\Ion\StringWrapper;
@ -77,29 +80,11 @@ class Anime extends BaseController {
* @param string $view - List or cover view * @param string $view - List or cover view
* @return void * @return void
*/ */
public function index($type = AnimeWatchingStatus::WATCHING, string $view = NULL) public function index($type = KitsuWatchingStatus::WATCHING, string $view = NULL)
{ {
$typeTitleMap = [ $title = (array_key_exists($type, AnimeWatchingStatus::ROUTE_TO_TITLE))
'all' => 'All',
'watching' => 'Currently Watching',
'plan_to_watch' => 'Plan to Watch',
'on_hold' => 'On Hold',
'dropped' => 'Dropped',
'completed' => 'Completed'
];
$modelMap = [
'watching' => AnimeWatchingStatus::WATCHING,
'plan_to_watch' => AnimeWatchingStatus::PLAN_TO_WATCH,
'on_hold' => AnimeWatchingStatus::ON_HOLD,
'all' => 'all',
'dropped' => AnimeWatchingStatus::DROPPED,
'completed' => AnimeWatchingStatus::COMPLETED
];
$title = (array_key_exists($type, $typeTitleMap))
? $this->config->get('whose_list') . ? $this->config->get('whose_list') .
"'s Anime List &middot; {$typeTitleMap[$type]}" "'s Anime List &middot; " . AnimeWatchingStatus::ROUTE_TO_TITLE[$type]
: ''; : '';
$viewMap = [ $viewMap = [
@ -108,7 +93,7 @@ class Anime extends BaseController {
]; ];
$data = ($type !== 'all') $data = ($type !== 'all')
? $this->model->getList($modelMap[$type]) ? $this->model->getList(AnimeWatchingStatus::ROUTE_TO_KITSU[$type])
: $this->model->get_all_lists(); : $this->model->get_all_lists();
$this->outputHTML('anime/' . $viewMap[$view], [ $this->outputHTML('anime/' . $viewMap[$view], [
@ -124,20 +109,12 @@ class Anime extends BaseController {
*/ */
public function addForm() public function addForm()
{ {
$statuses = [
AnimeWatchingStatus::WATCHING => 'Currently Watching',
AnimeWatchingStatus::PLAN_TO_WATCH => 'Plan to Watch',
AnimeWatchingStatus::ON_HOLD => 'On Hold',
AnimeWatchingStatus::DROPPED => 'Dropped',
AnimeWatchingStatus::COMPLETED => 'Completed'
];
$this->setSessionRedirect(); $this->setSessionRedirect();
$this->outputHTML('anime/add', [ $this->outputHTML('anime/add', [
'title' => $this->config->get('whose_list') . 'title' => $this->config->get('whose_list') .
"'s Anime List &middot; Add", "'s Anime List &middot; Add",
'action_url' => $this->urlGenerator->url('anime/add'), 'action_url' => $this->urlGenerator->url('anime/add'),
'status_list' => $statuses 'status_list' => AnimeWatchingStatus::KITSU_TO_TITLE
]); ]);
} }
@ -179,25 +156,13 @@ class Anime extends BaseController {
public function edit($id, $status = "all") public function edit($id, $status = "all")
{ {
$item = $this->model->getLibraryItem($id, $status); $item = $this->model->getLibraryItem($id, $status);
$rawStatusList = AnimeWatchingStatus::getConstList();
$statuses = [];
foreach ($rawStatusList as $statusItem)
{
$statuses[$statusItem] = (string) $this->string($statusItem)
->underscored()
->humanize()
->titleize();
}
$this->setSessionRedirect(); $this->setSessionRedirect();
$this->outputHTML('anime/edit', [ $this->outputHTML('anime/edit', [
'title' => $this->config->get('whose_list') . 'title' => $this->config->get('whose_list') .
"'s Anime List &middot; Edit", "'s Anime List &middot; Edit",
'item' => $item, 'item' => $item,
'statuses' => Kitsu::getStatusToSelectMap(), 'statuses' => AnimeWatchingStatus::KITSU_TO_TITLE,
'action' => $this->container->get('url-generator') 'action' => $this->container->get('url-generator')
->url('/anime/update_form'), ->url('/anime/update_form'),
]); ]);
@ -252,7 +217,7 @@ class Anime extends BaseController {
{ {
if ($this->request->getHeader('content-type')[0] === 'application/json') if ($this->request->getHeader('content-type')[0] === 'application/json')
{ {
$data = JSON::decode((string)$this->request->getBody()); $data = Json::decode((string)$this->request->getBody());
} }
else else
{ {
@ -294,7 +259,7 @@ class Anime extends BaseController {
* @param string $animeId * @param string $animeId
* @return void * @return void
*/ */
public function details($animeId) public function details(string $animeId)
{ {
$data = $this->model->getAnime($animeId); $data = $this->model->getAnime($animeId);