Skip to content

Commit 7fcabcc

Browse files
author
Matej Grgić
committed
fix: lint & phpstan
1 parent 30c2164 commit 7fcabcc

24 files changed

+232
-68
lines changed

src/Bridge/OpenApi/Model/Api.php

+5
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,9 @@ public function toOpenApi(): array
102102

103103
return $api;
104104
}
105+
106+
public function getEmail(): ?string
107+
{
108+
return $this->email;
109+
}
105110
}

src/Bridge/OpenApi/Model/JsonApi/Endpoint/GetResourceEndpoint.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,12 @@ public function __construct(
4747
$this->path = $path;
4848
$this->includes = $includes;
4949

50-
$this->responses = array_merge([
50+
/** @var Response[] $mergedResponses */
51+
$mergedResponses = array_merge([
5152
new ResourceResponse($this->readSchema, $this->includes),
5253
], $errorResponses);
5354

55+
$this->responses = $mergedResponses;
5456
$this->fields = $fields;
5557
}
5658

src/Bridge/OpenApi/Model/JsonApi/Endpoint/ResourceCollectionEndpoint.php

+21-9
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44

55
namespace Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Endpoint;
66

7+
use Assert\Assertion;
78
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Contract\Endpoint;
89
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Contract\Response;
910
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Contract\Schema;
1011
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Response\CollectionResponse;
12+
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Schema\Filter\Filter;
1113
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Schema\Filter\FilterSetQueryParam;
1214
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Schema\Query\IncludeQueryParam;
1315
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Schema\Resource\ReadSchema;
@@ -26,24 +28,25 @@ class ResourceCollectionEndpoint implements Endpoint
2628
/** @var mixed[] */
2729
private $filters;
2830

29-
/** @var mixed[] */
31+
/** @var array<string, ReadSchema> */
3032
private $includes;
3133

3234
/** @var mixed[] */
3335
private $fields;
3436

35-
/** @var mixed[] */
37+
/**
38+
* @var mixed[]
39+
*
40+
* @psalm-suppress UnusedProperty
41+
*/
3642
private $sorts;
3743

3844
/** @var null|Schema */
3945
private $pagination;
4046

4147
/**
42-
* @param mixed[] $filters
43-
* @param mixed[] $sorts
44-
* @param mixed[] $includes
45-
* @param mixed[] $fields
46-
* @param mixed[] $errorResponses
48+
* @param Filter[] $filters
49+
* @param array<string, ReadSchema> $includes
4750
*/
4851
public function __construct(
4952
ReadSchema $schema,
@@ -59,13 +62,17 @@ public function __construct(
5962
$this->path = $path;
6063
$this->includes = $includes;
6164

62-
$this->responses = array_merge(
65+
Assertion::allIsInstanceOf($this->includes, ReadSchema::class);
66+
67+
/** @var Response[] $responses */
68+
$responses = array_merge(
6369
[
6470
new CollectionResponse($this->schema, $this->includes),
6571
],
6672
$errorResponses
6773
);
6874

75+
$this->responses = $responses;
6976
$this->filters = $filters;
7077
$this->sorts = $sorts;
7178
$this->fields = $fields;
@@ -101,6 +108,7 @@ public function getParams(): array
101108
}
102109

103110
if (false === empty($this->filters)) {
111+
Assertion::allIsInstanceOf($this->filters, Filter::class);
104112
$filterSet = new FilterSetQueryParam('filter', $this->filters);
105113
$queryParams[] = $filterSet->toOpenApi();
106114
}
@@ -116,7 +124,6 @@ public function toOpenApi(): array
116124
{
117125
$responses = [];
118126

119-
/** @var Response $response */
120127
foreach ($this->responses as $response) {
121128
$responses[$response->getStatusCode()] = $response->toOpenApi();
122129
}
@@ -130,4 +137,9 @@ public function toOpenApi(): array
130137
'responses' => $responses,
131138
];
132139
}
140+
141+
public function getSorts(): array
142+
{
143+
return $this->sorts;
144+
}
133145
}

src/Bridge/OpenApi/Model/JsonApi/Requests/CreateResourceRequest.php

+5
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,9 @@ public function getSchemaReference(): string
3030
{
3131
return $this->schema->getName();
3232
}
33+
34+
public function getResourceType(): string
35+
{
36+
return $this->resourceType;
37+
}
3338
}

src/Bridge/OpenApi/Model/JsonApi/Requests/UpdateResourceRequest.php

+5
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,9 @@ public function getSchemaReference(): string
3030
{
3131
return $this->schema->getName();
3232
}
33+
34+
public function getResourceType(): string
35+
{
36+
return $this->resourceType;
37+
}
3338
}

