From 3368c28546a9f2c6fd117cb6c9ff88db52501b76 Mon Sep 17 00:00:00 2001 From: Krishan Koenig Date: Mon, 10 Feb 2025 10:44:14 +0100 Subject: [PATCH] refactor: add dedicated create, get and delete requests for sessions --- UPGRADING.md | 2 +- .../SessionEndpointCollection.php | 21 +++--- src/Factories/CreateSessionRequestFactory.php | 20 ++++++ src/Http/Requests/CancelSessionRequest.php | 25 ++++++++ src/Http/Requests/CreateSessionRequest.php | 64 +++++++++++++++++++ src/Http/Requests/GetSessionRequest.php | 25 ++++++++ src/Types/CheckoutFlow.php | 8 +++ .../SessionEndpointCollectionTest.php | 16 +++-- .../Requests/CreateSessionRequestTest.php | 25 ++++++-- tests/Http/Requests/GetSessionRequestTest.php | 10 ++- 10 files changed, 185 insertions(+), 31 deletions(-) create mode 100644 src/Factories/CreateSessionRequestFactory.php create mode 100644 src/Http/Requests/CancelSessionRequest.php create mode 100644 src/Http/Requests/CreateSessionRequest.php create mode 100644 src/Http/Requests/GetSessionRequest.php create mode 100644 src/Types/CheckoutFlow.php diff --git a/UPGRADING.md b/UPGRADING.md index 39cfc4f8..334dd884 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -1,4 +1,4 @@ -# Upgrading +****# Upgrading ## From v2 to v3 diff --git a/src/EndpointCollection/SessionEndpointCollection.php b/src/EndpointCollection/SessionEndpointCollection.php index ab3eef3d..463a8784 100644 --- a/src/EndpointCollection/SessionEndpointCollection.php +++ b/src/EndpointCollection/SessionEndpointCollection.php @@ -3,12 +3,15 @@ namespace Mollie\Api\EndpointCollection; use Mollie\Api\Exceptions\RequestException; +use Mollie\Api\Factories\CreateSessionRequestFactory; use Mollie\Api\Factories\SortablePaginatedQueryFactory; +use Mollie\Api\Http\Requests\CancelSessionRequest; use Mollie\Api\Http\Requests\DynamicDeleteRequest; use Mollie\Api\Http\Requests\DynamicGetRequest; use Mollie\Api\Http\Requests\DynamicPaginatedRequest; use Mollie\Api\Http\Requests\DynamicPostRequest; use Mollie\Api\Http\Requests\DynamicPutRequest; +use Mollie\Api\Http\Requests\GetSessionRequest; use Mollie\Api\Resources\LazyCollection; use Mollie\Api\Resources\Session; use Mollie\Api\Resources\SessionCollection; @@ -20,14 +23,10 @@ class SessionEndpointCollection extends EndpointCollection * * @throws RequestException */ - public function get(string $sessionId, array $query = []): Session + public function get(string $sessionId): Session { - $request = new DynamicGetRequest("sessions/{$sessionId}", $query); - - $request->setHydratableResource(Session::class); - /** @var Session */ - return $this->send($request); + return $this->send(new GetSessionRequest($sessionId)); } /** @@ -35,11 +34,11 @@ public function get(string $sessionId, array $query = []): Session * * @throws RequestException */ - public function create(array $payload = [], array $query = []): Session + public function create(array $payload = []): Session { - $request = new DynamicPostRequest('sessions', $payload, $query); - - $request->setHydratableResource(Session::class); + $request = CreateSessionRequestFactory::new() + ->withPayload($payload) + ->create(); /** @var Session */ return $this->send($request); @@ -72,7 +71,7 @@ public function update(string $id, array $payload = [], array $query = []): Sess */ public function cancel(string $id): void { - $this->send(new DynamicDeleteRequest("sessions/{$id}")); + $this->send(new CancelSessionRequest($id)); } /** diff --git a/src/Factories/CreateSessionRequestFactory.php b/src/Factories/CreateSessionRequestFactory.php new file mode 100644 index 00000000..e72b72c1 --- /dev/null +++ b/src/Factories/CreateSessionRequestFactory.php @@ -0,0 +1,20 @@ +payload('redirectUrl'), + $this->payload('cancelUrl'), + MoneyFactory::new($this->payload('amount'))->create(), + $this->payload('description'), + $this->payload('method'), + $this->payload('checkoutFlow') + ); + } +} diff --git a/src/Http/Requests/CancelSessionRequest.php b/src/Http/Requests/CancelSessionRequest.php new file mode 100644 index 00000000..fec4b99f --- /dev/null +++ b/src/Http/Requests/CancelSessionRequest.php @@ -0,0 +1,25 @@ +sessionId = $sessionId; + } + + public function resolveResourcePath(): string + { + return "sessions/{$this->sessionId}"; + } +} diff --git a/src/Http/Requests/CreateSessionRequest.php b/src/Http/Requests/CreateSessionRequest.php new file mode 100644 index 00000000..96f2449d --- /dev/null +++ b/src/Http/Requests/CreateSessionRequest.php @@ -0,0 +1,64 @@ +redirectUrl = $redirectUrl; + $this->cancelUrl = $cancelUrl; + $this->amount = $amount; + $this->description = $description; + $this->paymentMethod = $method; + $this->checkoutFlow = $checkoutFlow ?? CheckoutFlow::EXPRESS; + } + + protected function defaultPayload(): array + { + return [ + 'redirectUrl' => $this->redirectUrl, + 'cancelUrl' => $this->cancelUrl, + 'amount' => $this->amount, + 'description' => $this->description, + 'method' => $this->paymentMethod, + 'checkoutFlow' => $this->checkoutFlow, + ]; + } + + public function resolveResourcePath(): string + { + return 'sessions'; + } +} diff --git a/src/Http/Requests/GetSessionRequest.php b/src/Http/Requests/GetSessionRequest.php new file mode 100644 index 00000000..4bd858af --- /dev/null +++ b/src/Http/Requests/GetSessionRequest.php @@ -0,0 +1,25 @@ +id = $id; + } + + public function resolveResourcePath(): string + { + return 'sessions/' . $this->id; + } +} diff --git a/src/Types/CheckoutFlow.php b/src/Types/CheckoutFlow.php new file mode 100644 index 00000000..9e7f95ef --- /dev/null +++ b/src/Types/CheckoutFlow.php @@ -0,0 +1,8 @@ + MockResponse::ok('session'), + GetSessionRequest::class => MockResponse::ok('session'), ]); /** @var Session $session */ - $session = $client->sessions->get('ses_123', ['include' => 'details']); + $session = $client->sessions->get('ses_123'); $this->assertSession($session); } @@ -33,13 +34,16 @@ public function get() public function create() { $client = new MockMollieClient([ - DynamicPostRequest::class => MockResponse::created('session'), + CreateSessionRequest::class => MockResponse::created('session'), ]); /** @var Session $session */ $session = $client->sessions->create([ + 'redirectUrl' => 'https://example.com/redirect', + 'cancelUrl' => 'https://example.com/cancel', 'amount' => new Money('EUR', '10.00'), 'description' => 'Test Session', + 'method' => 'ideal' ]); $this->assertSession($session); @@ -64,7 +68,7 @@ public function update() public function cancel() { $client = new MockMollieClient([ - DynamicDeleteRequest::class => MockResponse::noContent(), + CancelSessionRequest::class => MockResponse::noContent(), ]); $client->sessions->cancel('ses_123'); diff --git a/tests/Http/Requests/CreateSessionRequestTest.php b/tests/Http/Requests/CreateSessionRequestTest.php index 72ea6b7a..77cd7ee3 100644 --- a/tests/Http/Requests/CreateSessionRequestTest.php +++ b/tests/Http/Requests/CreateSessionRequestTest.php @@ -4,7 +4,8 @@ use Mollie\Api\Fake\MockMollieClient; use Mollie\Api\Fake\MockResponse; -use Mollie\Api\Http\Requests\DynamicPostRequest; +use Mollie\Api\Http\Data\Money; +use Mollie\Api\Http\Requests\CreateSessionRequest; use Mollie\Api\Resources\Session; use PHPUnit\Framework\TestCase; @@ -14,12 +15,16 @@ class CreateSessionRequestTest extends TestCase public function it_can_create_session() { $client = new MockMollieClient([ - DynamicPostRequest::class => MockResponse::created('session'), + CreateSessionRequest::class => MockResponse::created('session'), ]); - $request = new DynamicPostRequest('sessions'); - - $request->setHydratableResource(Session::class); + $request = new CreateSessionRequest( + 'https://example.com/redirect', + 'https://example.com/cancel', + new Money('EUR', '10.00'), + 'My product', + 'ideal', + ); /** @var Session */ $session = $client->send($request); @@ -31,8 +36,14 @@ public function it_can_create_session() /** @test */ public function it_resolves_correct_resource_path() { - $request = new DynamicPostRequest('sessions'); - + $request = new CreateSessionRequest( + 'https://example.com/redirect', + 'https://example.com/cancel', + new Money('EUR', '10.00'), + 'My product', + 'ideal', + 'embedded' + ); $this->assertEquals('sessions', $request->resolveResourcePath()); } } diff --git a/tests/Http/Requests/GetSessionRequestTest.php b/tests/Http/Requests/GetSessionRequestTest.php index ad8f9756..cee9edc4 100644 --- a/tests/Http/Requests/GetSessionRequestTest.php +++ b/tests/Http/Requests/GetSessionRequestTest.php @@ -4,7 +4,7 @@ use Mollie\Api\Fake\MockMollieClient; use Mollie\Api\Fake\MockResponse; -use Mollie\Api\Http\Requests\DynamicGetRequest; +use Mollie\Api\Http\Requests\GetSessionRequest; use Mollie\Api\Resources\Session; use PHPUnit\Framework\TestCase; @@ -14,12 +14,10 @@ class GetSessionRequestTest extends TestCase public function it_can_get_session() { $client = new MockMollieClient([ - DynamicGetRequest::class => MockResponse::ok('session'), + GetSessionRequest::class => MockResponse::ok('session'), ]); - $request = new DynamicGetRequest('sessions/ses_LQNz4v4Qvk'); - - $request->setHydratableResource(Session::class); + $request = new GetSessionRequest('ses_LQNz4v4Qvk'); /** @var Session */ $session = $client->send($request); @@ -31,7 +29,7 @@ public function it_can_get_session() /** @test */ public function it_resolves_correct_resource_path() { - $request = new DynamicGetRequest('sessions/ses_LQNz4v4Qvk'); + $request = new GetSessionRequest('ses_LQNz4v4Qvk'); $this->assertEquals( 'sessions/ses_LQNz4v4Qvk',