8000 Allow controller hooks to return async processes · CodingSeo/laravel-json-api@96938f3 · GitHub
[go: up one dir, main page]

Skip to content

Commit 96938f3

Browse files
committed
Allow controller hooks to return async processes
1 parent 2d250a8 commit 96938f3

File tree

4 files changed

+248
-32
lines changed

4 files changed

+248
-32
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ update request.
1717
`type` or `id` fields.
1818
- JSON API specification validation will now fail if the `attributes` and `relationships` members have
1919
common field names, as field names share a common namespace.
20+
- Can now return `Responsable` instances from controller hooks.
2021

2122
### Changed
2223
- [#248](https://github.com/cloudcreativity/laravel-json-api/pull/248)

src/Http/Controllers/JsonApiController.php

Lines changed: 59 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
use Closure;
2222
use CloudCreativity\LaravelJsonApi\Auth\AuthorizesRequests;
23+
use CloudCreativity\LaravelJsonApi\Contracts\Queue\AsynchronousProcess;
2324
use CloudCreativity\LaravelJsonApi\Contracts\Store\StoreInterface;
2425
use CloudCreativity\LaravelJsonApi\Http\Requests\CreateResource;
2526
use CloudCreativity\LaravelJsonApi\Http\Requests\DeleteResource;
@@ -33,6 +34,7 @@
3334
use CloudCreativity\LaravelJsonApi\Http\Requests\UpdateResource;
3435
use CloudCreativity\LaravelJsonApi\Http\Requests\ValidatedRequest;
3536
use CloudCreativity\LaravelJsonApi\Utils\Str;
37+
use Illuminate\Contracts\Support\Responsable;
3638
use Illuminate\Http\Response;
3739
use Illuminate\Routing\Controller;
3840

@@ -71,7 +73,7 @@ public function index(StoreInterface $store, FetchResources $request)
7173
{
7274
$result = $this->doSearch($store, $request);
7375

74-
if ($result instanceof Response) {
76+
if ($this->isResponse($result)) {
7577
return $result;
7678
}
7779

@@ -93,7 +95,13 @@ public function read(StoreInterface $store, FetchResource $request)
9395
$request->getParameters()
9496
);
9597

96-
if ($record && $result = $this->invoke('reading', $record, $request)) {
98+
if (!$record) {
99+
return $this->reply()->content(null);
100+
}
101+
102+
$result = $this->invoke('reading', $record, $request);
103+
104+
if ($this->isResponse($result)) {
97105
return $result;
98106
}
99107

@@ -113,7 +121,7 @@ public function create(StoreInterface $store, CreateResource $request)
113121
return $this->doCreate($store, $request);
114122
});
115123

116-
if ($record instanceof Response) {
124+
if ($this->isResponse($record)) {
117125
return $record;
118126
}
119127

@@ -133,7 +141,7 @@ public function update(StoreInterface $store, UpdateResource $request)
133141
return $this->doUpdate($store, $request);
134142
});
135143

136-
if ($record instanceof Response) {
144+
if ($this->isResponse($record)) {
137145
return $record;
138146
}
139147

@@ -153,7 +161,7 @@ public function delete(StoreInterface $store, DeleteResource $request)
153161
return $this->doDelete($store, $request);
154162
});
155163

