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

api-platform / core / 15133993414

20 May 2025 09:30AM UTC coverage: 26.313% (-1.2%) from 27.493%
15133993414

Pull #7161

github

web-flow
Merge e2c03d45f into 5459ba375
Pull Request #7161: fix(metadata): infer parameter string type from schema

0 of 2 new or added lines in 1 file covered. (0.0%)

11019 existing lines in 363 files now uncovered.

12898 of 49018 relevant lines covered (26.31%)

34.33 hits per line

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

86.11
/src/JsonSchema/ResourceMetadataTrait.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\JsonSchema;
15

16
use ApiPlatform\Metadata\CollectionOperationInterface;
17
use ApiPlatform\Metadata\Exception\OperationNotFoundException;
18
use ApiPlatform\Metadata\HttpOperation;
19
use ApiPlatform\Metadata\Operation;
20
use ApiPlatform\Metadata\Resource\ResourceMetadataCollection;
21
use ApiPlatform\Metadata\Util\ResourceClassInfoTrait;
22

23
/**
24
 * @internal
25
 */
26
trait ResourceMetadataTrait
27
{
28
    use ResourceClassInfoTrait;
29

30
    private function findOutputClass(string $className, string $type, Operation $operation, ?array $serializerContext): ?string
31
    {
UNCOV
32
        $inputOrOutput = ['class' => $className];
61✔
UNCOV
33
        $inputOrOutput = Schema::TYPE_OUTPUT === $type ? ($operation->getOutput() ?? $inputOrOutput) : ($operation->getInput() ?? $inputOrOutput);
61✔
UNCOV
34
        $forceSubschema = $serializerContext[SchemaFactory::FORCE_SUBSCHEMA] ?? false;
61✔
35

UNCOV
36
        return $forceSubschema ? ($inputOrOutput['class'] ?? $inputOrOutput->class ?? $operation->getClass()) : ($inputOrOutput['class'] ?? $inputOrOutput->class ?? null);
61✔
37
    }
38

39
    private function findOperation(string $className, string $type, ?Operation $operation, ?array $serializerContext, ?string $format = null): Operation
40
    {
UNCOV
41
        if (null === $operation) {
61✔
UNCOV
42
            if (null === $this->resourceMetadataFactory) {
42✔
43
                return new HttpOperation();
×
44
            }
UNCOV
45
            $resourceMetadataCollection = $this->resourceMetadataFactory->create($className);
42✔
46

47
            try {
UNCOV
48
                $operation = $resourceMetadataCollection->getOperation();
42✔
49
            } catch (OperationNotFoundException $e) {
×
50
                $operation = new HttpOperation();
×
51
            }
UNCOV
52
            $forceSubschema = $serializerContext[SchemaFactory::FORCE_SUBSCHEMA] ?? false;
42✔
UNCOV
53
            if ($operation->getShortName() === $this->getShortClassName($className) && $forceSubschema) {
42✔
UNCOV
54
                $operation = new HttpOperation();
19✔
55
            }
56

UNCOV
57
            return $this->findOperationForType($resourceMetadataCollection, $type, $operation, $forceSubschema ? null : $format);
42✔
58
        }
59

60
        // The best here is to use an Operation when calling `buildSchema`, we try to do a smart guess otherwise
UNCOV
61
        if ($this->resourceMetadataFactory && !$operation->getClass()) {
46✔
UNCOV
62
            $resourceMetadataCollection = $this->resourceMetadataFactory->create($className);
5✔
63

UNCOV
64
            if ($operation->getName()) {
5✔
UNCOV
65
                return $resourceMetadataCollection->getOperation($operation->getName());
4✔
66
            }
67

UNCOV
68
            return $this->findOperationForType($resourceMetadataCollection, $type, $operation, $format);
1✔
69
        }
70

UNCOV
71
        return $operation;
41✔
72
    }
73

74
    private function findOperationForType(ResourceMetadataCollection $resourceMetadataCollection, string $type, Operation $operation, ?string $format = null): Operation
75
    {
76
        // Find the operation and use the first one that matches criterias
UNCOV
77
        foreach ($resourceMetadataCollection as $resourceMetadata) {
42✔
UNCOV
78
            foreach ($resourceMetadata->getOperations() ?? [] as $op) {
42✔
UNCOV
79
                if ($operation instanceof CollectionOperationInterface && $op instanceof CollectionOperationInterface) {
42✔
80
                    $operation = $op;
×
81
                    break 2;
×
82
                }
83

UNCOV
84
                if (Schema::TYPE_INPUT === $type && \in_array($op->getMethod(), ['POST', 'PATCH', 'PUT'], true)) {
42✔
UNCOV
85
                    $operation = $op;
16✔
UNCOV
86
                    break 2;
16✔
87
                }
88

UNCOV
89
                if ($format && Schema::TYPE_OUTPUT === $type && \array_key_exists($format, $op->getOutputFormats() ?? [])) {
42✔
UNCOV
90
                    $operation = $op;
31✔
UNCOV
91
                    break 2;
31✔
92
                }
93
            }
94
        }
95

UNCOV
96
        return $operation;
42✔
97
    }
98

99
    private function getSerializerContext(Operation $operation, string $type = Schema::TYPE_OUTPUT): array
100
    {
UNCOV
101
        return Schema::TYPE_OUTPUT === $type ? ($operation->getNormalizationContext() ?? []) : ($operation->getDenormalizationContext() ?? []);
41✔
102
    }
103

104
    private function getShortClassName(string $fullyQualifiedName): string
105
    {
UNCOV
106
        $parts = explode('\\', $fullyQualifiedName);
42✔
107

UNCOV
108
        return end($parts);
42✔
109
    }
110
}
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