forked from zircote/swagger-php
-
Notifications
You must be signed in to change notification settings - Fork 0
/
BuildPaths.php
60 lines (54 loc) · 2.21 KB
/
BuildPaths.php
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
58
59
60
<?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 `@OA\PathItem` and `@OA\Operation` (`@OA\Get`, `@OA\Post`, etc).
*/
class BuildPaths implements ProcessorInterface
{
public function __invoke(Analysis $analysis)
{
$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->annotations->detach($annotation);
} else {
$paths[$annotation->path] = $annotation;
}
}
}
/** @var OA\Operation[] $operations */
$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);
}
}
}