Skip to content

Commit 82d3a3d

Browse files
authored
Merge pull request #16 from Lomkit/feature/directives
Feature/instructions
2 parents 1307cfe + f758d35 commit 82d3a3d

24 files changed

+1144
-116
lines changed

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,9 @@ TODO
8888

8989
## Roadmap for the end of bêta (Estimated delivery October 2023)
9090

91-
- Custom directives (Filters / sorting)
9291
- Automatic documentation with extension possible
92+
- Refactor actions listing to --> Get resource informations (fields exposed / actions / etc ? regroupe all those possibilities)
9393
- Alias for includes / aggregates
94-
-
9594

9695
## Roadmap
9796

src/Actions/Action.php

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,17 @@
1010
use Illuminate\Queue\SerializesModels;
1111
use Illuminate\Support\Collection;
1212
use Illuminate\Support\Str;
13+
use Lomkit\Rest\Concerns\Fieldable;
1314
use Lomkit\Rest\Concerns\Makeable;
1415
use Lomkit\Rest\Concerns\Metable;
16+
use Lomkit\Rest\Concerns\Resourcable;
1517
use Lomkit\Rest\Http\Requests\OperateRequest;
1618
use Lomkit\Rest\Http\Requests\RestRequest;
19+
use Lomkit\Rest\Http\Resource;
1720

1821
class Action implements \JsonSerializable
1922
{
20-
use Makeable, Metable, Batchable, Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
23+
use Makeable, Metable, Batchable, Dispatchable, InteractsWithQueue, Queueable, SerializesModels, Fieldable, Resourcable;
2124

2225
/**
2326
* The name of the connection the job should be sent to.
@@ -96,17 +99,6 @@ public function handle(array $fields, \Illuminate\Support\Collection $models)
9699
//
97100
}
98101

99-
/**
100-
* Called in an action failed.
101-
*
102-
* @param \Lomkit\Rest\Http\Requests\RestRequest $request
103-
* @return array
104-
*/
105-
public function fields(\Lomkit\Rest\Http\Requests\RestRequest $request)
106-
{
107-
return [];
108-
}
109-
110102
/**
111103
* Register callbacks on the pending batch.
112104
*

src/Actions/Actionable.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public function action(RestRequest $request, string $actionKey): Action {
2626
return collect($this->actions($request))
2727
->sole(function (Action $action) use ($actionKey) {
2828
return $action->uriKey() === $actionKey;
29-
});
29+
})
30+
->resource($this);
3031
}
3132
}

src/Actions/DispatchAction.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,10 @@ public function forModels(Collection $models)
152152
protected function dispatchSynchronouslyForCollection(Collection $models)
153153
{
154154
return DB::transaction(function () use ($models) {
155-
return $this->action->handle($this->fields, $models);
155+
return $this->action->handle(
156+
collect($this->fields)->mapWithKeys(function ($field) {return [ $field['name'] => $field['value']]; })->toArray(),
157+
$models
158+
);
156159
});
157160
}
158161

src/Concerns/Fieldable.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace Lomkit\Rest\Concerns;
4+
5+
trait Fieldable
6+
{
7+
/**
8+
* The fields.
9+
*
10+
* @param \Lomkit\Rest\Http\Requests\RestRequest $request
11+
* @return array
12+
*/
13+
public function fields(\Lomkit\Rest\Http\Requests\RestRequest $request): array
14+
{
15+
return [];
16+
}
17+
18+
/**
19+
* The fields.
20+
*
21+
* @param \Lomkit\Rest\Http\Requests\RestRequest $request
22+
* @param string $name
23+
* @return array
24+
*/
25+
public function field(\Lomkit\Rest\Http\Requests\RestRequest $request, string $name)
26+
{
27+
return collect($this->fields($request))
28+
->first(function ($value, $fieldName) use ($name) { return $fieldName === $name; });
29+
}
30+
}

src/Concerns/Resourcable.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace Lomkit\Rest\Concerns;
4+
5+
use Lomkit\Rest\Http\Resource;
6+
7+
trait Resourcable
8+
{
9+
/**
10+
* The resource.
11+
*
12+
* @var Resource
13+
*/
14+
public Resource $resource;
15+
16+
/**
17+
* Set the resource.
18+
*
19+
* @param Resource $resource
20+
* @return array
21+
*/
22+
public function resource(Resource $resource) {
23+
return tap($this, function() use ($resource) {
24+
$this->resource = $resource;
25+
});
26+
}
27+
}

