Version 5.1 - All the GraphQL #32
@ -122,7 +122,6 @@ final class AnimeListTransformer extends AbstractTransformer {
|
|||||||
|
|
||||||
$untransformed = FormItem::from([
|
$untransformed = FormItem::from([
|
||||||
'id' => $item['id'],
|
'id' => $item['id'],
|
||||||
'anilist_item_id' => $item['anilist_item_id'] ?? NULL,
|
|
||||||
'mal_id' => $item['mal_id'] ?? NULL,
|
'mal_id' => $item['mal_id'] ?? NULL,
|
||||||
'data' => [
|
'data' => [
|
||||||
'status' => $item['watching_status'],
|
'status' => $item['watching_status'],
|
||||||
|
@ -166,7 +166,7 @@ final class Kitsu {
|
|||||||
*/
|
*/
|
||||||
public static function parseStreamingLinks(array $nodes): array
|
public static function parseStreamingLinks(array $nodes): array
|
||||||
{
|
{
|
||||||
if (count($nodes) === 0)
|
if (empty($nodes))
|
||||||
{
|
{
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
@ -179,12 +179,16 @@ final class Kitsu {
|
|||||||
|
|
||||||
// 'Fix' links that start with the hostname,
|
// 'Fix' links that start with the hostname,
|
||||||
// rather than a protocol
|
// rather than a protocol
|
||||||
if (strpos($url, '//') === FALSE)
|
if ( ! str_contains($url, '//'))
|
||||||
{
|
{
|
||||||
$url = '//' . $url;
|
$url = '//' . $url;
|
||||||
}
|
}
|
||||||
|
|
||||||
$host = parse_url($url, \PHP_URL_HOST);
|
$host = parse_url($url, \PHP_URL_HOST);
|
||||||
|
if ($host === FALSE)
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
$links[] = [
|
$links[] = [
|
||||||
'meta' => self::getServiceMetaData($host),
|
'meta' => self::getServiceMetaData($host),
|
||||||
|
@ -45,7 +45,7 @@ final class MenuGenerator extends UrlGenerator {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param ContainerInterface $container
|
* @param ContainerInterface $container
|
||||||
* @return static
|
* @return self
|
||||||
*/
|
*/
|
||||||
public static function new(ContainerInterface $container): self
|
public static function new(ContainerInterface $container): self
|
||||||
{
|
{
|
||||||
|
@ -92,6 +92,11 @@ final class AnimeCollection extends Collection {
|
|||||||
$genres = $this->getGenreList();
|
$genres = $this->getGenreList();
|
||||||
$media = $this->getMediaList();
|
$media = $this->getMediaList();
|
||||||
|
|
||||||
|
if ($rows === FALSE)
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
foreach($rows as &$row)
|
foreach($rows as &$row)
|
||||||
{
|
{
|
||||||
$id = $row['hummingbird_id'];
|
$id = $row['hummingbird_id'];
|
||||||
@ -128,7 +133,13 @@ final class AnimeCollection extends Collection {
|
|||||||
->from('media')
|
->from('media')
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
foreach ($query->fetchAll(PDO::FETCH_ASSOC) as $row)
|
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
if ($rows === FALSE)
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($rows as $row)
|
||||||
{
|
{
|
||||||
$flatList[$row['id']] = $row['type'];
|
$flatList[$row['id']] = $row['type'];
|
||||||
}
|
}
|
||||||
@ -158,10 +169,10 @@ final class AnimeCollection extends Collection {
|
|||||||
/**
|
/**
|
||||||
* Add an item to the anime collection
|
* Add an item to the anime collection
|
||||||
*
|
*
|
||||||
* @param array $data
|
* @param mixed $data
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function add($data): void
|
public function add(mixed $data): void
|
||||||
{
|
{
|
||||||
if ($this->validDatabase === FALSE)
|
if ($this->validDatabase === FALSE)
|
||||||
{
|
{
|
||||||
@ -197,10 +208,10 @@ final class AnimeCollection extends Collection {
|
|||||||
/**
|
/**
|
||||||
* Verify that an item was added
|
* Verify that an item was added
|
||||||
*
|
*
|
||||||
* @param array|null|object $data
|
* @param array $data
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function wasAdded($data): bool
|
public function wasAdded(array $data): bool
|
||||||
{
|
{
|
||||||
if ($this->validDatabase === FALSE)
|
if ($this->validDatabase === FALSE)
|
||||||
{
|
{
|
||||||
@ -218,7 +229,7 @@ final class AnimeCollection extends Collection {
|
|||||||
* @param array $data
|
* @param array $data
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function update($data): void
|
public function update(array $data): void
|
||||||
{
|
{
|
||||||
if ($this->validDatabase === FALSE)
|
if ($this->validDatabase === FALSE)
|
||||||
{
|
{
|
||||||
@ -253,11 +264,11 @@ final class AnimeCollection extends Collection {
|
|||||||
/**
|
/**
|
||||||
* Verify that the collection item was updated
|
* Verify that the collection item was updated
|
||||||
*
|
*
|
||||||
* @param array|null|object $data
|
* @param array $data
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function wasUpdated($data): bool
|
public function wasUpdated(array $data): bool
|
||||||
{
|
{
|
||||||
if ($this->validDatabase === FALSE)
|
if ($this->validDatabase === FALSE)
|
||||||
{
|
{
|
||||||
@ -288,7 +299,7 @@ final class AnimeCollection extends Collection {
|
|||||||
* @param array $data
|
* @param array $data
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function delete($data): void
|
public function delete(array $data): void
|
||||||
{
|
{
|
||||||
if ($this->validDatabase === FALSE)
|
if ($this->validDatabase === FALSE)
|
||||||
{
|
{
|
||||||
@ -316,10 +327,10 @@ final class AnimeCollection extends Collection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array|null|object $data
|
* @param array $data
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function wasDeleted($data): bool
|
public function wasDeleted(array $data): bool
|
||||||
{
|
{
|
||||||
if ($this->validDatabase === FALSE)
|
if ($this->validDatabase === FALSE)
|
||||||
{
|
{
|
||||||
@ -335,7 +346,7 @@ final class AnimeCollection extends Collection {
|
|||||||
* @param int|string $kitsuId
|
* @param int|string $kitsuId
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function get($kitsuId): array
|
public function get(int|string $kitsuId): array
|
||||||
{
|
{
|
||||||
if ($this->validDatabase === FALSE)
|
if ($this->validDatabase === FALSE)
|
||||||
{
|
{
|
||||||
@ -348,6 +359,11 @@ final class AnimeCollection extends Collection {
|
|||||||
->get()
|
->get()
|
||||||
->fetch(PDO::FETCH_ASSOC);
|
->fetch(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
if ($row === FALSE)
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
// Get the media ids
|
// Get the media ids
|
||||||
$mediaRows = $this->db->select('media_id')
|
$mediaRows = $this->db->select('media_id')
|
||||||
->from('anime_set_media_link')
|
->from('anime_set_media_link')
|
||||||
@ -355,6 +371,11 @@ final class AnimeCollection extends Collection {
|
|||||||
->get()
|
->get()
|
||||||
->fetchAll(PDO::FETCH_ASSOC);
|
->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
if ($mediaRows === FALSE)
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
$row['media_id'] = array_column($mediaRows, 'media_id');
|
$row['media_id'] = array_column($mediaRows, 'media_id');
|
||||||
|
|
||||||
return $row;
|
return $row;
|
||||||
@ -366,7 +387,7 @@ final class AnimeCollection extends Collection {
|
|||||||
* @param int|string $kitsuId
|
* @param int|string $kitsuId
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function has($kitsuId): bool
|
public function has(int|string $kitsuId): bool
|
||||||
{
|
{
|
||||||
if ($this->validDatabase === FALSE)
|
if ($this->validDatabase === FALSE)
|
||||||
{
|
{
|
||||||
@ -416,7 +437,13 @@ final class AnimeCollection extends Collection {
|
|||||||
->orderBy('genre')
|
->orderBy('genre')
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
foreach ($query->fetchAll(PDO::FETCH_ASSOC) as $row)
|
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
if ($rows === FALSE)
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($rows as $row)
|
||||||
{
|
{
|
||||||
$id = $row['hummingbird_id'];
|
$id = $row['hummingbird_id'];
|
||||||
$genre = $row['genre'];
|
$genre = $row['genre'];
|
||||||
@ -437,7 +464,7 @@ final class AnimeCollection extends Collection {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {}
|
catch (PDOException) {}
|
||||||
|
|
||||||
$this->db->resetQuery();
|
$this->db->resetQuery();
|
||||||
|
|
||||||
@ -478,7 +505,13 @@ final class AnimeCollection extends Collection {
|
|||||||
->orderBy('media')
|
->orderBy('media')
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
foreach ($query->fetchAll(PDO::FETCH_ASSOC) as $row)
|
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
if ($rows === FALSE)
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($rows as $row)
|
||||||
{
|
{
|
||||||
$id = $row['hummingbird_id'];
|
$id = $row['hummingbird_id'];
|
||||||
$media = $row['media'];
|
$media = $row['media'];
|
||||||
@ -609,7 +642,7 @@ final class AnimeCollection extends Collection {
|
|||||||
{
|
{
|
||||||
$this->db->insertBatch('genres', $insert);
|
$this->db->insertBatch('genres', $insert);
|
||||||
}
|
}
|
||||||
catch (PDOException $e)
|
catch (PDOException)
|
||||||
{
|
{
|
||||||
// dump($e);
|
// dump($e);
|
||||||
}
|
}
|
||||||
@ -642,7 +675,13 @@ final class AnimeCollection extends Collection {
|
|||||||
->from('genres')
|
->from('genres')
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
foreach ($query->fetchAll(PDO::FETCH_ASSOC) as $genre)
|
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
if ($rows === FALSE)
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($rows as $genre)
|
||||||
{
|
{
|
||||||
$genres[$genre['id']] = $genre['genre'];
|
$genres[$genre['id']] = $genre['genre'];
|
||||||
}
|
}
|
||||||
@ -665,7 +704,13 @@ final class AnimeCollection extends Collection {
|
|||||||
->from('anime_set_genre_link')
|
->from('anime_set_genre_link')
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
foreach ($query->fetchAll(PDO::FETCH_ASSOC) as $link)
|
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
if ($rows === FALSE)
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($rows as $link)
|
||||||
{
|
{
|
||||||
if (array_key_exists($link['hummingbird_id'], $links))
|
if (array_key_exists($link['hummingbird_id'], $links))
|
||||||
{
|
{
|
||||||
@ -706,6 +751,11 @@ final class AnimeCollection extends Collection {
|
|||||||
|
|
||||||
// Add genres associated with each item
|
// Add genres associated with each item
|
||||||
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
|
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
if ($rows === FALSE)
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
$genres = $this->getGenreList();
|
$genres = $this->getGenreList();
|
||||||
|
|
||||||
foreach($rows as &$row)
|
foreach($rows as &$row)
|
||||||
|
@ -67,10 +67,11 @@ class Collection extends DB {
|
|||||||
{
|
{
|
||||||
$dbFileName = $this->dbConfig['file'];
|
$dbFileName = $this->dbConfig['file'];
|
||||||
|
|
||||||
if ($dbFileName !== ':memory:' && file_exists($dbFileName))
|
if ($dbFileName !== ':memory:')
|
||||||
{
|
{
|
||||||
$dbFile = file_get_contents($dbFileName);
|
$rawFile = file_get_contents($dbFileName);
|
||||||
$this->validDatabase = (strpos($dbFile, 'SQLite format 3') === 0);
|
$dbFile = ($rawFile !== FALSE) ? $rawFile : '';
|
||||||
|
$this->validDatabase = str_starts_with($dbFile, 'SQLite format 3');
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -69,9 +69,7 @@ final class Settings {
|
|||||||
{
|
{
|
||||||
$output = [];
|
$output = [];
|
||||||
|
|
||||||
$settings = $this->getSettings();
|
foreach($this->getSettings() as $file => $values)
|
||||||
|
|
||||||
foreach($settings as $file => $values)
|
|
||||||
{
|
{
|
||||||
$values = $values ?? [];
|
$values = $values ?? [];
|
||||||
|
|
||||||
|
@ -23,10 +23,10 @@ abstract class AbstractType implements ArrayAccess, Countable {
|
|||||||
/**
|
/**
|
||||||
* Populate values for un-serializing data
|
* Populate values for un-serializing data
|
||||||
*
|
*
|
||||||
* @param $properties
|
* @param mixed $properties
|
||||||
* @return self
|
* @return self
|
||||||
*/
|
*/
|
||||||
public static function __set_state($properties): self
|
public static function __set_state(mixed $properties): self
|
||||||
{
|
{
|
||||||
return new static($properties);
|
return new static($properties);
|
||||||
}
|
}
|
||||||
@ -43,7 +43,8 @@ abstract class AbstractType implements ArrayAccess, Countable {
|
|||||||
|
|
||||||
if (get_parent_class($currentClass) !== FALSE)
|
if (get_parent_class($currentClass) !== FALSE)
|
||||||
{
|
{
|
||||||
return (new $currentClass($data))->toArray();
|
$output = static::class::from($data)->toArray();
|
||||||
|
return (is_array($output)) ? $output : [];
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -55,7 +56,7 @@ abstract class AbstractType implements ArrayAccess, Countable {
|
|||||||
* @param mixed $data
|
* @param mixed $data
|
||||||
* @return static
|
* @return static
|
||||||
*/
|
*/
|
||||||
final public static function from($data): self
|
final public static function from(mixed $data): static
|
||||||
{
|
{
|
||||||
return new static($data);
|
return new static($data);
|
||||||
}
|
}
|
||||||
@ -65,7 +66,7 @@ abstract class AbstractType implements ArrayAccess, Countable {
|
|||||||
*
|
*
|
||||||
* @param mixed $data
|
* @param mixed $data
|
||||||
*/
|
*/
|
||||||
final private function __construct($data = [])
|
final private function __construct(mixed $data = [])
|
||||||
{
|
{
|
||||||
$typeKeys = array_keys((array)$this);
|
$typeKeys = array_keys((array)$this);
|
||||||
$dataKeys = array_keys((array)$data);
|
$dataKeys = array_keys((array)$data);
|
||||||
@ -87,10 +88,10 @@ abstract class AbstractType implements ArrayAccess, Countable {
|
|||||||
/**
|
/**
|
||||||
* See if a property is set
|
* See if a property is set
|
||||||
*
|
*
|
||||||
* @param $name
|
* @param string $name
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
final public function __isset($name): bool
|
final public function __isset(string $name): bool
|
||||||
{
|
{
|
||||||
return property_exists($this, $name) && isset($this->$name);
|
return property_exists($this, $name) && isset($this->$name);
|
||||||
}
|
}
|
||||||
@ -102,7 +103,7 @@ abstract class AbstractType implements ArrayAccess, Countable {
|
|||||||
* @param mixed $value
|
* @param mixed $value
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
final public function __set($name, $value): void
|
final public function __set(string $name, mixed $value): void
|
||||||
{
|
{
|
||||||
$setterMethod = 'set' . ucfirst($name);
|
$setterMethod = 'set' . ucfirst($name);
|
||||||
|
|
||||||
@ -128,7 +129,7 @@ abstract class AbstractType implements ArrayAccess, Countable {
|
|||||||
* @param string $name
|
* @param string $name
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
final public function __get($name)
|
final public function __get(string $name): mixed
|
||||||
{
|
{
|
||||||
// Be a bit more lenient here, so that you can easily typecast missing
|
// Be a bit more lenient here, so that you can easily typecast missing
|
||||||
// values to reasonable defaults, and not have to resort to array indexes
|
// values to reasonable defaults, and not have to resort to array indexes
|
||||||
@ -148,46 +149,47 @@ abstract class AbstractType implements ArrayAccess, Countable {
|
|||||||
/**
|
/**
|
||||||
* Implementing ArrayAccess
|
* Implementing ArrayAccess
|
||||||
*
|
*
|
||||||
* @param $offset
|
* @param mixed $offset
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
final public function offsetExists($offset): bool
|
final public function offsetExists(mixed $offset): bool
|
||||||
{
|
{
|
||||||
return $this->__isset($offset);
|
return $this->__isset((string)$offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementing ArrayAccess
|
* Implementing ArrayAccess
|
||||||
*
|
*
|
||||||
* @param $offset
|
* @param mixed $offset
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
final public function offsetGet($offset)
|
final public function offsetGet(mixed $offset): mixed
|
||||||
{
|
{
|
||||||
return $this->__get($offset);
|
return $this->__get((string)$offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementing ArrayAccess
|
* Implementing ArrayAccess
|
||||||
*
|
*
|
||||||
* @param $offset
|
* @param mixed $offset
|
||||||
* @param $value
|
* @param mixed $value
|
||||||
*/
|
*/
|
||||||
final public function offsetSet($offset, $value): void
|
final public function offsetSet(mixed $offset, mixed $value): void
|
||||||
{
|
{
|
||||||
$this->__set($offset, $value);
|
$this->__set((string)$offset, $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementing ArrayAccess
|
* Implementing ArrayAccess
|
||||||
*
|
*
|
||||||
* @param $offset
|
* @param mixed $offset
|
||||||
*/
|
*/
|
||||||
final public function offsetUnset($offset): void
|
final public function offsetUnset(mixed $offset): void
|
||||||
{
|
{
|
||||||
if ($this->offsetExists($offset))
|
if ($this->offsetExists($offset))
|
||||||
{
|
{
|
||||||
unset($this->$offset);
|
$strOffset = (string)$offset;
|
||||||
|
unset($this->$strOffset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,17 +200,19 @@ abstract class AbstractType implements ArrayAccess, Countable {
|
|||||||
*/
|
*/
|
||||||
final public function count(): int
|
final public function count(): int
|
||||||
{
|
{
|
||||||
$keys = array_keys($this->toArray());
|
$keys = array_keys((array)$this->toArray());
|
||||||
return count($keys);
|
return count($keys);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recursively cast properties to an array
|
* Recursively cast properties to an array
|
||||||
*
|
*
|
||||||
|
* Returns early on primitive values to work recursively.
|
||||||
|
*
|
||||||
* @param mixed $parent
|
* @param mixed $parent
|
||||||
* @return mixed
|
* @return float|bool|null|int|array|string
|
||||||
*/
|
*/
|
||||||
final public function toArray($parent = null)
|
final public function toArray(mixed $parent = null): float|null|bool|int|array|string
|
||||||
{
|
{
|
||||||
$object = $parent ?? $this;
|
$object = $parent ?? $this;
|
||||||
|
|
||||||
@ -236,7 +240,8 @@ abstract class AbstractType implements ArrayAccess, Countable {
|
|||||||
*/
|
*/
|
||||||
final public function isEmpty(): bool
|
final public function isEmpty(): bool
|
||||||
{
|
{
|
||||||
foreach ($this as $value)
|
$self = (array)$this->toArray();
|
||||||
|
foreach ($self as $value)
|
||||||
{
|
{
|
||||||
if ( ! empty($value))
|
if ( ! empty($value))
|
||||||
{
|
{
|
||||||
|
@ -35,9 +35,9 @@ class Anime extends AbstractType {
|
|||||||
public array $genres = [];
|
public array $genres = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string|int
|
* @var string
|
||||||
*/
|
*/
|
||||||
public $id = '';
|
public string $id = '';
|
||||||
|
|
||||||
public array $included = [];
|
public array $included = [];
|
||||||
|
|
||||||
|
@ -24,11 +24,6 @@ final class AnimeListItem extends AbstractType {
|
|||||||
|
|
||||||
public ?string $mal_id;
|
public ?string $mal_id;
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $anilist_item_id;
|
|
||||||
|
|
||||||
public array $episodes = [
|
public array $episodes = [
|
||||||
'length' => 0,
|
'length' => 0,
|
||||||
'total' => 0,
|
'total' => 0,
|
||||||
@ -54,14 +49,14 @@ final class AnimeListItem extends AbstractType {
|
|||||||
/**
|
/**
|
||||||
* @var string|int
|
* @var string|int
|
||||||
*/
|
*/
|
||||||
public $user_rating = '';
|
public string|int $user_rating = '';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* One of Aviat\AnimeClient\API\Enum\AnimeWatchingStatus
|
* One of Aviat\AnimeClient\API\Enum\AnimeWatchingStatus
|
||||||
*/
|
*/
|
||||||
public string $watching_status;
|
public string $watching_status;
|
||||||
|
|
||||||
public function setAnime($anime): void
|
public function setAnime(mixed $anime): void
|
||||||
{
|
{
|
||||||
$this->anime = Anime::from($anime);
|
$this->anime = Anime::from($anime);
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ final class Character extends AbstractType {
|
|||||||
/**
|
/**
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
public $id;
|
public string $id;
|
||||||
|
|
||||||
public array $included = [];
|
public array $included = [];
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ final class Character extends AbstractType {
|
|||||||
|
|
||||||
public array $otherNames = [];
|
public array $otherNames = [];
|
||||||
|
|
||||||
public function setMedia ($media): void
|
public function setMedia (mixed $media): void
|
||||||
{
|
{
|
||||||
$this->media = Media::from($media);
|
$this->media = Media::from($media);
|
||||||
}
|
}
|
||||||
|
@ -47,8 +47,9 @@ class Config extends AbstractType {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The list to redirect to from the root url
|
* The list to redirect to from the root url
|
||||||
|
* 'anime' or 'manga'
|
||||||
*
|
*
|
||||||
* @var 'anime' | 'manga'
|
* @var string|null
|
||||||
*/
|
*/
|
||||||
public ?string $default_list;
|
public ?string $default_list;
|
||||||
|
|
||||||
@ -59,7 +60,10 @@ class Config extends AbstractType {
|
|||||||
public ?string $default_manga_list_path;
|
public ?string $default_manga_list_path;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var 'cover_view' | 'list_view'
|
* Default list view type
|
||||||
|
* 'cover_view' or 'list_view'
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
*/
|
*/
|
||||||
public ?string $default_view_type;
|
public ?string $default_view_type;
|
||||||
|
|
||||||
@ -70,17 +74,18 @@ class Config extends AbstractType {
|
|||||||
/**
|
/**
|
||||||
* @var string|bool
|
* @var string|bool
|
||||||
*/
|
*/
|
||||||
public $show_anime_collection = FALSE;
|
public string|bool $show_anime_collection = FALSE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string|bool
|
* @var string|bool
|
||||||
*/
|
*/
|
||||||
public $show_manga_collection = FALSE;
|
public string|bool $show_manga_collection = FALSE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CSS theme: light, dark, or auto-switching
|
* CSS theme: light, dark, or auto-switching
|
||||||
|
* 'auto', 'light', or 'dark'
|
||||||
*
|
*
|
||||||
* @var 'auto' | 'light' | 'dark'
|
* @var string|null
|
||||||
*/
|
*/
|
||||||
public ?string $theme = 'auto';
|
public ?string $theme = 'auto';
|
||||||
|
|
||||||
@ -116,17 +121,17 @@ class Config extends AbstractType {
|
|||||||
|
|
||||||
public ?string $view_path;
|
public ?string $view_path;
|
||||||
|
|
||||||
public function setAnilist ($data): void
|
public function setAnilist (mixed $data): void
|
||||||
{
|
{
|
||||||
$this->anilist = Config\Anilist::from($data);
|
$this->anilist = Config\Anilist::from($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setCache ($data): void
|
public function setCache (mixed $data): void
|
||||||
{
|
{
|
||||||
$this->cache = Config\Cache::from($data);
|
$this->cache = Config\Cache::from($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setDatabase ($data): void
|
public function setDatabase (mixed $data): void
|
||||||
{
|
{
|
||||||
$this->database = Config\Database::from($data);
|
$this->database = Config\Database::from($data);
|
||||||
}
|
}
|
||||||
|
@ -23,18 +23,16 @@ class FormItem extends AbstractType {
|
|||||||
/**
|
/**
|
||||||
* @var string|int
|
* @var string|int
|
||||||
*/
|
*/
|
||||||
public $id;
|
public string|int $id;
|
||||||
|
|
||||||
public ?string $anilist_item_id;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string|int
|
* @var string|int|null
|
||||||
*/
|
*/
|
||||||
public $mal_id;
|
public string|int|null $mal_id;
|
||||||
|
|
||||||
public ?FormItemData $data;
|
public ?FormItemData $data;
|
||||||
|
|
||||||
public function setData($value): void
|
public function setData(mixed $value): void
|
||||||
{
|
{
|
||||||
$this->data = FormItemData::from($value);
|
$this->data = FormItemData::from($value);
|
||||||
}
|
}
|
||||||
|
@ -23,12 +23,12 @@ use Aviat\AnimeClient\API\Kitsu\Enum\MangaPublishingStatus;
|
|||||||
*/
|
*/
|
||||||
final class MangaPage extends AbstractType {
|
final class MangaPage extends AbstractType {
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string|null
|
||||||
*/
|
*/
|
||||||
public ?string $age_rating;
|
public ?string $age_rating;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string|null
|
||||||
*/
|
*/
|
||||||
public ?string $age_rating_guide;
|
public ?string $age_rating_guide;
|
||||||
|
|
||||||
@ -38,14 +38,14 @@ final class MangaPage extends AbstractType {
|
|||||||
public array $characters;
|
public array $characters;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var int
|
* @var int|null
|
||||||
*/
|
*/
|
||||||
public $chapter_count;
|
public ?int $chapter_count;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string|null
|
||||||
*/
|
*/
|
||||||
public $cover_image;
|
public ?string $cover_image;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array
|
* @var array
|
||||||
@ -60,15 +60,15 @@ final class MangaPage extends AbstractType {
|
|||||||
/**
|
/**
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
public $id;
|
public string $id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
public $manga_type;
|
public string $manga_type;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var MangaPublishingStatus
|
* @var string
|
||||||
*/
|
*/
|
||||||
public string $status = MangaPublishingStatus::FINISHED;
|
public string $status = MangaPublishingStatus::FINISHED;
|
||||||
|
|
||||||
@ -103,7 +103,7 @@ final class MangaPage extends AbstractType {
|
|||||||
public string $url;
|
public string $url;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var int
|
* @var int|null
|
||||||
*/
|
*/
|
||||||
public ?int $volume_count;
|
public ?int $volume_count;
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ namespace Aviat\AnimeClient\Types;
|
|||||||
*/
|
*/
|
||||||
final class Person extends AbstractType {
|
final class Person extends AbstractType {
|
||||||
|
|
||||||
public $id;
|
public string $id;
|
||||||
|
|
||||||
public ?string $name;
|
public ?string $name;
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ class UrlGenerator extends RoutingBase {
|
|||||||
/**
|
/**
|
||||||
* Get the base url for css/js/images
|
* Get the base url for css/js/images
|
||||||
*
|
*
|
||||||
* @param array $args
|
* @param string ...$args
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function assetUrl(string ...$args): string
|
public function assetUrl(string ...$args): string
|
||||||
|
@ -57,11 +57,11 @@ class Util {
|
|||||||
/**
|
/**
|
||||||
* Absolutely equal?
|
* Absolutely equal?
|
||||||
*
|
*
|
||||||
* @param $left
|
* @param mixed $left
|
||||||
* @param $right
|
* @param mixed $right
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function eq($left, $right): bool
|
public static function eq(mixed $left, mixed $right): bool
|
||||||
{
|
{
|
||||||
return $left === $right;
|
return $left === $right;
|
||||||
}
|
}
|
||||||
|
@ -29,21 +29,21 @@ class Container implements ContainerInterface {
|
|||||||
*
|
*
|
||||||
* @var Callable[]
|
* @var Callable[]
|
||||||
*/
|
*/
|
||||||
protected $container = [];
|
protected array $container = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Array of object instances
|
* Array of object instances
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $instances = [];
|
protected array $instances = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map of logger instances
|
* Map of logger instances
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $loggers = [];
|
protected array $loggers = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
@ -66,7 +66,7 @@ class Container implements ContainerInterface {
|
|||||||
*
|
*
|
||||||
* @return mixed Entry.
|
* @return mixed Entry.
|
||||||
*/
|
*/
|
||||||
public function get($id)
|
public function get($id): mixed
|
||||||
{
|
{
|
||||||
if ( ! \is_string($id))
|
if ( ! \is_string($id))
|
||||||
{
|
{
|
||||||
@ -99,7 +99,7 @@ class Container implements ContainerInterface {
|
|||||||
* @throws ContainerException - Error while retrieving the entry.
|
* @throws ContainerException - Error while retrieving the entry.
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public function getNew($id, array $args = NULL)
|
public function getNew($id, array $args = NULL): mixed
|
||||||
{
|
{
|
||||||
if ( ! \is_string($id))
|
if ( ! \is_string($id))
|
||||||
{
|
{
|
||||||
@ -141,7 +141,7 @@ class Container implements ContainerInterface {
|
|||||||
* @throws NotFoundException - No entry was found for this identifier.
|
* @throws NotFoundException - No entry was found for this identifier.
|
||||||
* @return ContainerInterface
|
* @return ContainerInterface
|
||||||
*/
|
*/
|
||||||
public function setInstance(string $id, $value): ContainerInterface
|
public function setInstance(string $id, mixed $value): ContainerInterface
|
||||||
{
|
{
|
||||||
if ( ! $this->has($id))
|
if ( ! $this->has($id))
|
||||||
{
|
{
|
||||||
@ -209,15 +209,20 @@ class Container implements ContainerInterface {
|
|||||||
* @param mixed $obj
|
* @param mixed $obj
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
private function applyContainer($obj)
|
private function applyContainer(mixed $obj): mixed
|
||||||
{
|
{
|
||||||
$trait_name = ContainerAware::class;
|
$traitName = ContainerAware::class;
|
||||||
$interface_name = ContainerAwareInterface::class;
|
$interfaceName = ContainerAwareInterface::class;
|
||||||
|
|
||||||
$uses_trait = \in_array($trait_name, class_uses($obj), TRUE);
|
$traits = class_uses($obj);
|
||||||
$implements_interface = \in_array($interface_name, class_implements($obj), TRUE);
|
$traitsUsed = (is_array($traits)) ? $traits : [];
|
||||||
|
$usesTrait = in_array($traitName, $traitsUsed, TRUE);
|
||||||
|
|
||||||
if ($uses_trait || $implements_interface)
|
$interfaces = class_implements($obj);
|
||||||
|
$implemented = (is_array($interfaces)) ? $interfaces : [];
|
||||||
|
$implementsInterface = in_array($interfaceName, $implemented, TRUE);
|
||||||
|
|
||||||
|
if ($usesTrait || $implementsInterface)
|
||||||
{
|
{
|
||||||
$obj->setContainer($this);
|
$obj->setContainer($this);
|
||||||
}
|
}
|
||||||
|
@ -32,11 +32,12 @@ class Json {
|
|||||||
* @throws JsonException
|
* @throws JsonException
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function encode($data, $options = 0, $depth = 512): string
|
public static function encode(mixed $data, int $options = 0, int $depth = 512): string
|
||||||
{
|
{
|
||||||
$json = json_encode($data, $options, $depth);
|
$json = json_encode($data, $options, $depth);
|
||||||
self::check_json_error();
|
self::check_json_error();
|
||||||
return $json;
|
|
||||||
|
return ($json !== FALSE) ? $json : '';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -47,12 +48,14 @@ class Json {
|
|||||||
* @param int $jsonOptions - Options to pass to json_encode
|
* @param int $jsonOptions - Options to pass to json_encode
|
||||||
* @param int $fileOptions - Options to pass to file_get_contents
|
* @param int $fileOptions - Options to pass to file_get_contents
|
||||||
* @throws JsonException
|
* @throws JsonException
|
||||||
* @return int
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function encodeFile(string $filename, $data, int $jsonOptions = 0, int $fileOptions = 0): int
|
public static function encodeFile(string $filename, mixed $data, int $jsonOptions = 0, int $fileOptions = 0): bool
|
||||||
{
|
{
|
||||||
$json = self::encode($data, $jsonOptions);
|
$json = self::encode($data, $jsonOptions);
|
||||||
return file_put_contents($filename, $json, $fileOptions);
|
|
||||||
|
$res = file_put_contents($filename, $json, $fileOptions);
|
||||||
|
return $res !== FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -65,7 +68,7 @@ class Json {
|
|||||||
* @throws JsonException
|
* @throws JsonException
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public static function decode($json, bool $assoc = TRUE, int $depth = 512, int $options = 0)
|
public static function decode(?string $json, bool $assoc = TRUE, int $depth = 512, int $options = 0): mixed
|
||||||
{
|
{
|
||||||
// Don't try to decode null
|
// Don't try to decode null
|
||||||
if ($json === NULL)
|
if ($json === NULL)
|
||||||
@ -89,9 +92,11 @@ class Json {
|
|||||||
* @throws JsonException
|
* @throws JsonException
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public static function decodeFile(string $filename, bool $assoc = TRUE, int $depth = 512, int $options = 0)
|
public static function decodeFile(string $filename, bool $assoc = TRUE, int $depth = 512, int $options = 0): mixed
|
||||||
{
|
{
|
||||||
$json = file_get_contents($filename);
|
$rawJson = file_get_contents($filename);
|
||||||
|
$json = ($rawJson !== FALSE) ? $rawJson : '';
|
||||||
|
|
||||||
return self::decode($json, $assoc, $depth, $options);
|
return self::decode($json, $assoc, $depth, $options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ class StringType extends Stringy {
|
|||||||
* Alias for `create` static constructor
|
* Alias for `create` static constructor
|
||||||
*
|
*
|
||||||
* @param string $str
|
* @param string $str
|
||||||
* @return $this
|
* @return self
|
||||||
*/
|
*/
|
||||||
public static function from(string $str): self
|
public static function from(string $str): self
|
||||||
{
|
{
|
||||||
|
@ -69,7 +69,8 @@ class HtmlView extends HttpView {
|
|||||||
ob_start();
|
ob_start();
|
||||||
extract($data, EXTR_OVERWRITE);
|
extract($data, EXTR_OVERWRITE);
|
||||||
include_once $path;
|
include_once $path;
|
||||||
$buffer = ob_get_clean();
|
$rawBuffer = ob_get_clean();
|
||||||
|
$buffer = ($rawBuffer === FALSE) ? '' : $rawBuffer;
|
||||||
|
|
||||||
|
|
||||||
// Very basic html minify, that won't affect content between html tags
|
// Very basic html minify, that won't affect content between html tags
|
||||||
|
@ -103,9 +103,9 @@ class HttpView implements ViewInterface{
|
|||||||
* Set the output string
|
* Set the output string
|
||||||
*
|
*
|
||||||
* @param mixed $string
|
* @param mixed $string
|
||||||
* @return HttpView
|
* @return ViewInterface
|
||||||
*/
|
*/
|
||||||
public function setOutput($string): self
|
public function setOutput($string): ViewInterface
|
||||||
{
|
{
|
||||||
$this->response->getBody()->write($string);
|
$this->response->getBody()->write($string);
|
||||||
|
|
||||||
@ -117,9 +117,9 @@ class HttpView implements ViewInterface{
|
|||||||
* Append additional output.
|
* Append additional output.
|
||||||
*
|
*
|
||||||
* @param string $string
|
* @param string $string
|
||||||
* @return HttpView
|
* @return ViewInterface
|
||||||
*/
|
*/
|
||||||
public function appendOutput(string $string): self
|
public function appendOutput(string $string): ViewInterface
|
||||||
{
|
{
|
||||||
return $this->setOutput($string);
|
return $this->setOutput($string);
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
namespace Aviat\Ion\View;
|
namespace Aviat\Ion\View;
|
||||||
|
|
||||||
use Aviat\Ion\Json;
|
use Aviat\Ion\Json;
|
||||||
|
use Aviat\Ion\ViewInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* View class to serialize Json
|
* View class to serialize Json
|
||||||
@ -34,9 +35,9 @@ class JsonView extends HttpView {
|
|||||||
* Set the output string
|
* Set the output string
|
||||||
*
|
*
|
||||||
* @param mixed $string
|
* @param mixed $string
|
||||||
* @return JsonView
|
* @return ViewInterface
|
||||||
*/
|
*/
|
||||||
public function setOutput($string): self
|
public function setOutput($string): ViewInterface
|
||||||
{
|
{
|
||||||
if ( ! is_string($string))
|
if ( ! is_string($string))
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
empty: false
|
empty: false
|
||||||
id: 14047981
|
id: 14047981
|
||||||
anilist_item_id: null
|
|
||||||
mal_id: null
|
mal_id: null
|
||||||
data:
|
data:
|
||||||
empty: false
|
empty: false
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
empty: false
|
empty: false
|
||||||
id: 14047981
|
id: 14047981
|
||||||
anilist_item_id: null
|
|
||||||
mal_id: '12345'
|
mal_id: '12345'
|
||||||
data:
|
data:
|
||||||
empty: false
|
empty: false
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
empty: false
|
empty: false
|
||||||
id: 14047983
|
id: 14047983
|
||||||
anilist_item_id: null
|
|
||||||
mal_id: '12347'
|
mal_id: '12347'
|
||||||
data:
|
data:
|
||||||
empty: false
|
empty: false
|
||||||
|
Loading…
Reference in New Issue
Block a user