forked from zircote/swagger-php
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBuildPaths.php
More file actions
57 lines (51 loc) · 2.11 KB
/
Copy pathBuildPaths.php
File metadata and controls
57 lines (51 loc) · 2.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php declare(strict_types=1);
/**
* @license Apache 2.0
*/
namespace OpenApi\Processors;
use OpenApi\Analysis;
use OpenApi\Annotations as OA;
use OpenApi\Context;
use OpenApi\Generator;
/**
* Build the openapi->paths using the detected <code>@OA\PathItem</code> and <code>@OA\Operation</code> (<code>@OA\Get</code>, etc).
*/
class BuildPaths
{
public function __invoke(Analysis $analysis): void
{
$paths = [];
// Merge @OA\PathItems with the same path.
if (!Generator::isDefault($analysis->openapi->paths)) {
foreach ($analysis->openapi->paths as $annotation) {
if (empty($annotation->path)) {
$annotation->_context->logger->warning($annotation->identity() . ' is missing required property "path" in ' . $annotation->_context);
} elseif (isset($paths[$annotation->path])) {
$paths[$annotation->path]->mergeProperties($annotation);
$analysis->removeAnnotation($annotation);
} else {
$paths[$annotation->path] = $annotation;
}
}
}
$operations = $analysis->unmerged()->getAnnotationsOfType(OA\Operation::class);
// Merge @OA\Operations into existing @OA\PathItems or create a new one.
foreach ($operations as $operation) {
if ($operation->path) {
if (empty($paths[$operation->path])) {
$paths[$operation->path] = $pathItem = new OA\PathItem([
'path' => $operation->path,
'_context' => new Context(['generated' => true], $operation->_context),
]);
$analysis->addAnnotation($pathItem, $pathItem->_context);
}
if ($paths[$operation->path]->merge([$operation])) {
$operation->_context->logger->warning('Unable to merge ' . $operation->identity() . ' in ' . $operation->_context);
}
}
}
if ($paths) {
$analysis->openapi->paths = array_values($paths);
}
}
}