src/Http/Requests/OperateRequest.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Lomkit\Rest\Relations\MorphedByMany;
2020
use Lomkit\Rest\Relations\MorphMany;
2121
use Lomkit\Rest\Relations\MorphToMany;
22+
use Lomkit\Rest\Rules\ActionField;
2223
use Lomkit\Rest\Rules\CustomRulable;
2324
use Lomkit\Rest\Rules\Includable;
2425
use Lomkit\Rest\Rules\RequiredRelation;
@@ -42,8 +43,16 @@ public function operateRules(Resource $resource)
4243
return array_merge(
4344
app(SearchRequest::class)->searchRules($resource, 'search'),
4445
[
46+
'fields.*.name' => [
47+
Rule::in(array_keys($operatedAction->fields($this)))
48+
],
4549
'fields' => [
46-
'array:'.implode(',', array_keys($operatedAction->fields($this)))
50+
'sometimes',
51+
'array'
52+
],
53+
'fields.*' => [
54+
ActionField::make()
55+
->action($operatedAction)
4756
]
4857
]
4958
);

src/Http/Requests/RestRequest.php

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,11 @@
33
namespace Lomkit\Rest\Http\Requests;
44

55
use Illuminate\Foundation\Http\FormRequest;
6+
use Lomkit\Rest\Concerns\Resourcable;
67
use Lomkit\Rest\Http\Requests\Traits\InteractsWithRules;
78
use Lomkit\Rest\Http\Resource;
89

910
class RestRequest extends FormRequest
1011
{
11-
use InteractsWithRules;
12-
13-
/**
14-
* The resource the request is linked to.
15-
*
16-
* @var Resource
17-
*/
18-
public Resource $resource;
19-
20-
public function resource(Resource $resource) {
21-
return tap($this, function() use ($resource) {
22-
$this->resource = $resource;
23-
});
24-
}
12+
use InteractsWithRules, Resourcable;
2513
}

src/Http/Requests/SearchRequest.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Lomkit\Rest\Rules\AggregateField;
1111
use Lomkit\Rest\Rules\AggregateFilterable;
1212
use Lomkit\Rest\Rules\Includable;
13+
use Lomkit\Rest\Rules\Instruction;
1314

1415
class SearchRequest extends RestRequest
1516
{
@@ -36,6 +37,8 @@ public function searchRules(Resource $resource, $prefix = '', $isRootSearchRules
3637
$this->selectsRules($resource, $prefix.'selects'),
3738
[$prefix.'aggregates' => ['sometimes', 'array']],
3839
$this->aggregatesRules($resource, $prefix.'aggregates'),
40+
[$prefix.'instructions' => ['sometimes', 'array']],
41+
$this->instructionsRules($resource, $prefix.'instructions'),
3942
[
4043
'limit' => ['sometimes', 'integer', Rule::in($resource->exposedLimits($this))],
4144
'page' => ['sometimes', 'integer']
@@ -96,6 +99,30 @@ protected function scopesRules(Resource $resource, string $prefix) {
9699
return $rules;
97100
}
98101

102+
protected function instructionsRules(Resource $resource, string $prefix) {
103+
$rules = [
104+
$prefix.'.*.name' => [
105+
Rule::in(
106+
collect($resource->instructions($this))
107+
->map(function ($instruction) { return $instruction->uriKey(); })
108+
->toArray()
109+
),
110+
'required',
111+
'string'
112+
],
113+
$prefix.'.*.fields' => [
114+
'sometimes',
115+
'array'
116+
],
117+
$prefix.'.*' => [
118+
Instruction::make()
119+
->resource($resource)
120+
]
121+
];
122+
123+
return $rules;
124+
}
125+
99126
protected function sortsRules(Resource $resource, string $prefix) {
100127
$rules = [
101128
$prefix.'.*.field' => [

src/Http/Resource.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Lomkit\Rest\Concerns\Resource\Relationable;
1313
use Lomkit\Rest\Concerns\Resource\Rulable;
1414
use Lomkit\Rest\Http\Requests\RestRequest;
15+
use Lomkit\Rest\Instructions\Instructionable;
1516

1617
class Resource
1718
{
@@ -22,7 +23,8 @@ class Resource
2223
Rulable,
2324
ConfiguresRestParameters,
2425
Authorizable,
25-
Actionable;
26+
Actionable,
27+
Instructionable;
2628

2729
/**
2830
* The model the entry corresponds to.

0 commit comments

Comments
 (0)