Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
Naoray committed Dec 18, 2024
1 parent 539fa62 commit 953ae1a
Show file tree
Hide file tree
Showing 10 changed files with 145 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use Mollie\Api\Resources\BaseResource;
use Mollie\Api\Resources\LazyCollection;

interface ResourceDecorator
interface IsWrapper
{
/**
* @param Response|BaseResource|BaseCollection|LazyCollection $resource
Expand Down
8 changes: 4 additions & 4 deletions src/Http/Requests/ResourceHydratableRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
namespace Mollie\Api\Http\Requests;

use Mollie\Api\Http\Request;
use Mollie\Api\Resources\DecorateResource;
use Mollie\Api\Resources\WrapResource;

abstract class ResourceHydratableRequest extends Request
{
Expand All @@ -17,7 +17,7 @@ abstract class ResourceHydratableRequest extends Request
/**
* The custom resource class the request should be hydrated into.
*
* @var string|null|DecorateResource
* @var string|null|WrapResource
*/
protected $customHydratableResource = null;

Expand All @@ -27,7 +27,7 @@ public function isHydratable(): bool
}

/**
* @return string|DecorateResource
* @return string|WrapResource
*/
public function getHydratableResource()
{
Expand All @@ -39,7 +39,7 @@ public function getHydratableResource()
}

