Skip to content

Commit f2927aa

Browse files
authored
Merge pull request #40 from Sammyjo20/feature/dto-casting
Added new 'CastsToDto' plugin
2 parents bcdaa14 + 6aac494 commit f2927aa

File tree

95 files changed

+511
-207
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+511
-207
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Sammyjo20\Saloon\Exceptions;
4+
5+
class MissingDtoCastException extends SaloonException
6+
{
7+
/**
8+
*
9+
*/
10+
public function __construct()
11+
{
12+
parent::__construct('Saloon was unable to cast to a DTO because a cast was not defined on your request. Add the "CastsToDto" plugin to your request to define a DTO to cast to.');
13+
}
14+
}

src/Http/SaloonResponse.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Illuminate\Support\Traits\Macroable;
1111
use GuzzleHttp\Exception\RequestException;
1212
use Sammyjo20\Saloon\Exceptions\SaloonRequestException;
13+
use Sammyjo20\Saloon\Exceptions\MissingDtoCastException;
1314

1415
class SaloonResponse
1516
{
@@ -64,6 +65,13 @@ class SaloonResponse
6465
*/
6566
protected ?RequestException $guzzleRequestException = null;
6667

68+
/**
69+
* The data transfer object specified on the request if the CastsToDto plugin was added.
70+
*
71+
* @var object|null
72+
*/
73+
protected ?object $dto = null;
74+
6775
/**
6876
* Determines if the response has been cached
6977
*
@@ -467,4 +475,32 @@ public function guessesStatusFromBody(): self
467475

468476
return $this;
469477
}
478+
479+
/**
480+
* Set the DTO on the response.
481+
*
482+
* @param object $dto
483+
* @return $this
484+
*/
485+
public function setDto(object $dto): self
486+
{
487+
$this->dto = $dto;
488+
489+
return $this;
490+
}
491+
492+
/**
493+
* Cast the response to a DTO.
494+
*
495+
* @return object
496+
* @throws MissingDtoCastException
497+
*/
498+
public function dto(): object
499+
{
500+
if (is_null($this->dto)) {
501+
throw new MissingDtoCastException;
502+
}
503+
504+
return $this->dto;
505+
}
470506
}

src/Traits/Plugins/CastsToDto.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace Sammyjo20\Saloon\Traits\Plugins;
4+
5+
use Sammyjo20\Saloon\Http\SaloonRequest;
6+
use Sammyjo20\Saloon\Http\SaloonResponse;
7+
8+
trait CastsToDto
9+
{
10+
/**
11+
* Boot the castsToDto plugin. This will create a response interceptor that will populate the DTO
12+
* property on the response.
13+
*
14+
* @param SaloonRequest $request
15+
* @return void
16+
*/
17+
public function bootCastsToDto(SaloonRequest $request): void
18+
{
19+
$this->addResponseInterceptor(function (SaloonRequest $request, SaloonResponse $response) {
20+
$response->setDto($this->castToDto($response));
21+
22+
return $response;
23+
});
24+
}
25+
26+
/**
27+
* Define how Saloon should cast to your DTO.
28+
*
29+
* @param SaloonResponse $response
30+
* @return object
31+
*/
32+
abstract public function castToDto(SaloonResponse $response): object;
33+
}

tests/Feature/ConnectorRequestTest.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
<?php
22

33
use Sammyjo20\Saloon\Exceptions\ClassNotFoundException;
4-
use Sammyjo20\Saloon\Tests\Resources\Requests\UserRequest;
5-
use Sammyjo20\Saloon\Tests\Resources\Requests\ErrorRequest;
4+
use Sammyjo20\Saloon\Tests\Fixtures\Requests\UserRequest;
5+
use Sammyjo20\Saloon\Tests\Fixtures\Requests\ErrorRequest;
66
use Sammyjo20\Saloon\Exceptions\SaloonInvalidRequestException;
77
use Sammyjo20\Saloon\Exceptions\SaloonConnectorMethodNotFoundException;
8-
use Sammyjo20\Saloon\Tests\Resources\Connectors\RequestSelectionConnector;
9-
use Sammyjo20\Saloon\Tests\Resources\Connectors\InvalidRequestSelectionConnector;
10-
use Sammyjo20\Saloon\Tests\Resources\Connectors\InvalidDefinedRequestSelectionConnector;
8+
use Sammyjo20\Saloon\Tests\Fixtures\Connectors\RequestSelectionConnector;
9+
use Sammyjo20\Saloon\Tests\Fixtures\Connectors\InvalidRequestSelectionConnector;
10+
use Sammyjo20\Saloon\Tests\Fixtures\Connectors\InvalidDefinedRequestSelectionConnector;
1111

