Skip to content

Commit adc388e

Browse files
committed
wip
1 parent a9feac5 commit adc388e

File tree

5 files changed

+61
-14
lines changed

5 files changed

+61
-14
lines changed

src/Adapter/EloquentAdapter.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Illuminate\Database\Eloquent\Collection;
66
use Illuminate\Database\Eloquent\Model;
77
use Illuminate\Database\Eloquent\Relations\BelongsTo;
8+
use Illuminate\Database\Eloquent\SoftDeletes;
89
use Tobscure\JsonApiServer\Schema\Attribute;
910
use Tobscure\JsonApiServer\Schema\HasMany;
1011
use Tobscure\JsonApiServer\Schema\HasOne;
@@ -114,7 +115,11 @@ public function saveHasMany($model, HasMany $field, array $related)
114115

115116
public function delete($model)
116117
{
117-
$model->delete();
118+
if (method_exists($model, 'forceDelete')) {
119+
$model->forceDelete();
120+
} else {
121+
$model->delete();
122+
}
118123
}
119124

120125
public function filterByIds($query, array $ids)

src/Exception/UnprocessableEntityException.php

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,28 @@
77

88
class UnprocessableEntityException extends \DomainException implements ErrorProviderInterface
99
{
10+
private $failures;
11+
12+
public function __construct(array $failures)
13+
{
14+
parent::__construct();
15+
16+
$this->failures = $failures;
17+
}
18+
1019
public function getJsonApiErrors(): array
1120
{
12-
return [
13-
new Error(
14-
new Error\Title('Unprocessable Entity'),
15-
new Error\Status('422')
16-
)
17-
];
21+
return array_map(function ($failure) {
22+
return new Error(
23+
new Error\Status($this->getJsonApiStatus()),
24+
new Error\SourcePointer('/data/'.$failure['field']->location.'/'.$failure['field']->name),
25+
new Error\Detail($failure['message'])
26+
);
27+
}, $this->failures);
28+
}
29+
30+
public function getJsonApiStatus(): string
31+
{
32+
return '422';
1833
}
1934
}

src/Handler/Concerns/SavesData.php

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ private function save($model, Request $request, bool $creating = false): void
3232

3333
$this->applyValues($data, $model, $request);
3434

35-
$adapter->save($model);
35+
$this->saveModel($model, $request);
3636

3737
$this->saveFields($data, $model, $request);
3838

@@ -153,8 +153,8 @@ private function assertDataValid(array $data, $model, Request $request, bool $al
153153
continue;
154154
}
155155

156-
$fail = function ($message) use (&$failures, $field, $name) {
157-
$failures[$field->location][$name][] = $message;
156+
$fail = function ($message) use (&$failures, $field) {
157+
$failures[] = compact('field', 'message');
158158
};
159159

160160
foreach ($field->validators as $validator) {
@@ -163,7 +163,7 @@ private function assertDataValid(array $data, $model, Request $request, bool $al
163163
}
164164

165165
if (count($failures)) {
166-
throw new UnprocessableEntityException(print_r($failures, true));
166+
throw new UnprocessableEntityException($failures);
167167
}
168168
}
169169

@@ -181,7 +181,7 @@ private function applyValues(array $data, $model, Request $request)
181181

182182
if ($field->setter || $field->saver) {
183183
if ($field->setter) {
184-
($field->setter)($model, $value, $request);
184+
($field->setter)($request, $model, $value);
185185
}
186186

187187
continue;
@@ -195,6 +195,18 @@ private function applyValues(array $data, $model, Request $request)
195195
}
196196
}
197197

198+
private function saveModel($model, Request $request)
199+
{
200+
$adapter = $this->resource->getAdapter();
201+
$schema = $this->resource->getSchema();
202+
203+
if ($schema->saver) {
204+
($schema->saver)($request, $model);
205+
} else {
206+
$adapter->save($model);
207+
}
208+
}
209+
198210
private function saveFields(array $data, $model, Request $request)
199211
{
200212
$schema = $this->resource->getSchema();

src/Handler/Create.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public function handle(Request $request): Response
3030
throw new ForbiddenException('You cannot create this resource');
3131
}
3232

33-
$model = $this->resource->getAdapter()->create();
33+
$model = $schema->createModel ? ($schema->createModel)($request) : $this->resource->getAdapter()->create();
3434

3535
$data = $this->parseData($request->getParsedBody());
3636

@@ -52,7 +52,7 @@ public function handle(Request $request): Response
5252
$callback($request, $model);
5353
}
5454

55-
$adapter->save($model);
55+
$this->saveModel($model, $request);
5656

5757
$this->saveFields($data, $model, $request);
5858

src/Schema/Builder.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,13 @@ class Builder
2525
public $deletingCallbacks = [];
2626
public $deletedCallbacks = [];
2727
public $defaultSort;
28+
public $createModel;
29+
public $saver;
2830

2931
public function __construct()
3032
{
3133
$this->notCreatable();
34+
$this->notUpdatable();
3235
$this->notDeletable();
3336
}
3437

@@ -84,6 +87,11 @@ public function uncountable()
8487
$this->countable = false;
8588
}
8689

90+
public function createModel(Closure $callback)
91+
{
92+
$this->createModel = $callback;
93+
}
94+
8795
public function scope(Closure $callback)
8896
{
8997
$this->scopes[] = $callback;
@@ -175,6 +183,13 @@ public function updated(Closure $callback)
175183
$this->updatedCallbacks[] = $callback;
176184
}
177185

186+
public function save(Closure $callback)
187+
{
188+
$this->saver = $callback;
189+
190+
return $this;
191+
}
192+
178193
public function deletableIf(Closure $condition)
179194
{
180195
$this->isDeletable = $condition;

0 commit comments

Comments
 (0)