Skip to content

Commit a9feac5

Browse files
committed
wip
1 parent bb415b0 commit a9feac5

File tree

5 files changed

+50
-10
lines changed

5 files changed

+50
-10
lines changed

src/Adapter/AdapterInterface.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ public function saveHasMany($model, HasMany $relationship, array $related);
3434

3535
public function delete($model);
3636

37+
public function filterByIds($query, array $ids);
38+
3739
public function filterByAttribute($query, Attribute $attribute, $value);
3840

3941
public function filterByHasOne($query, HasOne $relationship, array $ids);

src/Adapter/EloquentAdapter.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,13 @@ public function delete($model)
117117
$model->delete();
118118
}
119119

120+
public function filterByIds($query, array $ids)
121+
{
122+
$key = $query->getModel()->getQualifiedKeyName();
123+
124+
$query->whereIn($key, $ids);
125+
}
126+
120127
public function filterByAttribute($query, Attribute $field, $value)
121128
{
122129
$property = $this->getAttributeProperty($field);
@@ -145,8 +152,9 @@ public function filterByAttribute($query, Attribute $field, $value)
145152

146153
public function filterByHasOne($query, HasOne $field, array $ids)
147154
{
148-
$property = $this->getRelationshipProperty($field);
149-
$foreignKey = $query->getModel()->{$property}()->getQualifiedForeignKey();
155+
$relation = $query->getModel()->{$this->getRelationshipProperty($field)}();
156+
157+
$foreignKey = $relation->getQualifiedForeignKeyName();
150158

151159
$query->whereIn($foreignKey, $ids);
152160
}

src/Exception/ResourceNotFoundException.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,17 @@ public function getJsonApiErrors(): array
2525
return [
2626
new Error(
2727
new Error\Title('Resource Not Found'),
28-
new Error\Status('404'),
28+
new Error\Status($this->getJsonApiStatus()),
2929
new Error\Detail($this->getMessage())
3030
)
3131
];
3232
}
3333

34+
public function getJsonApiStatus(): string
35+
{
36+
return '404';
37+
}
38+
3439
public function getType(): string
3540
{
3641
return $this->type;

src/Handler/Create.php

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,31 @@ public function handle(Request $request): Response
3232

3333
$model = $this->resource->getAdapter()->create();
3434

35+
$data = $this->parseData($request->getParsedBody());
36+
37+
$adapter = $this->resource->getAdapter();
38+
39+
$this->assertFieldsExist($data);
40+
41+
$this->assertFieldsWritable($data, $model, $request);
42+
43+
$this->fillDefaultValues($data, $request);
44+
45+
$this->loadRelatedResources($data, $request);
46+
47+
$this->assertDataValid($data, $model, $request, true);
48+
49+
$this->applyValues($data, $model, $request);
50+
3551
foreach ($schema->creatingCallbacks as $callback) {
3652
$callback($request, $model);
3753
}
3854

39-
$this->save($model, $request, true);
55+
$adapter->save($model);
56+
57+
$this->saveFields($data, $model, $request);
58+
59+
$this->runSavedCallbacks($data, $model, $request);
4060

4161
foreach ($schema->createdCallbacks as $callback) {
4262
$callback($request, $model);

src/Handler/Index.php

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ public function handle(Request $request): Response
4040
$query = $adapter->query();
4141

4242
foreach ($schema->scopes as $scope) {
43-
$scope($request, $query);
43+
$request = $scope($request, $query) ?: $request;
4444
}
4545

4646
foreach ($schema->indexScopes as $scope) {
47-
$scope($request, $query);
47+
$request = $scope($request, $query) ?: $request;
4848
}
4949

5050
if ($filter = $request->getAttribute('jsonApiFilter')) {
@@ -57,7 +57,9 @@ public function handle(Request $request): Response
5757

5858
$paginationLinks = [];
5959
$members = [
60-
new Link\SelfLink($this->buildUrl($request))
60+
new Link\SelfLink($this->buildUrl($request)),
61+
new Meta('offset', $offset),
62+
new Meta('limit', $limit),
6163
];
6264

6365
if ($offset > 0) {
@@ -197,9 +199,7 @@ private function extractQueryParams(Request $request): Request
197199
}
198200

199201
foreach ($filter as $name => $value) {
200-
if (! isset($schema->fields[$name])
201-
|| ! $schema->fields[$name]->filterable
202-
) {
202+
if ($name !== 'id' && (! isset($schema->fields[$name]) || ! $schema->fields[$name]->filterable)) {
203203
throw new BadRequestException("Invalid filter [$name]", "filter[$name]");
204204
}
205205
}
@@ -261,6 +261,11 @@ private function filter($query, $filter, Request $request)
261261
$adapter = $this->resource->getAdapter();
262262

263263
foreach ($filter as $name => $value) {
264+
if ($name === 'id') {
265+
$adapter->filterByIds($query, explode(',', $value));
266+
continue;
267+
}
268+
264269
$field = $schema->fields[$name];
265270

266271
if ($field->filter) {

0 commit comments

Comments
 (0)