From 03f91daa27cf2a468d7f439dbbe5b9baa71c11eb Mon Sep 17 00:00:00 2001 From: QuantumGhost Date: Tue, 3 Jun 2025 17:37:47 +0800 Subject: [PATCH] feat(api): implement PydanticModelEncoder for JSON serialization Use `PydanticModelEncoder` for JSON serialization while persisting node execution data. --- .../sqlalchemy_workflow_node_execution_repository.py | 9 ++++++--- api/libs/jsonutil.py | 11 +++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 api/libs/jsonutil.py diff --git a/api/core/repositories/sqlalchemy_workflow_node_execution_repository.py b/api/core/repositories/sqlalchemy_workflow_node_execution_repository.py index 8d916a19db..6c415b8ef8 100644 --- a/api/core/repositories/sqlalchemy_workflow_node_execution_repository.py +++ b/api/core/repositories/sqlalchemy_workflow_node_execution_repository.py @@ -19,6 +19,7 @@ from core.workflow.entities.node_execution_entities import ( ) from core.workflow.nodes.enums import NodeType from core.workflow.repository.workflow_node_execution_repository import OrderConfig, WorkflowNodeExecutionRepository +from libs.jsonutil import PydanticModelEncoder from models import ( Account, CreatorUserRole, @@ -161,9 +162,11 @@ class SQLAlchemyWorkflowNodeExecutionRepository(WorkflowNodeExecutionRepository) db_model.node_id = domain_model.node_id db_model.node_type = domain_model.node_type db_model.title = domain_model.title - db_model.inputs = json.dumps(domain_model.inputs) if domain_model.inputs else None - db_model.process_data = json.dumps(domain_model.process_data) if domain_model.process_data else None - db_model.outputs = json.dumps(domain_model.outputs) if domain_model.outputs else None + db_model.inputs = json.dumps(domain_model.inputs, cls=PydanticModelEncoder) if domain_model.inputs else None + db_model.process_data = ( + json.dumps(domain_model.process_data, cls=PydanticModelEncoder) if domain_model.process_data else None + ) + db_model.outputs = json.dumps(domain_model.outputs, cls=PydanticModelEncoder) if domain_model.outputs else None db_model.status = domain_model.status db_model.error = domain_model.error db_model.elapsed_time = domain_model.elapsed_time diff --git a/api/libs/jsonutil.py b/api/libs/jsonutil.py new file mode 100644 index 0000000000..fa29671034 --- /dev/null +++ b/api/libs/jsonutil.py @@ -0,0 +1,11 @@ +import json + +from pydantic import BaseModel + + +class PydanticModelEncoder(json.JSONEncoder): + def default(self, o): + if isinstance(o, BaseModel): + return o.model_dump() + else: + super().default(o)