forked from zircote/swagger-php
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBuildPaths.php
59 lines (54 loc) · 2.09 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
<?php declare(strict_types=1);
/**
* @license Apache 2.0
*/
namespace OpenApi\Processors;
use OpenApi\Analysis;
use OpenApi\Annotations\Operation;
use OpenApi\Annotations\PathItem;
use OpenApi\Context;
use OpenApi\Logger;
/**
* Build the openapi->paths using the detected @OA\PathItem and @OA\Operations (like @OA\Get, @OA\Post, etc).
*/
class BuildPaths
{
public function __invoke(Analysis $analysis)
{
$paths = [];
// Merge @OA\PathItems with the same path.
if ($analysis->openapi->paths !== UNDEFINED) {
foreach ($analysis->openapi->paths as $annotation) {
if (empty($annotation->path)) {
Logger::notice($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;
}
}
}
// Merge @OA\Operations into existing @OA\PathItems or create a new one.
$operations = $analysis->unmerged()->getAnnotationsOfType(Operation::class);
foreach ($operations as $operation) {
if ($operation->path) {
if (empty($paths[$operation->path])) {
$paths[$operation->path] = new PathItem(
[
'path' => $operation->path,
'_context' => new Context(['generated' => true], $operation->_context),
]
);
$analysis->annotations->attach($paths[$operation->path]);
}
if ($paths[$operation->path]->merge([$operation])) {
Logger::notice('Unable to merge '.$operation->identity().' in '.$operation->_context);
}
}
}
if (count($paths)) {
$analysis->openapi->paths = array_values($paths);
}
}
}