@@ -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