From 47bfe810fc20120f07dabffc4b7011355d97626a Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Wed, 1 Feb 2017 09:53:02 -0500 Subject: [PATCH] Able to create list items on MAL --- src/API/MAL/ListItem.php | 45 ++++++++++--- src/API/MAL/MALTrait.php | 80 +++++++---------------- src/API/MAL/Model.php | 137 +++++++++++++++++++-------------------- 3 files changed, 127 insertions(+), 135 deletions(-) diff --git a/src/API/MAL/ListItem.php b/src/API/MAL/ListItem.php index 03a04473..95f9633c 100644 --- a/src/API/MAL/ListItem.php +++ b/src/API/MAL/ListItem.php @@ -16,29 +16,44 @@ namespace Aviat\AnimeClient\API\MAL; -use Aviat\AnimeClient\API\AbstractListItem; +use Amp\Artax\FormBody; +use Aviat\AnimeClient\API\{ + AbstractListItem, + XML +}; use Aviat\Ion\Di\ContainerAware; /** * CRUD operations for MAL list items */ -class ListItem extends AbstractListItem { +class ListItem { use ContainerAware; use MALTrait; - public function __construct() - { - $this->init(); - } - public function create(array $data): bool { - return FALSE; + $id = $data['id']; + $body = (new FormBody) + ->addField('id', $data['id']) + ->addField('data', XML::toXML(['entry' => $data['data']])); + $response = $this->getResponse('POST', "animelist/add/{$id}.xml", [ + 'headers' => [ + 'Content-type' => 'application/x-www-form-urlencoded', + 'Accept' => 'text/plain' + ], + 'body' => $body + ]); + + return $response->getStatus() === 201; } public function delete(string $id): bool { - return FALSE; + $response = $this->getResponse('DELETE', "animeclient/delete/{$id}.xml", [ + 'body' => (new FormBody)->addField('id', $id) + ]); + + return $response->getBody() === 'Deleted'; } public function get(string $id): array @@ -48,6 +63,16 @@ class ListItem extends AbstractListItem { public function update(string $id, array $data): Response { - + $body = (new FormBody) + ->addField('id', $id) + ->addField('data', XML::toXML(['entry' => $data])) + + return $this->postRequest("animelist/update/{$id}.xml", [ + 'headers' => [ + 'Content-type' => 'application/x-www-form-urlencoded', + 'Accept' => 'text/plain' + ], + 'body' => $body + ]); } } \ No newline at end of file diff --git a/src/API/MAL/MALTrait.php b/src/API/MAL/MALTrait.php index 4d50931e..5a7cfbb3 100644 --- a/src/API/MAL/MALTrait.php +++ b/src/API/MAL/MALTrait.php @@ -16,18 +16,15 @@ namespace Aviat\AnimeClient\API\MAL; +use Amp\Artax\{Client, Request}; use Aviat\AnimeClient\API\{ - GuzzleTrait, MAL as M, XML }; -use GuzzleHttp\Client; -use GuzzleHttp\Cookie\CookieJar; -use GuzzleHttp\Psr7\Response; +use Aviat\Ion\Json; use InvalidArgumentException; trait MALTrait { - use GuzzleTrait; /** * The base url for api requests @@ -44,29 +41,6 @@ trait MALTrait { 'User-Agent' => "Tim's Anime Client/4.0" ]; - /** - * Set up the class properties - * - * @return void - */ - protected function init() - { - $defaults = [ - 'cookies' => $this->cookieJar, - 'headers' => $this->defaultHeaders, - 'timeout' => 25, - 'connect_timeout' => 25 - ]; - - $this->cookieJar = new CookieJar(); - $this->client = new Client([ - 'base_uri' => $this->baseUrl, - 'cookies' => TRUE, - 'http_errors' => TRUE, - 'defaults' => $defaults - ]); - } - /** * Make a request via Guzzle * @@ -87,21 +61,29 @@ trait MALTrait { $config = $this->container->get('config'); $logger = $this->container->getLogger('request'); - - $defaultOptions = [ - 'auth' => [ - $config->get(['mal','username']), - $config->get(['mal','password']) - ], - 'headers' => $this->defaultHeaders - ]; - - $options = array_merge($defaultOptions, $options); + + $headers = array_merge($this->defaultHeaders, $options['headers'] ?? [], [ + 'Authorization' => 'Basic ' . + base64_encode($config->get(['mal','username']) . ':' .$config->get(['mal','password'])) + ]); + + $query = $options['query'] ?? []; + + $url = (strpos($url, '//') !== FALSE) + ? $url . '?' . http_build_query($query) + : $this->baseUrl . $url . '?' . http_build_query($query); + + $request = (new Request) + ->setMethod($type) + ->setUri($url) + ->setProtocol('1.1') + ->setAllHeaders($headers) + ->setBody($options['body']); $logger->debug(Json::encode([$type, $url])); $logger->debug(Json::encode($options)); - return $this->client->request($type, $url, $options); + return \Amp\wait((new Client)->request($request)); } /** @@ -122,15 +104,13 @@ trait MALTrait { $response = $this->getResponse($type, $url, $options); - if ((int) $response->getStatusCode() > 299 || (int) $response->getStatusCode() < 200) + if ((int) $response->getStatus() > 299 || (int) $response->getStatus() < 200) { if ($logger) { $logger->warning('Non 200 response for api call'); $logger->warning($response->getBody()); } - - // throw new RuntimeException($response->getBody()); } return XML::toArray((string) $response->getBody()); @@ -164,7 +144,7 @@ trait MALTrait { $response = $this->getResponse('POST', ...$args); $validResponseCodes = [200, 201]; - if ( ! in_array((int) $response->getStatusCode(), $validResponseCodes)) + if ( ! in_array((int) $response->getStatus(), $validResponseCodes)) { if ($logger) { @@ -173,18 +153,6 @@ trait MALTrait { } } - return XML::toArray((string) $response->getBody()); - } - - /** - * Remove some boilerplate for delete requests - * - * @param array $args - * @return bool - */ - protected function deleteRequest(...$args): bool - { - $response = $this->getResponse('DELETE', ...$args); - return ((int) $response->getStatusCode() === 204); + return XML::toArray($response->getBody()); } } \ No newline at end of file diff --git a/src/API/MAL/Model.php b/src/API/MAL/Model.php index a2861c88..650df789 100644 --- a/src/API/MAL/Model.php +++ b/src/API/MAL/Model.php @@ -1,70 +1,69 @@ - - * @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\MAL; - -use Aviat\AnimeClient\API\MAL as M; -use Aviat\AnimeClient\API\MAL\{ - AnimeListTransformer, - ListItem -}; -use Aviat\AnimeClient\API\XML; -use Aviat\Ion\Di\ContainerAware; - -/** - * MyAnimeList API Model - */ -class Model { - use ContainerAware; - use MALTrait; - - /** - * @var AnimeListTransformer - */ - protected $animeListTransformer; - - /** - * KitsuModel constructor. - */ - public function __construct(ListItem $listItem) - { - // Set up Guzzle trait - $this->init(); - $this->animeListTransformer = new AnimeListTransformer(); - $this->listItem = $listItem; - } - - public function createListItem(array $data): bool - { - return FALSE; - } - - public function getListItem(string $listId): array - { - return []; - } - - public function updateListItem(array $data) - { - $updateData = $this->animeListTransformer->transform($data['data']); - return $this->listItem->update($data['mal_id'], $updateData); - } - - public function deleteListItem(string $id): bool - { - - } + + * @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\MAL; + +use Aviat\AnimeClient\API\MAL as M; +use Aviat\AnimeClient\API\MAL\{ + AnimeListTransformer, + ListItem +}; +use Aviat\AnimeClient\API\XML; +use Aviat\Ion\Di\ContainerAware; +use Aviat\Ion\Json; + +/** + * MyAnimeList API Model + */ +class Model { + use ContainerAware; + use MALTrait; + + /** + * @var AnimeListTransformer + */ + protected $animeListTransformer; + + /** + * KitsuModel constructor. + */ + public function __construct(ListItem $listItem) + { + //$this->animeListTransformer = new AnimeListTransformer(); + $this->listItem = $listItem; + } + + public function createListItem(array $data): bool + { + return $this->listItem->create($data); + } + + public function getListItem(string $listId): array + { + return []; + } + + public function updateListItem(array $data) + { + //$updateData = $this->animeListTransformer->transform($data['data']); + return $this->listItem->update($data['mal_id'], $updateData); + } + + public function deleteListItem(string $id): bool + { + return $this->listItem->delete($id); + } } \ No newline at end of file