Skip to content

Commit b9152ed

Browse files
committed
Move responses to own namespace
1 parent c0d9c89 commit b9152ed

File tree

18 files changed

+176
-99
lines changed

18 files changed

+176
-99
lines changed

src/Contracts/Http/Server.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use LaravelJsonApi\Contracts\Resources\Container as ResourceContainer;
2222
use LaravelJsonApi\Contracts\Schema\Container as SchemaContainer;
2323
use LaravelJsonApi\Contracts\Store\Store;
24+
use LaravelJsonApi\Core\Document\JsonApi;
2425

2526
interface Server
2627
{
@@ -38,6 +39,13 @@ public function serving(): void;
3839
*/
3940
public function name(): string;
4041

42+
/**
43+
* Get the server's JSON API object.
44+
*
45+
* @return JsonApi
46+
*/
47+
public function jsonApi(): JsonApi;
48+
4149
/**
4250
* Get the server's schemas.
4351
*

src/Core/Document/ErrorList.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
use Illuminate\Http\Response;
2525
use IteratorAggregate;
2626
use LaravelJsonApi\Contracts\Serializable;
27+
use LaravelJsonApi\Core\Responses\ErrorResponse;
2728
use LogicException;
2829
use function array_merge;
2930
use function collect;

src/Core/Pagination/Page.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
use LaravelJsonApi\Contracts\Pagination\Page as PageContract;
2727
use LaravelJsonApi\Core\Document\Link;
2828
use LaravelJsonApi\Core\Document\Links;
29-
use LaravelJsonApi\Core\Resources\PaginatedResourceResponse;
29+
use LaravelJsonApi\Core\Responses\PaginatedResourceResponse;
3030
use function array_filter;
3131
use function collect;
3232
use function count;
@@ -258,12 +258,21 @@ public function count()
258258
return count($this->paginator);
259259
}
260260

261+
/**
262+
* @param $request
263+
* @return PaginatedResourceResponse
264+
*/
265+
public function prepareResponse($request): PaginatedResourceResponse
266+
{
267+
return new PaginatedResourceResponse($this);
268+
}
269+
261270
/**
262271
* @inheritDoc
263272
*/
264273
public function toResponse($request)
265274
{
266-
return (new PaginatedResourceResponse($this))->toResponse($request);
275+
return $this->prepareResponse($request)->toResponse($request);
267276
}
268277

269278
/**

src/Core/Resources/JsonApiResource.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
use LaravelJsonApi\Core\Document\Links;
2828
use LaravelJsonApi\Core\Document\ResourceIdentifier;
2929
use LaravelJsonApi\Core\Resources\Concerns\ConditionallyLoadsAttributes;
30+
use LaravelJsonApi\Core\Responses\ResourceResponse;
3031
use LogicException;
3132
use function sprintf;
3233

src/Core/Resources/ResourceCollection.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@
2727
use LaravelJsonApi\Contracts\Pagination\Page as PageContract;
2828
use LaravelJsonApi\Core\Document\Links;
2929
use LaravelJsonApi\Core\Pagination\Page;
30+
use LaravelJsonApi\Core\Responses\PaginatedResourceResponse;
31+
use LaravelJsonApi\Core\Responses\ResourceCollectionResponse;
3032
use function count;
3133

3234
class ResourceCollection implements Responsable, IteratorAggregate, Countable
3335
{
3436

35-
use Concerns\CreatesResponse;
36-
3737
/**
3838
* @var iterable|PageContract
3939
*/

src/Core/Resources/Concerns/CreatesResponse.php renamed to src/Core/Responses/Concerns/IsResponsable.php

Lines changed: 61 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,25 @@
1717

1818
declare(strict_types=1);
1919

20-
namespace LaravelJsonApi\Core\Resources\Concerns;
20+
namespace LaravelJsonApi\Core\Responses\Concerns;
2121

2222
use Illuminate\Http\Request;
23+
use LaravelJsonApi\Core\Document\JsonApi;
24+
use LaravelJsonApi\Core\Document\Link;
2325
use LaravelJsonApi\Core\Document\Links;
26+
use LaravelJsonApi\Core\Facades\JsonApi as JsonApiFacade;
2427
use LaravelJsonApi\Core\Json\Hash;
2528
use LaravelJsonApi\Core\Query\FieldSets;
2629
use LaravelJsonApi\Core\Query\IncludePaths;
2730

28-
trait CreatesResponse
31+
trait IsResponsable
2932
{
3033

34+
/**
35+
* @var JsonApi|null
36+
*/
37+
private ?JsonApi $jsonApi = null;
38+
3139
/**
3240
* @var Hash|null
3341
*/
@@ -44,9 +52,34 @@ trait CreatesResponse
4452
private int $encodeOptions = 0;
4553

4654
/**
47-
* @var array|null
55+
* @var array
4856
*/
49-
private ?array $headers = null;
57+
private array $headers = [];
58+
59+
/**
60+
* Add the top-level JSON API member to the response.
61+
*
62+
* @param $jsonApi
63+
* @return $this
64+
*/
65+
public function withJsonApi($jsonApi): self
66+
{
67+
$this->jsonApi = JsonApi::cast($jsonApi);
68+
69+
return $this;
70+
}
71+
72+
/**
73+
* @return JsonApi
74+
*/
75+
public function jsonApi(): JsonApi
76+
{
77+
if ($this->jsonApi) {
78+
return $this->jsonApi;
79+
}
80+
81+
return $this->jsonApi = JsonApiFacade::server()->jsonApi();
82+
}
5083

5184
/**
5285
* Add top-level meta to the response.
@@ -61,6 +94,18 @@ public function withMeta($meta): self
6194
return $this;
6295
}
6396

97+
/**
98+
* @return Hash
99+
*/
100+
public function meta(): Hash
101+
{
102+
if ($this->meta) {
103+
return $this->meta;
104+
}
105+
106+
return $this->meta = new Hash();
107+
}
108+
64109
/**
65110
* Add top-level links to the response.
66111
*
@@ -74,6 +119,18 @@ public function withLinks($links): self
74119
return $this;
75120
}
76121

122+
/**
123+
* @return Links
124+
*/
125+
public function links(): Links
126+
{
127+
if ($this->links) {
128+
return $this->links;
129+
}
130+
131+
return $this->links = new Links();
132+
}
133+
77134
/**
78135
* Set JSON encode options.
79136
*

src/Core/Resources/DataResponse.php renamed to src/Core/Responses/DataResponse.php

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,21 @@
1717

1818
declare(strict_types=1);
1919

20-
namespace LaravelJsonApi\Core\Resources;
20+
namespace LaravelJsonApi\Core\Responses;
2121

2222
use Illuminate\Contracts\Support\Responsable;
2323
use Illuminate\Database\Eloquent\Model;
2424
use Illuminate\Http\Request;
2525
use LaravelJsonApi\Contracts\Pagination\Page;
2626
use LaravelJsonApi\Core\Facades\JsonApi;
27+
use LaravelJsonApi\Core\Resources\JsonApiResource;
28+
use LaravelJsonApi\Core\Resources\ResourceCollection;
2729
use function is_null;
2830

2931
class DataResponse implements Responsable
3032
{
3133

32-
use Concerns\CreatesResponse;
34+
use Concerns\IsResponsable;
3335

3436
/**
3537
* @var Page|Model|iterable|null
@@ -50,7 +52,34 @@ public function __construct($value)
5052
* @param Request $request
5153
* @return ResourceCollectionResponse|ResourceResponse
5254
*/
53-
public function prepareResponse($request)
55+
public function prepareResponse($request): Responsable
56+
{
57+
return $this
58+
->prepareDataResponse($request)
59+
->withJsonApi($this->jsonApi())
60+
->withMeta($this->meta)
61+
->withLinks($this->links)
62+
->withEncodeOptions($this->encodeOptions)
63+
->withHeaders($this->headers);
64+
}
65+
66+
/**
67+
* @inheritDoc
68+
*/
69+
public function toResponse($request)
70+
{
71+
return $this
72+
->prepareResponse($request)
73+
->toResponse($request);
74+
}
75+
76+
/**
77+
* Convert the data member to a response class.
78+
*
79+
* @param $request
80+
* @return PaginatedResourceResponse|ResourceCollectionResponse|ResourceResponse
81+
*/
82+
private function prepareDataResponse($request)
5483
{
5584
if ($this->value instanceof Page) {
5685
return new PaginatedResourceResponse($this->value);
@@ -71,18 +100,4 @@ public function prepareResponse($request)
71100
return (new ResourceCollection($parsed))->prepareResponse($request);
72101
}
73102

74-
/**
75-
* @inheritDoc
76-
*/
77-
public function toResponse($request)
78-
{
79-
return $this
80-
->prepareResponse($request)
81-
->withMeta($this->meta)
82-
->withLinks($this->links)
83-
->withEncodeOptions($this->encodeOptions)
84-
->withHeaders((array) $this->headers)
85-
->toResponse($request);
86-
}
87-
88103
}

src/Core/Document/ErrorResponse.php renamed to src/Core/Responses/ErrorResponse.php

Lines changed: 20 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,20 @@
1717

1818
declare(strict_types=1);
1919

20-
namespace LaravelJsonApi\Core\Document;
20+
namespace LaravelJsonApi\Core\Responses;
2121

2222
use Illuminate\Contracts\Support\Responsable;
23-
use LaravelJsonApi\Contracts\Serializable;
23+
use LaravelJsonApi\Contracts\Serializable as SerializableContract;
24+
use LaravelJsonApi\Core\Document\Concerns\Serializable;
25+
use LaravelJsonApi\Core\Document\Error;
26+
use LaravelJsonApi\Core\Document\ErrorList;
27+
use LaravelJsonApi\Core\Responses\Concerns\IsResponsable;
2428

25-
class ErrorResponse implements Serializable, Responsable
29+
class ErrorResponse implements SerializableContract, Responsable
2630
{
2731

28-
use Concerns\Serializable;
32+
use IsResponsable;
33+
use Serializable;
2934

3035
/**
3136
* @var ErrorList
@@ -37,16 +42,6 @@ class ErrorResponse implements Serializable, Responsable
3742
*/
3843
private ?int $status = null;
3944

40-
/**
41-
* @var array
42-
*/
43-
private array $headers = [];
44-
45-
/**
46-
* @var int
47-
*/
48-
private int $encodeOptions = 0;
49-
5045
/**
5146
* ErrorResponse constructor.
5247
*
@@ -57,32 +52,6 @@ public function __construct($errors)
5752
$this->errors = ErrorList::cast($errors);
5853
}
5954

60-
/**
61-
* Set JSON encode options.
62-
*
63-
* @param int $options
64-
* @return $this
65-
*/
66-
public function withEncodeOptions(int $options): self
67-
{
68-
$this->encodeOptions = $options;
69-
70-
return $this;
71-
}
72-
73-
/**
74-
* Set response headers.
75-
*
76-
* @param array $headers
77-
* @return $this
78-
*/
79-
public function withHeaders(array $headers): self
80-
{
81-
$this->headers = $headers;
82-
83-
return $this;
84-
}
85-
8655
/**
8756
* Set the response status.
8857
*
@@ -116,19 +85,25 @@ public function toResponse($request)
11685
*/
11786
public function toArray()
11887
{
119-
return [
120-
'errors' => $this->errors->toArray(),
121-
];
88+
return array_filter([
89+
'jsonapi' => $this->jsonApi()->toArray() ?: null,
90+
'meta' => $this->meta()->toArray() ?: null,
91+
'links' => $this->links->toArray() ?: null,
92+
'errors' => $this->errors,
93+
]);
12294
}
12395

12496
/**
12597
* @inheritDoc
12698
*/
12799
public function jsonSerialize()
128100
{
129-
return [
101+
return array_filter([
102+
'jsonapi' => $this->jsonApi()->jsonSerialize(),
103+
'meta' => $this->meta()->jsonSerialize(),
104+
'links' => $this->links()->jsonSerialize(),
130105
'errors' => $this->errors,
131-
];
106+
]);
132107
}
133108

134109
}

src/Core/Resources/PaginatedResourceResponse.php renamed to src/Core/Responses/PaginatedResourceResponse.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@
1717

1818
declare(strict_types=1);
1919

20-
namespace LaravelJsonApi\Core\Resources;
20+
namespace LaravelJsonApi\Core\Responses;
2121

2222
use Illuminate\Contracts\Pagination\Paginator;
2323
use InvalidArgumentException;
2424
use LaravelJsonApi\Contracts\Pagination\Page as PageContract;
2525
use LaravelJsonApi\Core\Document\Links;
2626
use LaravelJsonApi\Core\Json\Hash;
2727
use LaravelJsonApi\Core\Pagination\Page;
28+
use LaravelJsonApi\Core\Resources\ResourceCollection;
29+
use LaravelJsonApi\Core\Responses\ResourceCollectionResponse;
2830

2931
class PaginatedResourceResponse extends ResourceCollectionResponse
3032
{

0 commit comments

Comments
 (0)