/**
* @param string|DecorateResource $hydratableResource
* @param string|WrapResource $hydratableResource
*/
public function setHydratableResource($hydratableResource): self
{
Expand Down
16 changes: 8 additions & 8 deletions src/Resources/DecorateResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@

namespace Mollie\Api\Resources;

use Mollie\Api\Contracts\ResourceDecorator;
use Mollie\Api\Contracts\IsWrapper;

class DecorateResource
class WrapResource
{
protected string $decoratedResource;
protected string $wrappedResource;

protected ?string $decorator = null;

public function __construct(string $decoratedResource, ?string $decorator = null)
{
$this->decoratedResource = $decoratedResource;
$this->wrappedResource = $decoratedResource;

if ($decorator) {
$this->with($decorator);
Expand All @@ -21,7 +21,7 @@ public function __construct(string $decoratedResource, ?string $decorator = null

public function with(string $decorator): self
{
if (! is_subclass_of($decorator, ResourceDecorator::class)) {
if (! is_subclass_of($decorator, IsWrapper::class)) {
throw new \InvalidArgumentException("The decorator class '{$decorator}' does not implement the DecoratedResource interface.");
}

Expand All @@ -30,12 +30,12 @@ public function with(string $decorator): self
return $this;
}

public function getDecoratedResource(): string
public function getWrappedResource(): string
{
return $this->decoratedResource;
return $this->wrappedResource;
}

public function getDecorator(): ?string
public function getWrapper(): ?string
{
if (! $this->decorator) {
throw new \InvalidArgumentException('The decorator class is not set.');
Expand Down
12 changes: 6 additions & 6 deletions src/Resources/ResourceFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

use Mollie\Api\Contracts\Connector;
use Mollie\Api\Contracts\EmbeddedResourcesContract;
use Mollie\Api\Contracts\ResourceDecorator;
use Mollie\Api\Contracts\IsWrapper;
use Mollie\Api\Exceptions\EmbeddedResourcesNotParseableException;
use Mollie\Api\Http\Response;

Expand Down Expand Up @@ -63,9 +63,9 @@ public static function createBaseResourceCollection(
*
* @param Response|BaseResource|BaseCollection|LazyCollection $response
*/
public static function createDecoratedResource($response, string $decorator): ResourceDecorator
public static function createDecoratedResource($response, string $decorator): IsWrapper
{
if (! is_subclass_of($decorator, ResourceDecorator::class)) {
if (! is_subclass_of($decorator, IsWrapper::class)) {
throw new \InvalidArgumentException("The decorator class '{$decorator}' does not implement the ResourceDecorator interface.");
}

Expand Down Expand Up @@ -96,7 +96,7 @@ private static function parseEmbeddedResources(Connector $connector, object $res

if (is_null($collectionOrResourceClass)) {
throw new EmbeddedResourcesNotParseableException(
'Resource '.get_class($resource)." does not have a mapping for embedded resource {$resourceKey}"
'Resource ' . get_class($resource) . " does not have a mapping for embedded resource {$resourceKey}"
);
}

Expand Down Expand Up @@ -156,7 +156,7 @@ private static function instantiateBaseCollection(
private static function mapToResourceObjects(Connector $connector, $data, string $resourceClass, Response $response): array
{
return array_map(
fn ($item) => static::createFromApiResult(
fn($item) => static::createFromApiResult(
$connector,
$item,
$resourceClass,
Expand All @@ -168,6 +168,6 @@ private static function mapToResourceObjects(Connector $connector, $data, string

private static function determineCollectionClass(string $resourceClass, ?string $resourceCollectionClass): string
{
return $resourceCollectionClass ?: $resourceClass.'Collection';
return $resourceCollectionClass ?: $resourceClass . 'Collection';
}
}
8 changes: 4 additions & 4 deletions src/Resources/ResourceHydrator.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
namespace Mollie\Api\Resources;

use Mollie\Api\Contracts\IsIteratable;
use Mollie\Api\Contracts\ResourceDecorator;
use Mollie\Api\Contracts\IsWrapper;
use Mollie\Api\Http\Request;
use Mollie\Api\Http\Requests\ResourceHydratableRequest;
use Mollie\Api\Http\Response;
Expand All @@ -13,20 +13,20 @@ class ResourceHydrator
/**
* Hydrate a response into a resource or collection
*
* @return Response|BaseResource|BaseCollection|LazyCollection|ResourceDecorator
* @return Response|BaseResource|BaseCollection|LazyCollection|IsWrapper
*/
public function hydrate(ResourceHydratableRequest $request, Response $response)
{
$targetResourceClass = $request->getHydratableResource();

if ($targetResourceClass instanceof DecorateResource) {
if ($targetResourceClass instanceof WrapResource) {
$response = $this->hydrate(
// Reset the hydratable resource to the original resource class.
$request->resetHydratableResource(),
$response,
);

return ResourceFactory::createDecoratedResource($response, $targetResourceClass->getDecorator());
return ResourceFactory::createDecoratedResource($response, $targetResourceClass->getWrapper());
}

if ($this->isCollectionTarget($targetResourceClass)) {
Expand Down
25 changes: 25 additions & 0 deletions src/Resources/ResourceWrapper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace Mollie\Api\Resources;

use Mollie\Api\Contracts\IsWrapper;
use Mollie\Api\Traits\ForwardsCalls;

abstract class ResourceWrapper implements IsWrapper
{
use ForwardsCalls;

protected $resource;

public function setResource($resource): static
{
$this->resource = $resource;

return $this;
}

public function __call($name, $arguments)
{
return $this->forwardDecoratedCallTo($this->resource, $name, $arguments);
}
}
46 changes: 46 additions & 0 deletions src/Resources/WrapResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

namespace Mollie\Api\Resources;

use Mollie\Api\Contracts\IsWrapper;

class WrapResource
{
protected string $wrappedResource;

protected ?string $wrapper = null;

public function __construct(string $decoratedResource, ?string $wrapper = null)
{
$this->wrappedResource = $decoratedResource;

if ($wrapper) {
$this->with($wrapper);
}
}

public function with(string $wrapper): self
{
if (! is_subclass_of($wrapper, IsWrapper::class)) {
throw new \InvalidArgumentException("The wrapper class '{$wrapper}' does not implement the IsWrapper interface.");
}

$this->wrapper = $wrapper;

return $this;
}

public function getWrappedResource(): string
{
return $this->wrappedResource;
}

public function getWrapper(): ?string
{
if (! $this->wrapper) {
throw new \InvalidArgumentException('The wrapper class is not set.');
}

return $this->wrapper;
}
}
44 changes: 44 additions & 0 deletions src/Traits/ForwardsCalls.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

namespace Mollie\Api\Traits;

use BadMethodCallException;

trait ForwardsCalls
{
/**
* Forward a method call to the given object.
*
* @param mixed $object
* @param string $method
* @param array $parameters
* @return mixed
*
* @throws \BadMethodCallException
*/
protected function forwardCallTo($object, $method, $parameters)
{
if (! method_exists($object, $method)) {
throw new BadMethodCallException("Method {$method} does not exist on {$object}.");
}

return $object->{$method}(...$parameters);
}

/**
* Forward a method call to the given object, returning $this if the forwarded call returned itself.
*
* @param mixed $object
* @param string $method
* @param array $parameters
* @return mixed
*
* @throws \BadMethodCallException
*/
protected function forwardDecoratedCallTo($object, $method, $parameters)
{
$result = $this->forwardCallTo($object, $method, $parameters);

return $result === $object ? $this : $result;
}
}
6 changes: 3 additions & 3 deletions tests/Resources/ResourceFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace Tests\Resources;

use Mollie\Api\Contracts\ResourceDecorator;
use Mollie\Api\Contracts\IsWrapper;
use Mollie\Api\Http\Response;
use Mollie\Api\MollieApiClient;
use Mollie\Api\Resources\AnyResource;
Expand Down Expand Up @@ -286,7 +286,7 @@ class CustomPaymentCollection extends BaseCollection
//
}

class CustomResourceDecorator implements ResourceDecorator
class CustomResourceDecorator implements IsWrapper
{
public string $status;

Expand All @@ -308,7 +308,7 @@ public function __construct(
$this->dashboardUrl = $dashboardUrl;
}

public static function fromResource($onboarding): ResourceDecorator
public static function fromResource($onboarding): IsWrapper
{
/** @var Onboarding $onboarding */
return new self(
Expand Down
8 changes: 4 additions & 4 deletions tests/Resources/ResourceHydratorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
namespace Mollie\Api\Tests\Resources;

use Mollie\Api\Contracts\IsIteratable;
use Mollie\Api\Contracts\ResourceDecorator;
use Mollie\Api\Contracts\IsWrapper;
use Mollie\Api\Http\Requests\ResourceHydratableRequest;
use Mollie\Api\Http\Response;
use Mollie\Api\MollieApiClient;
use Mollie\Api\Resources\AnyResource;
use Mollie\Api\Resources\BaseResource;
use Mollie\Api\Resources\CursorCollection;
use Mollie\Api\Resources\DecorateResource;
use Mollie\Api\Resources\WrapResource;
use Mollie\Api\Resources\LazyCollection;
use Mollie\Api\Resources\ResourceCollection;
use Mollie\Api\Resources\ResourceHydrator;
Expand Down Expand Up @@ -130,7 +130,7 @@ public function hydrate_decorated_resource(): void
$request = $this->createMock(ResourceHydratableRequest::class);
$response = $this->createMock(Response::class);

$decoratedResource = (new DecorateResource(AnyResource::class))
$decoratedResource = (new WrapResource(AnyResource::class))
->with(CustomDecorator::class);

$request->expects($this->exactly(2))
Expand Down Expand Up @@ -185,7 +185,7 @@ class CustomCollection extends CursorCollection
public static string $collectionName = 'items';
}

class CustomDecorator implements ResourceDecorator
class CustomDecorator implements IsWrapper
{
public static function fromResource($resource): self
{
Expand Down

0 comments on commit 953ae1a

Please sign in to comment.