Skip to content

Commit

Permalink
refactor: add dedicated create, get and delete requests for sessions
Browse files Browse the repository at this point in the history
  • Loading branch information
Naoray committed Feb 10, 2025
1 parent da2606e commit 3368c28
Show file tree
Hide file tree
Showing 10 changed files with 185 additions and 31 deletions.
2 changes: 1 addition & 1 deletion UPGRADING.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Upgrading
****# Upgrading

## From v2 to v3

Expand Down
21 changes: 10 additions & 11 deletions src/EndpointCollection/SessionEndpointCollection.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -20,26 +23,22 @@ 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));
}

/**
* Creates a session in Mollie.
*
* @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);
Expand Down Expand Up @@ -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));
}

/**
Expand Down
20 changes: 20 additions & 0 deletions src/Factories/CreateSessionRequestFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace Mollie\Api\Factories;

use Mollie\Api\Http\Requests\CreateSessionRequest;

class CreateSessionRequestFactory extends RequestFactory
{
public function create(): CreateSessionRequest
{
return new CreateSessionRequest(
$this->payload('redirectUrl'),
$this->payload('cancelUrl'),
MoneyFactory::new($this->payload('amount'))->create(),
$this->payload('description'),
$this->payload('method'),
$this->payload('checkoutFlow')
);
}
}
25 changes: 25 additions & 0 deletions src/Http/Requests/CancelSessionRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace Mollie\Api\Http\Requests;

use Mollie\Api\Types\Method;
use Mollie\Api\Resources\Session;

class CancelSessionRequest extends ResourceHydratableRequest
{
protected static string $method = Method::DELETE;

protected $hydratableResource = Session::class;

private string $sessionId;

public function __construct(string $sessionId)
{
$this->sessionId = $sessionId;
}

public function resolveResourcePath(): string
{
return "sessions/{$this->sessionId}";
}
}
64 changes: 64 additions & 0 deletions src/Http/Requests/CreateSessionRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

namespace Mollie\Api\Http\Requests;

use Mollie\Api\Contracts\HasPayload;
use Mollie\Api\Http\Data\Money;
use Mollie\Api\Traits\HasJsonPayload;
use Mollie\Api\Types\Method;
use Mollie\Api\Resources\Session;
use Mollie\Api\Types\CheckoutFlow;

class CreateSessionRequest extends ResourceHydratableRequest implements HasPayload
{
use HasJsonPayload;

protected static string $method = Method::POST;

protected $hydratableResource = Session::class;

private string $redirectUrl;

private string $cancelUrl;

private Money $amount;

private string $description;

private string $paymentMethod;

private string $checkoutFlow;

public function __construct(
string $redirectUrl,
string $cancelUrl,
Money $amount,
string $description,
string $method,
?string $checkoutFlow = null
) {
$this->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';
}
}
25 changes: 25 additions & 0 deletions src/Http/Requests/GetSessionRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace Mollie\Api\Http\Requests;

use Mollie\Api\Resources\Session;
use Mollie\Api\Types\Method;

class GetSessionRequest extends ResourceHydratableRequest
{
protected static string $method = Method::GET;

protected $hydratableResource = Session::class;

private string $id;

public function __construct(string $id)
{
$this->id = $id;
}

public function resolveResourcePath(): string
{
return 'sessions/' . $this->id;
}
}
8 changes: 8 additions & 0 deletions src/Types/CheckoutFlow.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace Mollie\Api\Types;

class CheckoutFlow
{
public const EXPRESS = 'express';
}
16 changes: 10 additions & 6 deletions tests/EndpointCollection/SessionEndpointCollectionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
use Mollie\Api\Fake\MockMollieClient;
use Mollie\Api\Fake\MockResponse;
use Mollie\Api\Http\Data\Money;
use Mollie\Api\Http\Requests\DynamicDeleteRequest;
use Mollie\Api\Http\Requests\CancelSessionRequest;
use Mollie\Api\Http\Requests\GetSessionRequest;
use Mollie\Api\Http\Requests\CreateSessionRequest;
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\Resources\Session;
use Mollie\Api\Resources\SessionCollection;
Expand All @@ -20,11 +21,11 @@ class SessionEndpointCollectionTest extends TestCase
public function get()
{
$client = new MockMollieClient([
DynamicGetRequest::class => 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);
}
Expand All @@ -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);
Expand All @@ -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');
Expand Down
25 changes: 18 additions & 7 deletions tests/Http/Requests/CreateSessionRequestTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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);
Expand All @@ -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());
}
}
10 changes: 4 additions & 6 deletions tests/Http/Requests/GetSessionRequestTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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);
Expand All @@ -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',
Expand Down

0 comments on commit 3368c28

Please sign in to comment.