src/Bridge/OpenApi/Model/JsonApi/Response/CollectionResponse.php

+1-3
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,7 @@ public function toOpenApi(): array
6161

6262
if (false === empty($this->includes)) {
6363
$includedSchema = new IncludedSchema($this->includes);
64-
if (false === empty($includedSchema)) {
65-
$responseContentSchema['schema']['properties']['included'] = $includedSchema->toOpenApi();
66-
}
64+
$responseContentSchema['schema']['properties']['included'] = $includedSchema->toOpenApi();
6765
}
6866

6967
return [

src/Bridge/OpenApi/Model/JsonApi/Response/ResourceResponse.php

+1-3
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,7 @@ public function toOpenApi(): array
5858

5959
if (false === empty($this->includes)) {
6060
$includedSchema = new IncludedSchema($this->includes);
61-
if (false === empty($includedSchema)) {
62-
$responseContentSchema['schema']['properties']['included'] = $includedSchema->toOpenApi();
63-
}
61+
$responseContentSchema['schema']['properties']['included'] = $includedSchema->toOpenApi();
6462
}
6563

6664
return [

src/Bridge/OpenApi/Model/JsonApi/Schema/Query/IncludeQueryParam.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ class IncludeQueryParam implements Schema
1818
private $default;
1919

2020
/**
21-
* @param mixed[] $includes
22-
* @param null|mixed[] $default
21+
* @param string[] $includes
22+
* @param null|string[] $default
2323
*/
2424
public function __construct(array $includes, ?string $description = null, ?array $default = null)
2525
{

src/Bridge/OpenApi/Model/JsonApi/Schema/RelationshipSchema.php

+5
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,9 @@ public function getName(): string
8181
{
8282
return $this->name;
8383
}
84+
85+
public function getDescription(): ?string
86+
{
87+
return $this->description;
88+
}
8489
}

src/Bridge/OpenApi/Model/JsonApi/Schema/Resource/CreateSchema.php

+1-4
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,9 @@ public function toOpenApi(): array
6767
'enum' => [$this->resourceType],
6868
],
6969
],
70+
'required' => $required,
7071
];
7172

