Fully working version of working with products
This commit is contained in:
parent
44bd43128b
commit
22c4101729
@ -48,6 +48,13 @@ class Client
|
||||
return json_decode($data->getBody()->getContents(), true);
|
||||
}
|
||||
|
||||
public function put(string $url, array $data)
|
||||
{
|
||||
$this->client->put($url, [
|
||||
RequestOptions::JSON => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function get(string $url, array $parameters = []): array
|
||||
{
|
||||
$data = $this->client->get($url, [
|
||||
|
@ -4,6 +4,10 @@
|
||||
namespace Ardent\GrocyApi;
|
||||
|
||||
|
||||
use Ardent\GrocyApi\Objects\AbstractApiObject;
|
||||
use Ardent\GrocyApi\Objects\ObjectTransformer;
|
||||
use Ardent\GrocyApi\Objects\ProductsObject;
|
||||
|
||||
class GrocyClient
|
||||
{
|
||||
private Client $client;
|
||||
@ -13,23 +17,67 @@ class GrocyClient
|
||||
$this->client = new Client($host, $apikey);
|
||||
}
|
||||
|
||||
private function getObjects(string $object, array $query = [], $order = null, $limit = null, $offset = null)
|
||||
/**
|
||||
* @return AbstractApiObject[]
|
||||
*/
|
||||
private function getObjects(string $entity, array $query = [], string $order = null, int $limit = null, int $offset = null)
|
||||
{
|
||||
return $this->client->get(sprintf('objects/%s', $object), compact('order', 'limit', 'offset'));
|
||||
$array = $this->client->get(sprintf('objects/%s', $entity), compact('order', 'limit', 'offset'));
|
||||
$objects = [];
|
||||
foreach ($array as $rawObject) {
|
||||
$objects[] = ObjectTransformer::denormalize($rawObject, $entity);
|
||||
}
|
||||
|
||||
private function getObject(string $object, int $id)
|
||||
{
|
||||
return $this->client->get(sprintf('%s/%s', $object, $id));
|
||||
return $objects;
|
||||
}
|
||||
|
||||
public function getAllProducts()
|
||||
private function getObject(string $entity, int $id): AbstractApiObject
|
||||
{
|
||||
$rawObject = $this->client->get(sprintf('objects/%s/%s', $entity, $id));
|
||||
return ObjectTransformer::denormalize($rawObject, $entity);
|
||||
}
|
||||
|
||||
private function setObject(string $entity, AbstractApiObject $object, int $id = null): void
|
||||
{
|
||||
$this->client->put(
|
||||
sprintf('objects/%s/%s', $entity, $id),
|
||||
ObjectTransformer::normalize($object)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int the id of the created object
|
||||
*/
|
||||
private function addObject(string $entity, AbstractApiObject $object): int
|
||||
{
|
||||
$data = $this->client->post(
|
||||
sprintf('objects/%s', $entity),
|
||||
ObjectTransformer::normalize($object)
|
||||
);
|
||||
return $data['created_object_id'];
|
||||
dd($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ProductsObject[]
|
||||
*/
|
||||
public function getProducts(): array
|
||||
{
|
||||
return $this->getObjects('products');
|
||||
}
|
||||
|
||||
public function getProduct(int $id)
|
||||
public function getProduct(int $id): ProductsObject
|
||||
{
|
||||
$this->getObject('products', $id);
|
||||
return $this->getObject('products', $id);
|
||||
}
|
||||
|
||||
public function setProduct(ProductsObject $product, int $id): void
|
||||
{
|
||||
$this->setObject('products', $product, $id);
|
||||
}
|
||||
|
||||
public function addProduct(ProductsObject $product): int
|
||||
{
|
||||
return $this->addObject('products', $product);
|
||||
}
|
||||
}
|
@ -6,15 +6,24 @@ namespace Ardent\GrocyApi\Objects;
|
||||
|
||||
abstract class AbstractApiObject
|
||||
{
|
||||
abstract static public function getType(): string;
|
||||
//
|
||||
// static function validateObject(array $apiObject): ?self
|
||||
// {
|
||||
// if($apiObject['type'] === self::getType()) {
|
||||
// return self::fromApi($apiObject);
|
||||
// }
|
||||
// return null;
|
||||
// }
|
||||
private int $id;
|
||||
|
||||
abstract static public function fromApi(array $apiObject): self;
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getId(): int
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $id
|
||||
*
|
||||
* @return ProductsObject
|
||||
*/
|
||||
public function setId(int $id): ProductsObject
|
||||
{
|
||||
$this->id = $id;
|
||||
return $this;
|
||||
}
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace Ardent\GrocyApi\Objects;
|
||||
|
||||
|
||||
class ApiListTransformer
|
||||
{
|
||||
|
||||
public static function getObjects(array $items): array
|
||||
{
|
||||
$objects = [];
|
||||
foreach ($items as $item) {
|
||||
$object = self::getObject($item);
|
||||
if ($object) {
|
||||
$objects[] = $object;
|
||||
}
|
||||
}
|
||||
return $objects;
|
||||
}
|
||||
|
||||
public static function getObject(mixed $item): mixed
|
||||
{
|
||||
$name = self::list($item['type']);
|
||||
if ($name) {
|
||||
/** @var AbstractApiObject $name */
|
||||
return $name::fromApi($item);
|
||||
} else {
|
||||
return [];
|
||||
printf('Unknown object with type "%s"' . PHP_EOL, $item['type']);
|
||||
dd($item);
|
||||
}
|
||||
}
|
||||
}
|
47
src/Objects/ObjectTransformer.php
Normal file
47
src/Objects/ObjectTransformer.php
Normal file
@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace Ardent\GrocyApi\Objects;
|
||||
|
||||
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Symfony\Component\Serializer\Encoder\JsonEncoder;
|
||||
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
|
||||
use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader;
|
||||
use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;
|
||||
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
|
||||
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
|
||||
use Symfony\Component\Serializer\Serializer;
|
||||
|
||||
class ObjectTransformer
|
||||
{
|
||||
public function SerializeObjectToJsonResponse($object, $context = []): JsonResponse
|
||||
{
|
||||
$defaultContext = [
|
||||
AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => function ($object, $format, $context) {
|
||||
return $object->getId();
|
||||
},
|
||||
];
|
||||
|
||||
$serializer = new Serializer([
|
||||
new ObjectNormalizer(),
|
||||
], [new JsonEncoder()]);
|
||||
$json = $serializer->serialize($object, 'json', $context);
|
||||
return new JsonResponse($json, 200, [], true);
|
||||
}
|
||||
|
||||
public static function denormalize($object, string $name): AbstractApiObject
|
||||
{
|
||||
return (new ObjectNormalizer())->denormalize($object, sprintf('%s\\%sObject', __NAMESPACE__, ucfirst($name)));
|
||||
}
|
||||
|
||||
public static function normalize(AbstractApiObject $object): array
|
||||
{
|
||||
$classMetaDataFactory = new ClassMetadataFactory(new AnnotationLoader());
|
||||
|
||||
$serializer = new Serializer([
|
||||
new ObjectNormalizer($classMetaDataFactory, new CamelCaseToSnakeCaseNameConverter()),
|
||||
]);
|
||||
return $serializer->normalize($object);
|
||||
}
|
||||
}
|
177
src/Objects/ProductsObject.php
Normal file
177
src/Objects/ProductsObject.php
Normal file
@ -0,0 +1,177 @@
|
||||
<?php
|
||||
|
||||
namespace Ardent\GrocyApi\Objects;
|
||||
|
||||
use Symfony\Component\Serializer\Annotation\Ignore;
|
||||
|
||||
class ProductsObject extends AbstractApiObject
|
||||
{
|
||||
private string $name;
|
||||
|
||||
private string $description;
|
||||
|
||||
private int $min_stock_amount = 0;
|
||||
|
||||
private int $location_id;
|
||||
|
||||
private int $qu_id_stock;
|
||||
|
||||
private int $qu_id_purchase;
|
||||
|
||||
private int $qu_factor_purchase_to_stock;
|
||||
|
||||
#[Ignore]
|
||||
private array $userfields;
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getName(): string
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
*
|
||||
* @return ProductsObject
|
||||
*/
|
||||
public function setName(string $name): ProductsObject
|
||||
{
|
||||
$this->name = $name;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getDescription(): string
|
||||
{
|
||||
return $this->description;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $description
|
||||
*
|
||||
* @return ProductsObject
|
||||
*/
|
||||
public function setDescription(string $description): ProductsObject
|
||||
{
|
||||
$this->description = $description;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getMinStockAmount(): int
|
||||
{
|
||||
return $this->min_stock_amount;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $min_stock_amount
|
||||
*
|
||||
* @return ProductsObject
|
||||
*/
|
||||
public function setMinStockAmount(int $min_stock_amount): ProductsObject
|
||||
{
|
||||
$this->min_stock_amount = $min_stock_amount;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getUserfields(): array
|
||||
{
|
||||
return $this->userfields;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $userfields
|
||||
*
|
||||
* @return ProductsObject
|
||||
*/
|
||||
public function setUserfields(array $userfields): ProductsObject
|
||||
{
|
||||
$this->userfields = $userfields;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getLocationId(): int
|
||||
{
|
||||
return $this->location_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $location_id
|
||||
*
|
||||
* @return ProductsObject
|
||||
*/
|
||||
public function setLocationId(int $location_id): ProductsObject
|
||||
{
|
||||
$this->location_id = $location_id;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getQuIdStock(): int
|
||||
{
|
||||
return $this->qu_id_stock;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $qu_id_stock
|
||||
*
|
||||
* @return ProductsObject
|
||||
*/
|
||||
public function setQuIdStock(int $qu_id_stock): ProductsObject
|
||||
{
|
||||
$this->qu_id_stock = $qu_id_stock;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getQuIdPurchase(): int
|
||||
{
|
||||
return $this->qu_id_purchase;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $qu_id_purchase
|
||||
*
|
||||
* @return ProductsObject
|
||||
*/
|
||||
public function setQuIdPurchase(int $qu_id_purchase): ProductsObject
|
||||
{
|
||||
$this->qu_id_purchase = $qu_id_purchase;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getQuFactorPurchaseToStock(): int
|
||||
{
|
||||
return $this->qu_factor_purchase_to_stock;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $qu_factor_purchase_to_stock
|
||||
*
|
||||
* @return ProductsObject
|
||||
*/
|
||||
public function setQuFactorPurchaseToStock(int $qu_factor_purchase_to_stock): ProductsObject
|
||||
{
|
||||
$this->qu_factor_purchase_to_stock = $qu_factor_purchase_to_stock;
|
||||
return $this;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user