156-
if ($result instanceof Response) {
164+
if ($this->isResponse($result)) {
157165
return $result;
158166
}
159167

@@ -170,8 +178,9 @@ public function delete(StoreInterface $store, DeleteResource $request)
170178
public function readRelatedResource(StoreInterface $store, FetchRelated $request)
171179
{
172180
$record = $request->getRecord();
181+
$result = $this->beforeReadingRelationship($record, $request);
173182

174-
if ($result = $this->beforeReadingRelationship($record, $request)) {
183+
if ($this->isResponse($result)) {
175184
return $result;
176185
}
177186

@@ -194,8 +203,9 @@ public function readRelatedResource(StoreInterface $store, FetchRelated $request
194203
public function readRelationship(StoreInterface $store, FetchRelationship $request)
195204
{
196205
$record = $request->getRecord();
206+
$result = $this->beforeReadingRelationship($record, $request);
197207

198-
if ($result = $this->beforeReadingRelationship($record, $request)) {
208+
if ($this->isResponse($result)) {
199209
return $result;
200210
}
201211

@@ -221,7 +231,7 @@ public function replaceRelationship(StoreInterface $store, UpdateRelationship $r
221231
return $this->doReplaceRelationship($store, $request);
222232
});
223233

224-
if ($result instanceof Response) {
234+
if ($this->isResponse($result)) {
225235
return $result;
226236
}
227237

@@ -241,7 +251,7 @@ public function addToRelationship(StoreInterface $store, UpdateRelationship $req
241251
return $this->doAddToRelationship($store, $request);
242252
});
243253

244-
if ($result instanceof Response) {
254+
if ($this->isResponse($result)) {
245255
return $result;
246256
}
247257

@@ -261,7 +271,7 @@ public function removeFromRelationship(StoreInterface $store, UpdateRelationship
261271
return $this->doRemoveFromRelationship($store, $request);
262272
});
263273

264-
if ($result instanceof Response) {
274+
if ($this->isResponse($result)) {
265275
return $result;
266276
}
267277

@@ -324,8 +334,8 @@ protected function doSearch(StoreInterface $store, ValidatedRequest $request)
324334
*
325335
* @param StoreInterface $store
326336
* @param ValidatedRequest $request
327-
* @return object|Response
328-
* the created record or a HTTP response.
337+
* @return mixed
338+
* the created record, an asynchronous process, or a HTTP response.
329339
*/
330340
protected function doCreate(StoreInterface $store, ValidatedRequest $request)
331341
{
@@ -347,14 +357,12 @@ protected function doCreate(StoreInterface $store, ValidatedRequest $request)
347357
*
348358
* @param StoreInterface $store
349359
* @param ValidatedRequest $request
350-
* @return object|Response
351-
* the updated record or a HTTP response.
360+
* @return mixed
361+
* the updated record, an asynchronous process, or a HTTP response.
352362
*/
353363
protected function doUpdate(StoreInterface $store, ValidatedRequest $request)
354364
{
355-
$response = $this->beforeCommit($request);
356-
357-
if ($response instanceof Response) {
365+
if ($response = $this->beforeCommit($request)) {
358366
return $response;
359367
}
360368

@@ -372,15 +380,14 @@ protected function doUpdate(StoreInterface $store, ValidatedRequest $request)
372380
*
373381
* @param StoreInterface $store
374382
* @param ValidatedRequest $request
375-
* @return Response|mixed|null
376-
* an HTTP response, content to return or null.
383+
* @return mixed|null
384+
* an HTTP response, an asynchronous process, content to return, or null.
377385
*/
378386
protected function doDelete(StoreInterface $store, ValidatedRequest $request)
379387
{
380388
$record = $request->getRecord();
381-
$response = $this->invoke('deleting', $record, $request);
382389

383-
if ($response instanceof Response) {
390+
if ($response = $this->invoke('deleting', $record, $request)) {
384391
return $response;
385392
}
386393

@@ -394,7 +401,7 @@ protected function doDelete(StoreInterface $store, ValidatedRequest $request)
394401
*
395402
* @param StoreInterface $store
396403
* @param ValidatedRequest $request
397-
* @return Response|object
404+
* @return mixed
398405
*/
399406
protected function doReplaceRelationship(StoreInterface $store, ValidatedRequest $request)
400407
{
@@ -420,7 +427,7 @@ protected function doReplaceRelationship(StoreInterface $store, ValidatedRequest
420427
*
421428
* @param StoreInterface $store
422429
* @param ValidatedRequest $request
423-
* @return Response|object
430+
* @return mixed
424431
*/
425432
protected function doAddToRelationship(StoreInterface $store, ValidatedRequest $request)
426433
{
@@ -446,7 +453,7 @@ protected function doAddToRelationship(StoreInterface $store, ValidatedRequest $
446453
*
447454
* @param StoreInterface $store
448455
* @param ValidatedRequest $request
449-
* @return Response|object
456+
* @return mixed
450457
*/
451458
protected function doRemoveFromRelationship(StoreInterface $store, ValidatedRequest $request)
452459
{
@@ -482,9 +489,20 @@ protected function transaction(Closure $closure)
482489
return app('db')->connection($this->connection)->transaction($closure);
483490
}
484491

492+
/**
493+
* Can the controller return the provided value?
494+
*
495+
* @param $value
496+
* @return bool
497+
*/
498+
protected function isResponse($value)
499+
{
500+
return $value instanceof Response || $value instanceof Responsable;
501+
}
502+
485503
/**
486504
* @param ValidatedRequest $request
487-
* @return Response|null
505+
* @return mixed|null
488506
*/
489507
private function beforeCommit(ValidatedRequest $request)
490508
{
@@ -503,7 +521,7 @@ private function beforeCommit(ValidatedRequest $request)
503521
* @param ValidatedRequest $request
504522
* @param $record
505523
* @param $updating
506-
* @return Response|null
524+
* @return mixed|null
507525
*/
508526
private function afterCommit(ValidatedRequest $request, $record, $updating)
509527
{
@@ -519,7 +537,7 @@ private function afterCommit(ValidatedRequest $request, $record, $updating)
519537
/**
520538
* @param $record
521539
* @param ValidatedRequest $request
522-
* @return Response|null
540+
* @return mixed|null
523541
*/
524542
private function beforeReadingRelationship($record, ValidatedRequest $request)
525543
{
@@ -534,33 +552,42 @@ private function beforeReadingRelationship($record, ValidatedRequest $request)
534552
*
535553
* @param $method
536554
* @param mixed ...$arguments
537-
* @return Response|null
555+
* @return mixed|null
538556
*/
539557
private function invoke($method, ...$arguments)
540558
{
541-
$response = method_exists($this, $method) ? $this->{$method}(...$arguments) : null;
559+
$result = method_exists($this, $method) ? $this->{$method}(...$arguments) : null;
542560

543-
return ($response instanceof Response) ? $response : null;
561+
return $this->isInvokedResult($result) ? $result : null;
544562
}
545563

546564
/**
547565
* Invoke multiple hooks.
548566
*
549567
* @param array $method
550568
* @param mixed ...$arguments
551-
* @return Response|null
569+
* @return mixed|null
552570
*/
553571
private function invokeMany(array $method, ...$arguments)
554572
{
555573
foreach ($method as $hook) {
556574
$result = $this->invoke($hook, ...$arguments);
557575

558-
if ($result instanceof Response) {
576+
if ($this->isInvokedResult($result)) {
559577
return $result;
560578
}
561579
}
562580

563581
return null;
564582
}
565583

584+
/**
585+
* @param $value
586+
* @return bool
587+
*/
588+
private function isInvokedResult($value)
589+
{
590+
return $value instanceof AsynchronousProcess || $this->isResponse($value);
591+
}
592+
566593
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
namespace CloudCreativity\LaravelJsonApi\Tests\Integration\Queue;
4+
5+
use CloudCreativity\LaravelJsonApi\Contracts\Queue\AsynchronousProcess;
6+
use CloudCreativity\LaravelJsonApi\Http\Controllers\JsonApiController;
7+
use DummyApp\Download;
8+
use DummyApp\Jobs\CreateDownload;
9+
use DummyApp\Jobs\DeleteDownload;
10+
use DummyApp\Jobs\ReplaceDownload;
11+
12+
class Controller extends JsonApiController
13+
{
14+
15+
/**
16+
* @return AsynchronousProcess
17+
*/
18+
protected function creating(): AsynchronousProcess
19+
{
20+
return CreateDownload::client('create')->dispatch();
21+
}
22+
23+
/**
24+
* @param Download $download
25+
* @return AsynchronousProcess
26+
*/
27+
protected function updating(Download $download): AsynchronousProcess
28+
{
29+
return ReplaceDownload::client($download)->dispatch();
30+
}
31+
32+
/**
33+
* @param Download $download
34+
* @return AsynchronousProcess
35+
*/
36+
protected function deleting(Download $download): AsynchronousProcess
37+
{
38+
return DeleteDownload::client($download)->dispatch();
39+
}
40+
}

0 commit comments

Comments
 (0)
0