Skip to content

Commit

Permalink
Load unknown attributes from the API
Browse files Browse the repository at this point in the history
  • Loading branch information
paulomarg committed Apr 8, 2022
1 parent 4dd3ecc commit 71ffa9b
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 52 deletions.
104 changes: 52 additions & 52 deletions src/Rest/Base.php
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,44 @@ public static function getPreviousPageInfo()
return static::$PREV_PAGE_QUERY;
}

public function toArray(): array
{
$data = [];

foreach ($this->getProperties() as $prop) {
if (in_array($prop, static::$READ_ONLY_ATTRIBUTES)) {
continue;
}

$includeProp = !empty($this->$prop) || array_key_exists($prop, $this->setProps);
if (self::isHasManyAttribute($prop)) {
if ($includeProp) {
$data[$prop] = [];
/** @var self $assoc */
foreach ($this->$prop as $assoc) {
if (empty($assoc) || is_array($assoc)) {
array_push($data[$prop], $assoc);
} else {
array_push($data[$prop], $assoc->toArray());
}
}
}
} elseif (self::isHasOneAttribute($prop)) {
if ($includeProp) {
if (empty($this->$prop) || is_array($this->$prop)) {
$data[$prop] = $this->$prop;
} else {
$data[$prop] = $this->$prop->toArray();
}
}
} elseif ($includeProp) {
$data[$prop] = $this->$prop;
}
}

return $data;
}

protected static function getJsonBodyName(): string
{
$className = preg_replace("/^([A-z_0-9]+\\\)*([A-z_]+)/", "$2", static::class);
Expand Down Expand Up @@ -232,12 +270,16 @@ private static function createInstancesFromResponse(RestResponse $response, Sess
$pluralClass = self::pluralize($className);

if (!empty($body)) {
if (array_key_exists($className, $body)) {
array_push($objects, self::createInstance($body[$className], $session));
} elseif (array_key_exists($pluralClass, $body)) {
if (array_key_exists($pluralClass, $body)) {
foreach ($body[$pluralClass] as $entry) {
array_push($objects, self::createInstance($entry, $session));
}
} elseif (array_key_exists($className, $body) && array_key_exists(0, $body[$className])) {
foreach ($body[$className] as $entry) {
array_push($objects, self::createInstance($entry, $session));
}
} elseif (array_key_exists($className, $body)) {
array_push($objects, self::createInstance($body[$className], $session));
}
}

Expand Down Expand Up @@ -278,15 +320,11 @@ private static function setInstanceData(self &$instance, array $data): void
{
$instance->originalState = [];

foreach ($instance->getProperties() as $prop) {
if (!array_key_exists($prop, $data)) {
continue;
}

foreach ($data as $prop => $value) {
if (self::isHasManyAttribute($prop)) {
$attrList = [];
if (!empty($data[$prop])) {
foreach ($data[$prop] as $elementData) {
if (!empty($value)) {
foreach ($value as $elementData) {
array_push(
$attrList,
static::$HAS_MANY[$prop]::createInstance($elementData, $instance->session)
Expand All @@ -296,15 +334,15 @@ private static function setInstanceData(self &$instance, array $data): void

$instance->setProperty($prop, $attrList);
} elseif (self::isHasOneAttribute($prop)) {
if (!empty($data[$prop])) {
if (!empty($value)) {
$instance->setProperty(
$prop,
static::$HAS_ONE[$prop]::createInstance($data[$prop], $instance->session)
static::$HAS_ONE[$prop]::createInstance($value, $instance->session)
);
}
} else {
$instance->setProperty($prop, $data[$prop]);
$instance->originalState[$prop] = $data[$prop];
$instance->setProperty($prop, $value);
$instance->originalState[$prop] = $value;
}
}
}
Expand Down Expand Up @@ -356,42 +394,4 @@ private function getProperties(): array

return array_unique(array_merge($props, array_keys($this->setProps)));
}

private function toArray(): array
{
$data = [];

foreach ($this->getProperties() as $prop) {
if (in_array($prop, static::$READ_ONLY_ATTRIBUTES)) {
continue;
}

$includeProp = !empty($this->$prop) || array_key_exists($prop, $this->setProps);
if (self::isHasManyAttribute($prop)) {
if ($includeProp) {
$data[$prop] = [];
/** @var self $assoc */
foreach ($this->$prop as $assoc) {
if (empty($assoc) || is_array($assoc)) {
array_push($data[$prop], $assoc);
} else {
array_push($data[$prop], $assoc->toArray());
}
}
}
} elseif (self::isHasOneAttribute($prop)) {
if ($includeProp) {
if (empty($this->$prop) || is_array($this->$prop)) {
$data[$prop] = $this->$prop;
} else {
$data[$prop] = $this->$prop->toArray();
}
}
} elseif ($includeProp) {
$data[$prop] = $this->$prop;
}
}

return $data;
}
}
21 changes: 21 additions & 0 deletions tests/Clients/BaseRestResourceTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,27 @@ public function testSavesWithChildren()
$resource->save();
}

public function testLoadsUnknownAttribute()
{
$body = ["fake_resource" => ["attribute" => "value", "unknown?" => "some-value"]];

$this->mockTransportRequests([
new MockRequest(
$this->buildMockHttpResponse(200, json_encode($body)),
"{$this->prefix}/fake_resources/1.json",
"GET",
null,
["X-Shopify-Access-Token: access-token"],
),
]);

$resource = FakeResource::find($this->session, 1);

$this->assertEquals("value", $resource->attribute);
$this->assertEquals("some-value", $resource->{"unknown?"});
$this->assertEquals("some-value", $resource->toArray()["unknown?"]);
}

public function testSavesWithUnknownAttribute()
{
$body = ["fake_resource" => ["unknown" => "some-value"]];
Expand Down

0 comments on commit 71ffa9b

Please # to comment.