|
5 | 5 | use Ark4ne\JsonApi\Descriptors\Describer;
|
6 | 6 | use Ark4ne\JsonApi\Descriptors\Relations\Relation;
|
7 | 7 | use Ark4ne\JsonApi\Descriptors\Resolver;
|
| 8 | +use Ark4ne\JsonApi\Descriptors\Values\ValueStruct; |
8 | 9 | use Ark4ne\JsonApi\Resources\Skeleton;
|
9 | 10 | use Ark4ne\JsonApi\Support\FakeModel;
|
10 | 11 | use Ark4ne\JsonApi\Support\Values;
|
@@ -37,9 +38,16 @@ public static function schema(null|Request $request = null): Skeleton
|
37 | 38 | );
|
38 | 39 |
|
39 | 40 | $schema->fields = (new Collection(Values::mergeValues($resource->toAttributes($request))))
|
40 |
| - ->map(fn($value, $key) => Describer::retrieveName($value, $key)) |
41 |
| - ->values() |
42 |
| - ->all(); |
| 41 | + ->flatMap(function ($value, $key) use ($resource) { |
| 42 | + $collection = (new Collection([Describer::retrieveName($value, $key) => true])); |
| 43 | + |
| 44 | + if ($value instanceof ValueStruct) { |
| 45 | + return $collection->merge(self::structFields($resource, $key, $value, $key)); |
| 46 | + } |
| 47 | + |
| 48 | + return $collection; |
| 49 | + }) |
| 50 | + ->keys()->all(); |
43 | 51 |
|
44 | 52 | foreach (Values::mergeValues($resource->toRelationships($request)) as $name => $relation) {
|
45 | 53 | if ($relation instanceof Relation) {
|
@@ -83,4 +91,18 @@ private static function new(): static
|
83 | 91 |
|
84 | 92 | return $instance;
|
85 | 93 | }
|
| 94 | + |
| 95 | + private static function structFields(mixed $resource, string $key, ValueStruct $struct, null|string $prefix = null): Collection |
| 96 | + { |
| 97 | + return (new Collection(Values::mergeValues(($struct->retriever())($resource, $key)))) |
| 98 | + ->flatMap(function($value, $key) use ($resource, $prefix) { |
| 99 | + $prefixed = Describer::retrieveName($value, $key, $prefix); |
| 100 | + |
| 101 | + if ($value instanceof ValueStruct) { |
| 102 | + return self::structFields($resource, $key, $value, $prefixed); |
| 103 | + } |
| 104 | + |
| 105 | + return [$prefixed => $value]; |
| 106 | + }); |
| 107 | + } |
86 | 108 | }
|
0 commit comments