72-
if (false === empty($required)) {
73-
$schema['required'] = $required;
74-
}
75-
7673
if (false === empty($this->attributes)) {
7774
$attributesSchema = new AttributesSchema($this->attributes);
7875
$schema['properties']['attributes'] = $attributesSchema->toOpenApi();

src/Bridge/OpenApi/Model/JsonApi/Schema/SchemaCollection.php

+20-7
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,41 @@ class SchemaCollection
1313
*/
1414
private static array $schemas = [];
1515

16+
/**
17+
* @throws SchemaCollectionException
18+
*/
1619
public static function add(string $resourceClass, ResourceSchemaSet $resourceSchemaSet): void
1720
{
18-
$resourceClass = static::normalizeClassName($resourceClass);
21+
$resourceClass = self::normalizeClassName($resourceClass);
1922
if (true === self::exists($resourceClass)) {
2023
throw SchemaCollectionException::resourceAlreadyExists();
2124
}
2225

23-
static::$schemas[$resourceClass] = $resourceSchemaSet;
26+
self::$schemas[$resourceClass] = $resourceSchemaSet;
2427
}
2528

2629
public static function exists(string $resourceClass): bool
2730
{
28-
$resourceClass = static::normalizeClassName($resourceClass);
31+
$resourceClass = self::normalizeClassName($resourceClass);
2932

30-
return isset(static::$schemas[$resourceClass]);
33+
return isset(self::$schemas[$resourceClass]);
3134
}
3235

3336
public static function get(string $className): ResourceSchemaSet
3437
{
35-
$className = static::normalizeClassName($className);
38+
$className = self::normalizeClassName($className);
39+
40+
if (!\array_key_exists($className, self::$schemas)) {
41+
throw new \InvalidArgumentException("Schema not found for class {$className}");
42+
}
43+
44+
$schemaSet = self::$schemas[$className];
45+
46+
if (!$schemaSet instanceof ResourceSchemaSet) {
47+
throw new \UnexpectedValueException("Expected a ResourceSchemaSet, got something else for class {$className}");
48+
}
3649

37-
return static::$schemas[$className];
50+
return $schemaSet;
3851
}
3952

4053
/**
@@ -45,7 +58,7 @@ public static function toOpenApi(): array
4558
$data = [];
4659

4760
/** @var ResourceSchemaSet $schemaSet */
48-
foreach (static::$schemas as $schemaSet) {
61+
foreach (self::$schemas as $schemaSet) {
4962
if (null !== $schemaSet->getIdentifier()) {
5063
$data[$schemaSet->getIdentifier()->getName()] = $schemaSet->getIdentifier()->toOpenApi();
5164
}

src/Bridge/OpenApi/Service/ResourceApiEndpointsFactory.php

+41-3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Endpoint\GetResourceEndpoint;
1212
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Endpoint\ResourceCollectionEndpoint;
1313
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Endpoint\UpdateResourceEndpoint;
14+
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Schema\Filter\Filter;
1415
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Schema\Query\OffsetBasedPaginationQueryParam;
1516
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Schema\Query\PageBasedPaginationQueryParam;
1617

@@ -213,14 +214,20 @@ public function addToApi(Api $api): void
213214
* CollectionResponse response proper `anyOf` schema is generated, referencing these schemas.
214215
*/
215216
$collectionIncludedSchemas = array_map(
216-
[$this->schemaFactory, 'readSchema'],
217+
function ($item) {
218+
if (!\is_string($item)) {
219+
throw new \InvalidArgumentException('Expected a string');
220+
}
221+
222+
return $this->schemaFactory->readSchema($item);
223+
},
217224
$this->collectionIncludes
218225
);
219226

220227
$getCollectionEndpoint = new ResourceCollectionEndpoint(
221228
$readSchema,
222229
$this->path,
223-
$this->collectionFilters,
230+
$this->prepareCollectionFilters(),
224231
$this->collectionSorts,
225232
$collectionIncludedSchemas,
226233
$this->collectionFields,
@@ -242,7 +249,13 @@ public function addToApi(Api $api): void
242249
* CollectionResponse response proper `anyOf` schema is generated, referencing these schemas.
243250
*/
244251
$singleIncludedSchemas = array_map(
245-
[$this->schemaFactory, 'readSchema'],
252+
function ($item) {
253+
if (!\is_string($item)) {
254+
throw new \InvalidArgumentException('Expected a string');
255+
}
256+
257+
return $this->schemaFactory->readSchema($item);
258+
},
246259
$this->singleIncludes
247260
);
248261

@@ -281,4 +294,29 @@ public function addToApi(Api $api): void
281294
$api->addEndpoint($createResourceEndpoint);
282295
}
283296
}
297+
298+
public function isDelete(): bool
299+
{
300+
return $this->delete;
301+
}
302+
303+
/**
304+
* Checks and prepares collection filters before using them in ResourceCollectionEndpoint.
305+
*
306+
* @throws \InvalidArgumentException if any filter is not of the expected type
307+
*/
308+
private function prepareCollectionFilters(): array
309+
{
310+
$preparedFilters = [];
311+
312+
foreach ($this->collectionFilters as $filter) {
313+
if (!$filter instanceof Filter) {
314+
continue;
315+
}
316+
317+
$preparedFilters[] = $filter;
318+
}
319+
320+
return $preparedFilters;
321+
}
284322
}

src/Bridge/OpenApi/Service/ResourceSchemaFactory.php

+10-2
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,11 @@ public function updateSchema(string $resourceClass): UpdateSchema
118118
private function getAttributes(ResourceMetadata $metadata): array
119119
{
120120
return $metadata->getAttributesMetadata()
121-
->map(function (AttributeMetadata $attributeMetadata) {
121+
->map(function ($attributeMetadata) {
122+
if (!$attributeMetadata instanceof AttributeMetadata) {
123+
throw new \InvalidArgumentException('Expected AttributeMetadata instance.');
124+
}
125+
122126
return $this->attributeSchemaFactory->make($attributeMetadata);
123127
})
124128
->toArray();
@@ -130,7 +134,11 @@ private function getAttributes(ResourceMetadata $metadata): array
130134
private function getRelationships(ResourceMetadata $metadata): array
131135
{
132136
return $metadata->getRelationshipsMetadata()
133-
->map(function (RelationshipMetadata $relationshipMetadata) {
137+
->map(function ($relationshipMetadata) {
138+
if (!$relationshipMetadata instanceof RelationshipMetadata) {
139+
throw new \InvalidArgumentException('Expected RelationshipMetadata instance.');
140+
}
141+
134142
return $this->relationshipSchemaFactory->make($relationshipMetadata);
135143
})
136144
->toArray();

0 commit comments

Comments
 (0)