Skip to content

Commit

Permalink
Update cart serialize and deserialization (#13)
Browse files Browse the repository at this point in the history
* Use built in unserialization exceptions so that the nested deserialization happens in other code paths
* Added functions for nested serialization
  • Loading branch information
dbertouille authored and jerairrest committed Oct 4, 2017
1 parent f540a06 commit ca2d771
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 3 deletions.
4 changes: 3 additions & 1 deletion src/Models/Cart/Item.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
<?php
namespace BoldApps\ShopifyToolkit\Models\Cart;

class Item
use BoldApps\ShopifyToolkit\Contracts\Serializeable;

class Item implements Serializeable
{
/**
* @var int
Expand Down
51 changes: 49 additions & 2 deletions src/Services/Cart.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,15 @@

class Cart extends Base
{
protected $unserializationExceptions = [
'items' => 'unserializeItems',
'variant_options' => 'unserializeOptions',
];

protected $serializationExceptions = [
'items' => 'serializeItems',
'variantOptions' => 'serializeOptions',
];

/**
* @return CartModel
Expand All @@ -18,7 +27,6 @@ public function get($cartToken, $password = null)

$raw = $this->client->get('cart.json',[], $this->getCartCookie($cartToken), $password, true);

$raw['items'] = $this->unserializeItems($raw['items']);
$cart = $this->unserializeModel($raw, CartModel::class);

return $cart;
Expand Down Expand Up @@ -96,6 +104,26 @@ private function getCartCookie($cartToken) {
return [$cartCookie];
}

/**
* @param $entities
*
* @return array|null
*/
protected function serializeItems($entities)
{
if (null === $entities) {
return;
}

if ($entities instanceof Collection) {
return $entities->map(function ($entity) {
return $this->serializeModel($entity);
})->toArray();
}

return $entities;
}

/**
* @param array $data
*
Expand All @@ -108,13 +136,32 @@ protected function unserializeItems($data)
}

$items = array_map(function ($item){
$item['variant_options'] = $this->unserializeOptions($item['variant_options']);
return $this->unserializeModel($item, CartItemModel::class);
}, $data);

return new Collection($items);
}

/**
* @param $entities
*
* @return array|null
*/
protected function serializeOptions($entities)
{
if (null === $entities) {
return;
}

if ($entities instanceof Collection) {
return $entities->map(function ($entity) {
return $this->serializeModel($entity);
})->toArray();
}

return $entities;
}

/**
* @param array $data
*
Expand Down

0 comments on commit ca2d771

Please sign in to comment.