|
37 | 37 | from aws_lambda_powertools.event_handler.openapi.types import (
|
38 | 38 | COMPONENT_REF_PREFIX,
|
39 | 39 | METHODS_WITH_BODY,
|
| 40 | + OpenAPIResponse, |
| 41 | + OpenAPIResponseContentModel, |
| 42 | + OpenAPIResponseContentSchema, |
40 | 43 | validation_error_definition,
|
41 | 44 | validation_error_response_definition,
|
42 | 45 | )
|
@@ -273,7 +276,7 @@ def __init__(
|
273 | 276 | cache_control: Optional[str],
|
274 | 277 | summary: Optional[str],
|
275 | 278 | description: Optional[str],
|
276 |
| - responses: Optional[Dict[int, Dict[str, Any]]], |
| 279 | + responses: Optional[Dict[int, OpenAPIResponse]], |
277 | 280 | response_description: Optional[str],
|
278 | 281 | tags: Optional[List[str]],
|
279 | 282 | operation_id: Optional[str],
|
@@ -303,7 +306,7 @@ def __init__(
|
303 | 306 | The OpenAPI summary for this route
|
304 | 307 | description: Optional[str]
|
305 | 308 | The OpenAPI description for this route
|
306 |
| - responses: Optional[Dict[int, Dict[str, Any]]] |
| 309 | + responses: Optional[Dict[int, OpenAPIResponse]] |
307 | 310 | The OpenAPI responses for this route
|
308 | 311 | response_description: Optional[str]
|
309 | 312 | The OpenAPI response description for this route
|
@@ -501,11 +504,54 @@ def _get_openapi_path(
|
501 | 504 |
|
502 | 505 | # Add the response to the OpenAPI operation
|
503 | 506 | if self.responses:
|
504 |
| - # If the user supplied responses, we use them and don't set a default 200 response |
| 507 | + for status_code in list(self.responses): |
| 508 | + response = self.responses[status_code] |
| 509 | + |
| 510 | + # Case 1: there is not 'content' key |
| 511 | + if "content" not in response: |
| 512 | + response["content"] = { |
| 513 | + "application/json": self._openapi_operation_return( |
| 514 | + param=dependant.return_param, |
| 515 | + model_name_map=model_name_map, |
| 516 | + field_mapping=field_mapping, |
| 517 | + ), |
| 518 | + } |
| 519 | + |
| 520 | + # Case 2: there is a 'content' key |
| 521 | + else: |
| 522 | + # Need to iterate to transform any 'model' into a 'schema' |
| 523 | + for content_type, payload in response["content"].items(): |
| 524 | + new_payload: OpenAPIResponseContentSchema |
| 525 | + |
| 526 | + # Case 2.1: the 'content' has a model |
| 527 | + if "model" in payload: |
| 528 | + from aws_lambda_powertools.event_handler.openapi.params import analyze_param |
| 529 | + |
| 530 | + return_field = analyze_param( |
| 531 | + param_name="return", |
| 532 | + annotation=cast(OpenAPIResponseContentModel, payload)["model"], |
| 533 | + value=None, |
| 534 | + is_path_param=False, |
| 535 | + is_response_param=True, |
| 536 | + ) |
| 537 | + |
| 538 | + new_payload = self._openapi_operation_return( |
| 539 | + param=return_field, |
| 540 | + model_name_map=model_name_map, |
| 541 | + field_mapping=field_mapping, |
| 542 | + ) |
| 543 | + |
| 544 | + # Case 2.2: the 'content' has a schema |
| 545 | + else: |
| 546 | + # Do nothing! We already have what we need! |
| 547 | + new_payload = payload |
| 548 | + |
| 549 | + response["content"][content_type] = new_payload |
| 550 | + |
505 | 551 | operation["responses"] = self.responses
|
506 | 552 | else:
|
507 | 553 | # Set the default 200 response
|
508 |
| - responses = operation.setdefault("responses", self.responses or {}) |
| 554 | + responses = operation.setdefault("responses", {}) |
509 | 555 | success_response = responses.setdefault(200, {})
|
510 | 556 | success_response["description"] = self.response_description or _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION
|
511 | 557 | success_response["content"] = {"application/json": {"schema": {}}}
|
@@ -682,7 +728,7 @@ def _openapi_operation_return(
|
682 | 728 | Tuple["ModelField", Literal["validation", "serialization"]],
|
683 | 729 | "JsonSchemaValue",
|
684 | 730 | ],
|
685 |
| - ) -> Dict[str, Any]: |
| 731 | + ) -> OpenAPIResponseContentSchema: |
686 | 732 | """
|
687 | 733 | Returns the OpenAPI operation return.
|
688 | 734 | """
|
@@ -832,7 +878,7 @@ def route(
|
832 | 878 | cache_control: Optional[str] = None,
|
833 | 879 | summary: Optional[str] = None,
|
834 | 880 | description: Optional[str] = None,
|
835 |
| - responses: Optional[Dict[int, Dict[str, Any]]] = None, |
| 881 | + responses: Optional[Dict[int, OpenAPIResponse]] = None, |
836 | 882 | response_description: str = _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
|
837 | 883 | tags: Optional[List[str]] = None,
|
838 | 884 | operation_id: Optional[str] = None,
|
@@ -890,7 +936,7 @@ def get(
|
890 | 936 | cache_control: Optional[str] = None,
|
891 | 937 | summary: Optional[str] = None,
|
892 | 938 | description: Optional[str] = None,
|
893 |
| - responses: Optional[Dict[int, Dict[str, Any]]] = None, |
| 939 | + responses: Optional[Dict[int, OpenAPIResponse]] = None, |
894 | 940 | response_description: str = _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
|
895 | 941 | tags: Optional[List[str]] = None,
|
896 | 942 | operation_id: Optional[str] = None,
|
@@ -943,7 +989,7 @@ def post(
|
943 | 989 | cache_control: Optional[str] = None,
|
944 | 990 | summary: Optional[str] = None,
|
945 | 991 | description: Optional[str] = None,
|
946 |
| - responses: Optional[Dict[int, Dict[str, Any]]] = None, |
| 992 | + responses: Optional[Dict[int, OpenAPIResponse]] = None, |
947 | 993 | response_description: str = _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
|
948 | 994 | tags: Optional[List[str]] = None,
|
949 | 995 | operation_id: Optional[str] = None,
|
@@ -997,7 +1043,7 @@ def put(
|
997 | 1043 | cache_control: Optional[str] = None,
|
998 | 1044 | summary: Optional[str] = None,
|
999 | 1045 | description: Optional[str] = None,
|
1000 |
| - responses: Optional[Dict[int, Dict[str, Any]]] = None, |
| 1046 | + responses: Optional[Dict[int, OpenAPIResponse]] = None, |
1001 | 1047 | response_description: str = _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
|
1002 | 1048 | tags: Optional[List[str]] = None,
|
1003 | 1049 | operation_id: Optional[str] = None,
|
@@ -1051,7 +1097,7 @@ def delete(
|
1051 | 1097 | cache_control: Optional[str] = None,
|
1052 | 1098 | summary: Optional[str] = None,
|
1053 | 1099 | description: Optional[str] = None,
|
1054 |
| - responses: Optional[Dict[int, Dict[str, Any]]] = None, |
| 1100 | + responses: Optional[Dict[int, OpenAPIResponse]] = None, |
1055 | 1101 | response_description: str = _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
|
1056 | 1102 | tags: Optional[List[str]] = None,
|
1057 | 1103 | operation_id: Optional[str] = None,
|
@@ -1104,7 +1150,7 @@ def patch(
|
1104 | 1150 | cache_control: Optional[str] = None,
|
1105 | 1151 | summary: Optional[str] = None,
|
1106 | 1152 | description: Optional[str] = None,
|
1107 |
| - responses: Optional[Dict[int, Dict[str, Any]]] = None, |
| 1153 | + responses: Optional[Dict[int, OpenAPIResponse]] = None, |
1108 | 1154 | response_description: str = _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
|
1109 | 1155 | tags: Optional[List[str]] = None,
|
1110 | 1156 | operation_id: Optional[str] = None,
|
@@ -1657,7 +1703,7 @@ def route(
|
1657 | 1703 | cache_control: Optional[str] = None,
|
1658 | 1704 | summary: Optional[str] = None,
|
1659 | 1705 | description: Optional[str] = None,
|
1660 |
| - responses: Optional[Dict[int, Dict[str, Any]]] = None, |
| 1706 | + responses: Optional[Dict[int, OpenAPIResponse]] = None, |
1661 | 1707 | response_description: str = _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
|
1662 | 1708 | tags: Optional[List[str]] = None,
|
1663 | 1709 | operation_id: Optional[str] = None,
|
@@ -2127,7 +2173,7 @@ def route(
|
2127 | 2173 | cache_control: Optional[str] = None,
|
2128 | 2174 | summary: Optional[str] = None,
|
2129 | 2175 | description: Optional[str] = None,
|
2130 |
| - responses: Optional[Dict[int, Dict[str, Any]]] = None, |
| 2176 | + responses: Optional[Dict[int, OpenAPIResponse]] = None, |
2131 | 2177 | response_description: Optional[str] = _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
|
2132 | 2178 | tags: Optional[List[str]] = None,
|
2133 | 2179 | operation_id: Optional[str] = None,
|
@@ -2216,7 +2262,7 @@ def route(
|
2216 | 2262 | cache_control: Optional[str] = None,
|
2217 | 2263 | summary: Optional[str] = None,
|
2218 | 2264 | description: Optional[str] = None,
|
2219 |
| - responses: Optional[Dict[int, Dict[str, Any]]] = None, |
| 2265 | + responses: Optional[Dict[int, OpenAPIResponse]] = None, |
2220 | 2266 | response_description: str = _DEFAULT_OPENAPI_RESPONSE_DESCRIPTION,
|
2221 | 2267 | tags: Optional[List[str]] = None,
|
2222 | 2268 | operation_id: Optional[str] = None,
|
|
0 commit comments