• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

api-platform / core / 10903050455

17 Sep 2024 12:29PM UTC coverage: 7.684% (+0.7%) from 6.96%
10903050455

push

github

web-flow
fix: swagger ui with route identifier (#6616)

2 of 6 new or added lines in 6 files covered. (33.33%)

9000 existing lines in 286 files now uncovered.

12668 of 164863 relevant lines covered (7.68%)

22.93 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

91.76
/src/Metadata/Resource/Factory/ParameterResourceMetadataCollectionFactory.php
1
<?php
2

3
/*
4
 * This file is part of the API Platform project.
5
 *
6
 * (c) Kévin Dunglas <dunglas@gmail.com>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11

12
declare(strict_types=1);
13

14
namespace ApiPlatform\Metadata\Resource\Factory;
15

16
use ApiPlatform\Metadata\ApiProperty;
17
use ApiPlatform\Metadata\FilterInterface;
18
use ApiPlatform\Metadata\JsonSchemaFilterInterface;
19
use ApiPlatform\Metadata\OpenApiParameterFilterInterface;
20
use ApiPlatform\Metadata\Parameter;
21
use ApiPlatform\Metadata\Parameters;
22
use ApiPlatform\Metadata\Property\Factory\PropertyMetadataFactoryInterface;
23
use ApiPlatform\Metadata\Property\Factory\PropertyNameCollectionFactoryInterface;
24
use ApiPlatform\Metadata\Resource\ResourceMetadataCollection;
25
use ApiPlatform\OpenApi\Model\Parameter as OpenApiParameter;
26
use ApiPlatform\Serializer\Filter\FilterInterface as SerializerFilterInterface;
27
use Psr\Container\ContainerInterface;
28
use Symfony\Component\Serializer\NameConverter\NameConverterInterface;
29

30
/**
31
 * Prepares Parameters documentation by reading its filter details and declaring an OpenApi parameter.
32
 *
33
 * @experimental
34
 */
35
final class ParameterResourceMetadataCollectionFactory implements ResourceMetadataCollectionFactoryInterface
36
{
37
    public function __construct(
38
        private readonly PropertyNameCollectionFactoryInterface $propertyNameCollectionFactory,
39
        private readonly PropertyMetadataFactoryInterface $propertyMetadataFactory,
40
        private readonly ?ResourceMetadataCollectionFactoryInterface $decorated = null,
41
        private readonly ?ContainerInterface $filterLocator = null,
42
        private readonly ?NameConverterInterface $nameConverter = null,
43
    ) {
UNCOV
44
    }
2,258✔
45

46
    public function create(string $resourceClass): ResourceMetadataCollection
47
    {
UNCOV
48
        $resourceMetadataCollection = $this->decorated?->create($resourceClass) ?? new ResourceMetadataCollection($resourceClass);
42✔
49

UNCOV
50
        $propertyNames = [];
42✔
UNCOV
51
        $properties = [];
42✔
UNCOV
52
        foreach ($this->propertyNameCollectionFactory->create($resourceClass) as $i => $property) {
42✔
UNCOV
53
            $propertyMetadata = $this->propertyMetadataFactory->create($resourceClass, $property);
42✔
UNCOV
54
            if ($propertyMetadata->isReadable()) {
42✔
UNCOV
55
                $propertyNames[] = $property;
42✔
UNCOV
56
                $properties[$property] = $propertyMetadata;
42✔
57
            }
58
        }
59

UNCOV
60
        foreach ($resourceMetadataCollection as $i => $resource) {
42✔
UNCOV
61
            $operations = $resource->getOperations();
34✔
62

UNCOV
63
            $internalPriority = -1;
34✔
UNCOV
64
            foreach ($operations as $operationName => $operation) {
34✔
UNCOV
65
                $parameters = $operation->getParameters() ?? new Parameters();
34✔
UNCOV
66
                foreach ($parameters as $key => $parameter) {
34✔
UNCOV
67
                    if (':property' === $key) {
3✔
UNCOV
68
                        foreach ($propertyNames as $property) {
3✔
UNCOV
69
                            $converted = $this->nameConverter?->denormalize($property) ?? $property;
3✔
UNCOV
70
                            $propertyParameter = $this->setDefaults($converted, $parameter, $resourceClass, $properties);
3✔
UNCOV
71
                            $priority = $propertyParameter->getPriority() ?? $internalPriority--;
3✔
UNCOV
72
                            $parameters->add($converted, $propertyParameter->withPriority($priority)->withKey($converted));
3✔
73
                        }
74

UNCOV
75
                        $parameters->remove($key, $parameter::class);
3✔
UNCOV
76
                        continue;
3✔
77
                    }
78

UNCOV
79
                    $key = $parameter->getKey() ?? $key;
3✔
80

UNCOV
81
                    if (str_contains($key, ':property')) {
3✔
UNCOV
82
                        $p = [];
3✔
UNCOV
83
                        foreach ($propertyNames as $prop) {
3✔
UNCOV
84
                            $p[$this->nameConverter?->denormalize($prop) ?? $prop] = $prop;
3✔
85
                        }
86

UNCOV
87
                        $parameter = $parameter->withExtraProperties(($parameter->getExtraProperties() ?? []) + ['_properties' => $p]);
3✔
88
                    }
89

UNCOV
90
                    $parameter = $this->setDefaults($key, $parameter, $resourceClass, $properties);
3✔
UNCOV
91
                    $priority = $parameter->getPriority() ?? $internalPriority--;
3✔
UNCOV
92
                    $parameters->add($key, $parameter->withPriority($priority));
3✔
93
                }
94

UNCOV
95
                if (\count($parameters) > 0) {
34✔
UNCOV
96
                    $operations->add($operationName, $operation->withParameters($parameters));
3✔
97
                }
98
            }
99

UNCOV
100
            $resourceMetadataCollection[$i] = $resource->withOperations($operations->sort());
34✔
101

UNCOV
102
            if (!$graphQlOperations = $resource->getGraphQlOperations()) {
34✔
UNCOV
103
                continue;
16✔
104
            }
105

UNCOV
106
            $internalPriority = -1;
31✔
UNCOV
107
            foreach ($graphQlOperations as $operationName => $operation) {
31✔
UNCOV
108
                $parameters = $operation->getParameters() ?? new Parameters();
31✔
UNCOV
109
                foreach ($operation->getParameters() ?? [] as $key => $parameter) {
31✔
UNCOV
110
                    $key = $parameter->getKey() ?? $key;
3✔
UNCOV
111
                    $parameter = $this->setDefaults($key, $parameter, $resourceClass, $properties);
3✔
UNCOV
112
                    $priority = $parameter->getPriority() ?? $internalPriority--;
3✔
UNCOV
113
                    $parameters->add($key, $parameter->withPriority($priority));
3✔
114
                }
115

UNCOV
116
                $graphQlOperations[$operationName] = $operation->withParameters($parameters);
31✔
117
            }
118

UNCOV
119
            $resourceMetadataCollection[$i] = $resource->withGraphQlOperations($graphQlOperations);
31✔
120
        }
121

UNCOV
122
        return $resourceMetadataCollection;
42✔
123
    }
124

125
    private function addFilterMetadata(Parameter $parameter): Parameter
126
    {
UNCOV
127
        if (!($filterId = $parameter->getFilter())) {
3✔
UNCOV
128
            return $parameter;
3✔
129
        }
130

UNCOV
131
        $filter = \is_object($filterId) ? $filterId : $this->filterLocator->get($filterId);
3✔
132

UNCOV
133
        if (!$filter) {
3✔
134
            return $parameter;
×
135
        }
136

UNCOV
137
        if (null === $parameter->getSchema() && $filter instanceof JsonSchemaFilterInterface) {
3✔
UNCOV
138
            if ($schema = $filter->getSchema($parameter)) {
3✔
UNCOV
139
                $parameter = $parameter->withSchema($schema);
3✔
140
            }
141
        }
142

UNCOV
143
        if (null === $parameter->getOpenApi() && $filter instanceof OpenApiParameterFilterInterface) {
3✔
UNCOV
144
            if ($openApiParameter = $filter->getOpenApiParameters($parameter)) {
3✔
UNCOV
145
                $parameter = $parameter->withOpenApi($openApiParameter);
3✔
146
            }
147
        }
148

UNCOV
149
        return $parameter;
3✔
150
    }
151

152
    /**
153
     * @param array<string, ApiProperty> $properties
154
     */
155
    private function setDefaults(string $key, Parameter $parameter, string $resourceClass, array $properties): Parameter
156
    {
UNCOV
157
        if (null === $parameter->getKey()) {
3✔
UNCOV
158
            $parameter = $parameter->withKey($key);
3✔
159
        }
160

UNCOV
161
        $filter = $parameter->getFilter();
3✔
UNCOV
162
        if (\is_string($filter) && $this->filterLocator->has($filter)) {
3✔
UNCOV
163
            $filter = $this->filterLocator->get($filter);
3✔
164
        }
165

UNCOV
166
        if ($filter instanceof SerializerFilterInterface && null === $parameter->getProvider()) {
3✔
UNCOV
167
            $parameter = $parameter->withProvider('api_platform.serializer.filter_parameter_provider');
3✔
168
        }
169

170
        // Read filter description to populate the Parameter
UNCOV
171
        $description = $filter instanceof FilterInterface ? $filter->getDescription($resourceClass) : [];
3✔
UNCOV
172
        if (($schema = $description[$key]['schema'] ?? null) && null === $parameter->getSchema()) {
3✔
173
            $parameter = $parameter->withSchema($schema);
×
174
        }
175

UNCOV
176
        if (null === $parameter->getProperty() && ($property = $description[$key]['property'] ?? null)) {
3✔
UNCOV
177
            $parameter = $parameter->withProperty($property);
3✔
178
        }
179

UNCOV
180
        $currentKey = $key;
3✔
UNCOV
181
        if (null === $parameter->getProperty() && isset($properties[$key])) {
3✔
UNCOV
182
            $parameter = $parameter->withProperty($key);
3✔
183
        }
184

UNCOV
185
        if (null === $parameter->getProperty() && $this->nameConverter && ($nameConvertedKey = $this->nameConverter->normalize($key)) && isset($properties[$nameConvertedKey])) {
3✔
186
            $parameter = $parameter->withProperty($key)->withExtraProperties(['_query_property' => $nameConvertedKey] + $parameter->getExtraProperties());
×
187
            $currentKey = $nameConvertedKey;
×
188
        }
189

UNCOV
190
        if (isset($properties[$currentKey]) && ($eloquentRelation = ($properties[$currentKey]->getExtraProperties()['eloquent_relation'] ?? null)) && isset($eloquentRelation['foreign_key'])) {
3✔
191
            $parameter = $parameter->withExtraProperties(['_query_property' => $eloquentRelation['foreign_key']] + $parameter->getExtraProperties());
×
192
        }
193

UNCOV
194
        if (null === $parameter->getRequired() && ($required = $description[$key]['required'] ?? null)) {
3✔
195
            $parameter = $parameter->withRequired($required);
×
196
        }
197

UNCOV
198
        if (null === $parameter->getOpenApi() && ($openApi = $description[$key]['openapi'] ?? null) && $openApi instanceof OpenApiParameter) {
3✔
199
            $parameter = $parameter->withOpenApi($openApi);
×
200
        }
201

UNCOV
202
        return $this->addFilterMetadata($parameter);
3✔
203
    }
204
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc