Issues (3641)

Generator/OpenApiSpecificationPathGenerator.php (4 issues)

1
<?php
2
3
/**
4
 * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
5
 * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
6
 */
7
8
namespace Spryker\Zed\DocumentationGeneratorRestApi\Business\Generator;
9
10
use ArrayObject;
11
use Generated\Shared\Transfer\PathMethodDataTransfer;
12
use Generated\Shared\Transfer\PathSchemaDataTransfer;
13
use Spryker\Zed\DocumentationGeneratorRestApi\Business\Renderer\PathMethodRendererInterface;
14
use Symfony\Component\HttpFoundation\Request;
15
use Symfony\Component\HttpFoundation\Response;
16
17
class OpenApiSpecificationPathGenerator implements PathGeneratorInterface
18
{
19
    /**
20
     * @var string
21
     */
22
    protected const DESCRIPTION_DEFAULT_REQUEST = 'Expected request body.';
23
24
    /**
25
     * @var string
26
     */
27
    protected const DESCRIPTION_DEFAULT_RESPONSE = 'Expected response to a bad request.';
28
29
    /**
30
     * @var string
31
     */
32
    protected const DESCRIPTION_SUCCESSFUL_RESPONSE = 'Expected response to a valid request.';
33
34
    /**
35
     * @var string
36
     */
37
    protected const KEY_DEFAULT = 'default';
38
39
    /**
40
     * @var array
41
     */
42
    protected $paths = [];
43
44
    /**
45
     * @var \Spryker\Zed\DocumentationGeneratorRestApi\Business\Renderer\PathMethodRendererInterface
46
     */
47
    protected $pathMethodRenderer;
48
49
    /**
50
     * @param \Spryker\Zed\DocumentationGeneratorRestApi\Business\Renderer\PathMethodRendererInterface $pathMethodRenderer
51
     */
52
    public function __construct(PathMethodRendererInterface $pathMethodRenderer)
53
    {
54
        $this->pathMethodRenderer = $pathMethodRenderer;
55
    }
56
57
    /**
58
     * @return array
59
     */
60
    public function getPaths(): array
61
    {
62
        return $this->paths;
63
    }
64
65
    /**
66
     * @param \Generated\Shared\Transfer\PathMethodDataTransfer $pathMethodDataTransfer
67
     * @param \Generated\Shared\Transfer\PathSchemaDataTransfer $errorSchemaDataTransfer
68
     * @param \Generated\Shared\Transfer\PathSchemaDataTransfer|null $responseSchemaDataTransfer
69
     *
70
     * @return void
71
     */
72
    public function addGetPath(
73
        PathMethodDataTransfer $pathMethodDataTransfer,
74
        PathSchemaDataTransfer $errorSchemaDataTransfer,
75
        ?PathSchemaDataTransfer $responseSchemaDataTransfer
76
    ): void {
77
        if (!$responseSchemaDataTransfer) {
78
            $responseSchemaDataTransfer = new PathSchemaDataTransfer();
79
        }
80
81
        $responseSchemaDataTransfer = $this->addDefaultSuccessResponseToResponseSchemaDataTransfer(
82
            $pathMethodDataTransfer,
83
            $responseSchemaDataTransfer,
84
            (string)Response::HTTP_OK,
85
        );
86
        if ($responseSchemaDataTransfer) {
0 ignored issues
show
$responseSchemaDataTransfer is of type Generated\Shared\Transfer\PathSchemaDataTransfer, thus it always evaluated to true.
Loading history...
87
            $pathMethodDataTransfer->addResponseSchema($responseSchemaDataTransfer);
88
        }
89
90
        $errorSchemaDataTransfer = $this->addDefaultErrorToErrorSchemaDataTransfer($errorSchemaDataTransfer);
91
        $pathMethodDataTransfer->addResponseSchema($errorSchemaDataTransfer);
92
93
        $pathMethodDataTransfer->setMethod(strtolower(Request::METHOD_GET));
94
95
        $this->addPath($pathMethodDataTransfer);
96
    }
97
98
    /**
99
     * @param \Generated\Shared\Transfer\PathMethodDataTransfer $pathMethodDataTransfer
100
     * @param \Generated\Shared\Transfer\PathSchemaDataTransfer $requestSchemaDataTransfer
101
     * @param \Generated\Shared\Transfer\PathSchemaDataTransfer $errorSchemaDataTransfer
102
     * @param \Generated\Shared\Transfer\PathSchemaDataTransfer|null $responseSchemaDataTransfer
103
     *
104
     * @return void
105
     */
106
    public function addPostPath(
107
        PathMethodDataTransfer $pathMethodDataTransfer,
108
        PathSchemaDataTransfer $requestSchemaDataTransfer,
109
        PathSchemaDataTransfer $errorSchemaDataTransfer,
110
        ?PathSchemaDataTransfer $responseSchemaDataTransfer
111
    ): void {
112
        if (!$responseSchemaDataTransfer) {
113
            $responseSchemaDataTransfer = new PathSchemaDataTransfer();
114
        }
115
        $responseSchemaDataTransfer = $this->addDefaultSuccessResponseToResponseSchemaDataTransfer(
116
            $pathMethodDataTransfer,
117
            $responseSchemaDataTransfer,
118
            (string)Response::HTTP_CREATED,
119
        );
120
        if ($responseSchemaDataTransfer) {
0 ignored issues
show
$responseSchemaDataTransfer is of type Generated\Shared\Transfer\PathSchemaDataTransfer, thus it always evaluated to true.
Loading history...
121
            $pathMethodDataTransfer->addResponseSchema($responseSchemaDataTransfer);
122
        }
123
124
        $errorSchemaDataTransfer = $this->addDefaultErrorToErrorSchemaDataTransfer($errorSchemaDataTransfer);
125
        $pathMethodDataTransfer->addResponseSchema($errorSchemaDataTransfer);
126
127
        $pathMethodDataTransfer->setMethod(strtolower(Request::METHOD_POST));
128
129
        if ($requestSchemaDataTransfer->getSchemaReference()) {
130
            $requestSchemaDataTransfer->setDescription(static::DESCRIPTION_DEFAULT_REQUEST);
131
            $pathMethodDataTransfer->setRequestSchema($requestSchemaDataTransfer);
132
        }
133
134
        $this->addPath($pathMethodDataTransfer);
135
    }
136
137
    /**
138
     * @param \Generated\Shared\Transfer\PathMethodDataTransfer $pathMethodDataTransfer
139
     * @param \Generated\Shared\Transfer\PathSchemaDataTransfer $requestSchemaDataTransfer
140
     * @param \Generated\Shared\Transfer\PathSchemaDataTransfer $errorSchemaDataTransfer
141
     * @param \Generated\Shared\Transfer\PathSchemaDataTransfer|null $responseSchemaDataTransfer
142
     *
143
     * @return void
144
     */
145
    public function addPatchPath(
146
        PathMethodDataTransfer $pathMethodDataTransfer,
147
        PathSchemaDataTransfer $requestSchemaDataTransfer,
148
        PathSchemaDataTransfer $errorSchemaDataTransfer,
149
        ?PathSchemaDataTransfer $responseSchemaDataTransfer
150
    ): void {
151
        if (!$responseSchemaDataTransfer) {
152
            $responseSchemaDataTransfer = new PathSchemaDataTransfer();
153
        }
154
155
        $responseSchemaDataTransfer = $this->addDefaultSuccessResponseToResponseSchemaDataTransfer(
156
            $pathMethodDataTransfer,
157
            $responseSchemaDataTransfer,
158
            (string)Response::HTTP_OK,
159
        );
160
        if ($responseSchemaDataTransfer) {
0 ignored issues
show
$responseSchemaDataTransfer is of type Generated\Shared\Transfer\PathSchemaDataTransfer, thus it always evaluated to true.
Loading history...
161
            $pathMethodDataTransfer->addResponseSchema($responseSchemaDataTransfer);
162
        }
163
164
        $errorSchemaDataTransfer = $this->addDefaultErrorToErrorSchemaDataTransfer($errorSchemaDataTransfer);
165
        $pathMethodDataTransfer->addResponseSchema($errorSchemaDataTransfer);
166
167
        $pathMethodDataTransfer->setMethod(strtolower(Request::METHOD_PATCH));
168
169
        if ($requestSchemaDataTransfer->getSchemaReference()) {
170
            $requestSchemaDataTransfer->setDescription(static::DESCRIPTION_DEFAULT_REQUEST);
171
            $pathMethodDataTransfer->setRequestSchema($requestSchemaDataTransfer);
172
        }
173
174
        $this->addPath($pathMethodDataTransfer);
175
    }
176
177
    /**
178
     * @param \Generated\Shared\Transfer\PathMethodDataTransfer $pathMethodDataTransfer
179
     * @param \Generated\Shared\Transfer\PathSchemaDataTransfer $errorSchemaDataTransfer
180
     *
181
     * @return void
182
     */
183
    public function addDeletePath(
184
        PathMethodDataTransfer $pathMethodDataTransfer,
185
        PathSchemaDataTransfer $errorSchemaDataTransfer
186
    ): void {
187
        $responseSchemaDataTransfer = $this->addDefaultSuccessResponseToResponseSchemaDataTransfer(
188
            $pathMethodDataTransfer,
189
            new PathSchemaDataTransfer(),
190
            (string)Response::HTTP_NO_CONTENT,
191
        );
192
        if ($responseSchemaDataTransfer) {
0 ignored issues
show
$responseSchemaDataTransfer is of type Generated\Shared\Transfer\PathSchemaDataTransfer, thus it always evaluated to true.
Loading history...
193
            $pathMethodDataTransfer->addResponseSchema($responseSchemaDataTransfer);
194
        }
195
196
        $errorSchemaDataTransfer = $this->addDefaultErrorToErrorSchemaDataTransfer($errorSchemaDataTransfer);
197
        $pathMethodDataTransfer->addResponseSchema($errorSchemaDataTransfer);
198
199
        $pathMethodDataTransfer->setMethod(strtolower(Request::METHOD_DELETE));
200
201
        $this->addPath($pathMethodDataTransfer);
202
    }
203
204
    /**
205
     * @param \Generated\Shared\Transfer\PathMethodDataTransfer $pathMethodDataTransfer
206
     *
207
     * @return void
208
     */
209
    protected function addPath(PathMethodDataTransfer $pathMethodDataTransfer): void
210
    {
211
        $this->paths = array_replace_recursive($this->paths, $this->pathMethodRenderer->render($pathMethodDataTransfer));
212
    }
213
214
    /**
215
     * @param \Generated\Shared\Transfer\PathMethodDataTransfer $pathMethodDataTransfer
216
     * @param string $defaultMethodStatusCode
217
     *
218
     * @return string
219
     */
220
    protected function getResponseStatusCode(PathMethodDataTransfer $pathMethodDataTransfer, string $defaultMethodStatusCode): string
221
    {
222
        return $pathMethodDataTransfer->getIsEmptyResponse() ? (string)Response::HTTP_NO_CONTENT : $defaultMethodStatusCode;
223
    }
224
225
    /**
226
     * @param \Generated\Shared\Transfer\PathSchemaDataTransfer $errorSchemaDataTransfer
227
     *
228
     * @return \Generated\Shared\Transfer\PathSchemaDataTransfer
229
     */
230
    protected function addDefaultErrorToErrorSchemaDataTransfer(PathSchemaDataTransfer $errorSchemaDataTransfer): PathSchemaDataTransfer
231
    {
232
        $errorSchemaDataTransfer->setCode(static::KEY_DEFAULT);
233
        $errorSchemaDataTransfer->setDescription(static::DESCRIPTION_DEFAULT_RESPONSE);
234
235
        return $errorSchemaDataTransfer;
236
    }
237
238
    /**
239
     * @param \Generated\Shared\Transfer\PathMethodDataTransfer $pathMethodDataTransfer
240
     * @param \Generated\Shared\Transfer\PathSchemaDataTransfer $responseSchemaDataTransfer
241
     * @param string $defaultResponseCode
242
     *
243
     * @return \Generated\Shared\Transfer\PathSchemaDataTransfer|null
244
     */
245
    protected function addDefaultSuccessResponseToResponseSchemaDataTransfer(
246
        PathMethodDataTransfer $pathMethodDataTransfer,
247
        PathSchemaDataTransfer $responseSchemaDataTransfer,
248
        string $defaultResponseCode
249
    ): ?PathSchemaDataTransfer {
250
        $pathSchemaDataTransfer = $this->getSuccessResponseSchema($pathMethodDataTransfer->getResponseSchemas());
251
252
        if ($pathSchemaDataTransfer) {
253
            if ($pathSchemaDataTransfer->getCode() !== Response::HTTP_NO_CONTENT) {
254
                $pathSchemaDataTransfer->setSchemaReference($responseSchemaDataTransfer->getSchemaReference());
255
            }
256
257
            return null;
258
        }
259
260
        $responseStatusCode = $this->getResponseStatusCode($pathMethodDataTransfer, $defaultResponseCode);
261
        $responseSchemaDataTransfer->setCode($responseStatusCode);
262
        $responseSchemaDataTransfer->setDescription(static::DESCRIPTION_SUCCESSFUL_RESPONSE);
263
264
        return $responseSchemaDataTransfer;
265
    }
266
267
    /**
268
     * @param \ArrayObject<int, \Generated\Shared\Transfer\PathSchemaDataTransfer> $responseSchemas
269
     *
270
     * @return \Generated\Shared\Transfer\PathSchemaDataTransfer|null
271
     */
272
    protected function getSuccessResponseSchema(ArrayObject $responseSchemas): ?PathSchemaDataTransfer
273
    {
274
        foreach ($responseSchemas as $responseSchema) {
275
            $responseSchemaCode = (int)$responseSchema->getCode();
276
            if ($responseSchemaCode >= 200 && $responseSchemaCode < 300) {
277
                return $responseSchema;
278
            }
279
        }
280
281
        return null;
282
    }
283
}
284