Skip to content

Commit f5dfacd

Browse files
Refactor response handling with more flexible and concise error/success responses
- Simplify response structure by removing default status and message fields - Enhance error response with optional data and metadata support - Improve error handling to conditionally include stack traces based on environment - Add more flexible metadata and data handling in error responses - Remove redundant status fields and improve response consistency
1 parent 1e8e0c4 commit f5dfacd

1 file changed

Lines changed: 37 additions & 16 deletions

File tree

src/workflows_cdk/core/responses.py

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,18 @@ class Response:
1616

1717
# Cache environment check
1818
_IS_PRODUCTION = os.getenv("ENVIRONMENT", "").lower() == "prod"
19+
1920

2021
@classmethod
2122
def success(
2223
cls,
2324
data: Any = None,
24-
message: str = "Success",
2525
metadata: Optional[Dict[str, Any]] = None,
2626
status_code: int = 200
2727
) -> FlaskResponse:
2828
"""Create a success response."""
2929
response_data = {
30-
"status": "success",
31-
"message": message,
32-
"data": data
30+
"data": data,
3331
}
3432

3533
if metadata:
@@ -41,6 +39,8 @@ def success(
4139
def error(
4240
cls,
4341
error: Union[ManagedError, Exception, str],
42+
data: Optional[Dict[str, Any]] = None,
43+
metadata: Optional[Dict[str, Any]] = None,
4444
status_code: int = 400
4545
) -> FlaskResponse:
4646
"""Create an error response with environment-appropriate detail level."""
@@ -52,40 +52,61 @@ def error(
5252
import traceback
5353
stack_trace = traceback.format_exc()
5454

55+
if data:
56+
if isinstance(data, str):
57+
data = {"error": data}
58+
59+
if metadata:
60+
if isinstance(metadata, str):
61+
metadata = {"metadata": metadata}
62+
5563
# Base metadata
5664
base_metadata = {
5765
"timestamp": datetime.now().isoformat(),
5866
"environment": os.getenv("ENVIRONMENT", "development"),
5967
# "event_id": event_id,
60-
"stack_trace": stack_trace
68+
"stack_trace": stack_trace if not cls._IS_PRODUCTION else None,
69+
**(metadata or {})
6170
}
6271

6372
# Merge with error metadata if available
6473
metadata = base_metadata
6574
if isinstance(error, ManagedError) and error.metadata:
66-
metadata = {**base_metadata, **error.metadata}
75+
metadata = {**base_metadata, **(error.metadata or {})}
6776

6877
if isinstance(error, ManagedError):
69-
response_data = {
70-
"status": "error",
78+
response_data: Dict[str, Any] = {
7179
"error": str(error.error),
72-
"data": error.data,
73-
"metadata": metadata
7480
}
81+
if error.data:
82+
response_data["data"] = error.data
83+
if metadata:
84+
response_data["metadata"] = metadata
7585
elif isinstance(error, HTTPException):
7686
status_code = error.code or status_code
77-
response_data = {
78-
"status": "error",
87+
response_data: Dict[str, Any] = {
7988
"error": error.description,
8089
"data": {"code": error.code, "name": error.name},
81-
"metadata": metadata
8290
}
91+
if metadata:
92+
response_data["metadata"] = metadata
8393
else:
84-
response_data = {
85-
"status": "error",
94+
response_data: Dict[str, Any] = {
8695
"error": str(error),
8796
"data": {"error_type": type(error).__name__ if isinstance(error, Exception) else "string"},
88-
"metadata": metadata
8997
}
98+
if metadata:
99+
response_data["metadata"] = metadata
100+
101+
# Override with provided data and metadata if present
102+
if data:
103+
response_data["data"] = data if isinstance(data, dict) else {"error": data}
104+
elif "data" in response_data and not response_data["data"]:
105+
del response_data["data"]
106+
107+
if metadata:
108+
response_data["metadata"] = metadata if isinstance(metadata, dict) else {"metadata": metadata}
109+
elif "metadata" in response_data and not response_data["metadata"]:
110+
del response_data["metadata"]
90111

91112
return make_response(jsonify(response_data), status_code)

0 commit comments

Comments
 (0)