1- from dataclasses import asdict
21from datetime import datetime , timezone
32from typing import Annotated
43from uuid import uuid4
1110from app .core .exceptions import IntegrationException
1211from app .core .tracing import EventAttributes , add_span_attributes
1312from app .core .utils import get_client_ip
14- from app .domain .enums .common import ErrorType
1513from app .domain .enums .events import EventType
1614from app .domain .enums .execution import ExecutionStatus
17- from app .domain .enums .storage import ExecutionErrorType
1815from app .domain .enums .user import UserRole
1916from app .infrastructure .kafka .events .base import BaseEvent
2017from app .infrastructure .kafka .events .metadata import EventMetadata
3128 ExecutionResponse ,
3229 ExecutionResult ,
3330 ResourceLimits ,
34- ResourceUsage ,
3531 RetryExecutionRequest ,
3632)
3733from app .schemas_pydantic .user import UserResponse
@@ -55,35 +51,7 @@ async def get_execution_with_access(
5551 if domain_exec .user_id and domain_exec .user_id != current_user .user_id and current_user .role != UserRole .ADMIN :
5652 raise HTTPException (status_code = 403 , detail = "Access denied" )
5753
58- # Map domain to Pydantic for dependency consumer
59- ru = None
60- if domain_exec .resource_usage is not None :
61- ru = ResourceUsage (** vars (domain_exec .resource_usage ))
62- # Map error_type to public ErrorType in API model via mapper rules
63- error_type = (
64- (
65- ErrorType .SCRIPT_ERROR
66- if domain_exec .error_type == ExecutionErrorType .SCRIPT_ERROR
67- else ErrorType .SYSTEM_ERROR
68- )
69- if domain_exec .error_type is not None
70- else None
71- )
72- return ExecutionInDB (
73- execution_id = domain_exec .execution_id ,
74- script = domain_exec .script ,
75- status = domain_exec .status ,
76- stdout = domain_exec .stdout ,
77- stderr = domain_exec .stderr ,
78- lang = domain_exec .lang ,
79- lang_version = domain_exec .lang_version ,
80- resource_usage = ru ,
81- user_id = domain_exec .user_id ,
82- exit_code = domain_exec .exit_code ,
83- error_type = error_type ,
84- created_at = domain_exec .created_at ,
85- updated_at = domain_exec .updated_at ,
86- )
54+ return ExecutionInDB .model_validate (domain_exec )
8755
8856
8957@router .post ("/execute" , response_model = ExecutionResponse )
@@ -269,24 +237,14 @@ async def retry_execution(
269237async def get_execution_events (
270238 execution : Annotated [ExecutionInDB , Depends (get_execution_with_access )],
271239 event_service : FromDishka [EventService ],
272- event_types : str | None = Query (None , description = "Comma-separated event types to filter" ),
240+ event_types : list [ EventType ] | None = Query (None , description = "Event types to filter" ),
273241 limit : int = Query (100 , ge = 1 , le = 1000 ),
274242) -> list [ExecutionEventResponse ]:
275243 """Get all events for an execution."""
276- event_type_list = None
277- if event_types :
278- event_type_list = [t .strip () for t in event_types .split ("," )]
279-
280244 events = await event_service .get_events_by_aggregate (
281- aggregate_id = execution .execution_id , event_types = event_type_list , limit = limit
245+ aggregate_id = execution .execution_id , event_types = event_types , limit = limit
282246 )
283-
284- return [
285- ExecutionEventResponse (
286- event_id = event .event_id , event_type = event .event_type , timestamp = event .timestamp , payload = event .payload
287- )
288- for event in events
289- ]
247+ return [ExecutionEventResponse .model_validate (e ) for e in events ]
290248
291249
292250@router .get ("/user/executions" , response_model = ExecutionListResponse )
@@ -337,7 +295,7 @@ async def get_k8s_resource_limits(
337295) -> ResourceLimits :
338296 try :
339297 limits = await execution_service .get_k8s_resource_limits ()
340- return ResourceLimits ( ** asdict ( limits ) )
298+ return ResourceLimits . model_validate ( limits )
341299 except Exception as e :
342300 raise HTTPException (status_code = 500 , detail = "Failed to retrieve resource limits" ) from e
343301
0 commit comments