1212
test('you can create a method that will be proxied to a request', function () {
1313
$connector = new RequestSelectionConnector;

tests/Feature/MockRequestTest.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
use Sammyjo20\Saloon\Http\MockResponse;
44
use Sammyjo20\Saloon\Clients\MockClient;
5-
use Sammyjo20\Saloon\Tests\Resources\Requests\UserRequest;
6-
use Sammyjo20\Saloon\Tests\Resources\Requests\ErrorRequest;
7-
use Sammyjo20\Saloon\Tests\Resources\Connectors\TestConnector;
5+
use Sammyjo20\Saloon\Tests\Fixtures\Requests\UserRequest;
6+
use Sammyjo20\Saloon\Tests\Fixtures\Requests\ErrorRequest;
7+
use Sammyjo20\Saloon\Tests\Fixtures\Connectors\TestConnector;
88
use Sammyjo20\Saloon\Exceptions\SaloonNoMockResponsesProvidedException;
9-
use Sammyjo20\Saloon\Tests\Resources\Connectors\QueryParameterConnector;
10-
use Sammyjo20\Saloon\Tests\Resources\Requests\DifferentServiceUserRequest;
11-
use Sammyjo20\Saloon\Tests\Resources\Requests\QueryParameterConnectorRequest;
9+
use Sammyjo20\Saloon\Tests\Fixtures\Connectors\QueryParameterConnector;
10+
use Sammyjo20\Saloon\Tests\Fixtures\Requests\DifferentServiceUserRequest;
11+
use Sammyjo20\Saloon\Tests\Fixtures\Requests\QueryParameterConnectorRequest;
1212

1313
test('a request can be mocked with a sequence', function () {
1414
$mockClient = new MockClient([

tests/Feature/RequestTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22

3-
use Sammyjo20\Saloon\Tests\Resources\Requests\UserRequest;
4-
use Sammyjo20\Saloon\Tests\Resources\Requests\ErrorRequest;
3+
use Sammyjo20\Saloon\Tests\Fixtures\Requests\UserRequest;
4+
use Sammyjo20\Saloon\Tests\Fixtures\Requests\ErrorRequest;
55

66
test('a request can be made successfully', function () {
77
$request = new UserRequest();

tests/Resources/Connectors/CustomResponseConnector.php renamed to tests/Fixtures/Connectors/CustomResponseConnector.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<?php
22

3-
namespace Sammyjo20\Saloon\Tests\Resources\Connectors;
3+
namespace Sammyjo20\Saloon\Tests\Fixtures\Connectors;
44

55
use Sammyjo20\Saloon\Http\SaloonConnector;
6-
use Sammyjo20\Saloon\Tests\Resources\Responses\CustomResponse;
6+
use Sammyjo20\Saloon\Tests\Fixtures\Responses\CustomResponse;
77

88
class CustomResponseConnector extends SaloonConnector
99
{

tests/Resources/Connectors/DifferentServiceConnector.php renamed to tests/Fixtures/Connectors/DifferentServiceConnector.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php
22

3-
namespace Sammyjo20\Saloon\Tests\Resources\Connectors;
3+
namespace Sammyjo20\Saloon\Tests\Fixtures\Connectors;
44

55
use Sammyjo20\Saloon\Http\SaloonConnector;
66
use Sammyjo20\Saloon\Traits\Plugins\AcceptsJson;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
namespace Sammyjo20\Saloon\Tests\Fixtures\Connectors;
4+
5+
use Sammyjo20\Saloon\Http\SaloonResponse;
6+
use Sammyjo20\Saloon\Http\SaloonConnector;
7+
use Sammyjo20\Saloon\Traits\Plugins\CastsToDto;
8+
use Sammyjo20\Saloon\Traits\Plugins\AcceptsJson;
9+
use Sammyjo20\Saloon\Tests\Fixtures\Data\ApiResponse;
10+
11+
class DtoConnector extends SaloonConnector
12+
{
13+
use AcceptsJson;
14+
use CastsToDto;
15+
16+
/**
17+
* Define the base url of the api.
18+
*
19+
* @return string
20+
*/
21+
public function defineBaseUrl(): string
22+
{
23+
return apiUrl();
24+
}
25+
26+
/**
27+
* Define the base headers that will be applied in every request.
28+
*
29+
* @return string[]
30+
*/
31+
public function defaultHeaders(): array
32+
{
33+
return [];
34+
}
35+
36+
/**
37+
* @param SaloonResponse $response
38+
* @return object
39+
*/
40+
public function castToDto(SaloonResponse $response): object
41+
{
42+
return ApiResponse::fromSaloon($response);
43+
}
44+
}

tests/Resources/Connectors/ExtendedConnector.php renamed to tests/Fixtures/Connectors/ExtendedConnector.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php
22

3-
namespace Sammyjo20\Saloon\Tests\Resources\Connectors;
3+
namespace Sammyjo20\Saloon\Tests\Fixtures\Connectors;
44

55
class ExtendedConnector extends TestConnector
66
{

0 commit comments

Comments
 (0)