From bfc89459973b50da6fee053c827a28b907604206 Mon Sep 17 00:00:00 2001 From: zxstty Date: Mon, 20 Jan 2025 16:59:12 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E6=B5=81api=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/entities/collection.py | 50 ++++++++++++--- apps/entities/flow.py | 90 ++++++++++++++++----------- apps/entities/request_data.py | 18 +++--- apps/entities/response_data.py | 109 ++++++++++++++++++++++----------- apps/manager/flow.py | 27 ++++++++ apps/routers/flow.py | 76 +++++++++++++++-------- apps/service/flow.py | 3 + 7 files changed, 259 insertions(+), 114 deletions(-) create mode 100644 apps/manager/flow.py create mode 100644 apps/service/flow.py diff --git a/apps/entities/collection.py b/apps/entities/collection.py index 9b1e08ed7..c24d5ea14 100644 --- a/apps/entities/collection.py +++ b/apps/entities/collection.py @@ -23,7 +23,8 @@ class Blacklist(BaseModel): is_audited: bool = False reason_type: list[str] = [] reason: Optional[str] = None - updated_at: float = Field(default_factory=lambda: round(datetime.now(tz=timezone.utc).timestamp(), 3)) + updated_at: float = Field(default_factory=lambda: round( + datetime.now(tz=timezone.utc).timestamp(), 3)) class UserDomainData(BaseModel): @@ -41,7 +42,8 @@ class User(BaseModel): """ id: str = Field(alias="_id") - last_login: float = Field(default_factory=lambda: round(datetime.now(tz=timezone.utc).timestamp(), 3)) + last_login: float = Field(default_factory=lambda: round( + datetime.now(tz=timezone.utc).timestamp(), 3)) is_active: bool = False is_whitelisted: bool = False credit: int = 100 @@ -61,7 +63,8 @@ class Conversation(BaseModel): id: str = Field(default_factory=lambda: str(uuid.uuid4()), alias="_id") user_sub: str title: str = NEW_CHAT - created_at: float = Field(default_factory=lambda: round(datetime.now(tz=timezone.utc).timestamp(), 3)) + created_at: float = Field(default_factory=lambda: round( + datetime.now(tz=timezone.utc).timestamp(), 3)) tasks: list[str] = [] unused_docs: list[str] = [] record_groups: list[str] = [] @@ -78,7 +81,8 @@ class Document(BaseModel): name: str type: str size: float - created_at: float = Field(default_factory=lambda: round(datetime.now(tz=timezone.utc).timestamp(), 3)) + created_at: float = Field(default_factory=lambda: round( + datetime.now(tz=timezone.utc).timestamp(), 3)) conversation_id: str @@ -91,7 +95,8 @@ class Audit(BaseModel): id: str = Field(default_factory=lambda: str(uuid.uuid4()), alias="_id") user_sub: Optional[str] = None http_method: str - created_at: float = Field(default_factory=lambda: round(datetime.now(tz=timezone.utc).timestamp(), 3)) + created_at: float = Field(default_factory=lambda: round( + datetime.now(tz=timezone.utc).timestamp(), 3)) module: str client_ip: Optional[str] = None message: str @@ -121,7 +126,8 @@ class RecordComment(BaseModel): feedback_type: list[str] feedback_link: str feedback_content: str - feedback_time: float = Field(default_factory=lambda: round(datetime.now(tz=timezone.utc).timestamp(), 3)) + feedback_time: float = Field(default_factory=lambda: round( + datetime.now(tz=timezone.utc).timestamp(), 3)) class Record(BaseModel): @@ -131,11 +137,13 @@ class Record(BaseModel): user_sub: str data: str key: dict[str, Any] = {} - flow: list[str] = Field(description="[运行后修改]与Record关联的FlowHistory的ID", default=[]) + flow: list[str] = Field( + description="[运行后修改]与Record关联的FlowHistory的ID", default=[]) facts: list[str] = Field(description="[运行后修改]与Record关联的事实信息", default=[]) comment: Optional[RecordComment] = None metadata: Optional[RecordMetadata] = None - created_at: float = Field(default_factory=lambda: round(datetime.now(tz=timezone.utc).timestamp(), 3)) + created_at: float = Field(default_factory=lambda: round( + datetime.now(tz=timezone.utc).timestamp(), 3)) class RecordGroupDocument(BaseModel): @@ -159,7 +167,8 @@ class RecordGroup(BaseModel): docs: list[RecordGroupDocument] = [] # 问题不变,所用到的文档不变 conversation_id: str task_id: str - created_at: float = Field(default_factory=lambda: round(datetime.now(tz=timezone.utc).timestamp(), 3)) + created_at: float = Field(default_factory=lambda: round( + datetime.now(tz=timezone.utc).timestamp(), 3)) class Domain(BaseModel): @@ -171,28 +180,49 @@ class Domain(BaseModel): id: str = Field(default_factory=lambda: str(uuid.uuid4()), alias="_id") name: str definition: str - updated_at: float = Field(default_factory=lambda: round(datetime.now(tz=timezone.utc).timestamp(), 3)) + updated_at: float = Field(default_factory=lambda: round( + datetime.now(tz=timezone.utc).timestamp(), 3)) + + class NodeMetaData(BaseModel): """节点元数据""" pass + + class ServiceNodeMetaDatas(BaseModel): """节点原数据""" pass + + class Position(BaseModel): """前端相对位置""" pass + + class Flow(BaseModel): """流的拓扑数据""" pass + + class Branch(BaseModel): """节点分支信息""" pass + + class Dependency(BaseModel): """节点伴生关系""" pass + + class Node(BaseModel): """流拓扑中的节点数据""" pass + + class Edge(BaseModel): """流拓扑中的边信息""" pass + +class Parameter(BaseModel): + """"节点的配置参数""" + pass \ No newline at end of file diff --git a/apps/entities/flow.py b/apps/entities/flow.py index 109c9e07f..fe7fc79a7 100644 --- a/apps/entities/flow.py +++ b/apps/entities/flow.py @@ -75,7 +75,8 @@ class CallMetadata(BaseModel): key: call """ - id: str = Field(alias="_id", description="Call的ID", default_factory=lambda: str(uuid.uuid4())) + id: str = Field(alias="_id", description="Call的ID", + default_factory=lambda: str(uuid.uuid4())) type: CallType = Field(description="Call的类型") name: str = Field(description="Call的名称") description: str = Field(description="Call的描述") @@ -114,10 +115,14 @@ class ServiceApiAuthKeyVal(BaseModel): class ServiceApiAuth(BaseModel): """Service的API鉴权方式""" - header: list[ServiceApiAuthKeyVal] = Field(description="HTTP头鉴权配置", default=[]) - cookie: list[ServiceApiAuthKeyVal] = Field(description="HTTP Cookie鉴权配置", default=[]) - query: list[ServiceApiAuthKeyVal] = Field(description="HTTP URL参数鉴权配置", default=[]) - oidc: Optional[ServiceApiAuthOidc] = Field(description="OIDC鉴权配置", default=None) + header: list[ServiceApiAuthKeyVal] = Field( + description="HTTP头鉴权配置", default=[]) + cookie: list[ServiceApiAuthKeyVal] = Field( + description="HTTP Cookie鉴权配置", default=[]) + query: list[ServiceApiAuthKeyVal] = Field( + description="HTTP URL参数鉴权配置", default=[]) + oidc: Optional[ServiceApiAuthOidc] = Field( + description="OIDC鉴权配置", default=None) class ServiceApiConfig(BaseModel): @@ -144,7 +149,8 @@ class AppLink(BaseModel): class AppPermission(BaseModel): """App的权限配置""" - type: AppPermissionType = Field(description="权限类型", default=AppPermissionType.PRIVATE) + type: AppPermissionType = Field( + description="权限类型", default=AppPermissionType.PRIVATE) users: list[str] = Field(description="可访问的用户列表", default=[]) @@ -155,7 +161,8 @@ class AppMetadata(MetadataBase): links: list[AppLink] = Field(description="相关链接", default=[]) first_questions: list[str] = Field(description="首次提问", default=[]) history_len: int = Field(description="对话轮次", default=3, le=10) - permissions: Optional[AppPermission] = Field(description="应用权限配置", default=None) + permissions: Optional[AppPermission] = Field( + description="应用权限配置", default=None) class ServiceApiSpec(BaseModel): @@ -194,42 +201,53 @@ class App(BaseModel): class PositionItem(BaseModel): """请求/响应中的前端相对位置变量类""" - x:float - y:float + x: float + y: float + + class FlowItem(BaseModel): """请求/响应中的流变量类""" - flow_id:str=Optional[Field](alias="flowId") - name:str - description:str - enable:bool - created_at: str= Field(alias="createdAt") + flow_id: str = Field(alias="flowId") + name: str + description: str + enable: bool + editable: bool + created_at: str = Field(alias="createdAt") + + class BranchItem(BaseModel): """请求/响应中的节点分支变量类""" - branch_id:str=Field(alias="branchId") - type:str - description:str + branch_id: str = Field(alias="branchId") + type: str + description: str + + class DependencyItem(BaseModel): """请求/响应中的节点依赖变量类""" - node_id:str=Field(alias="nodeId") - type:str + node_id: str = Field(alias="nodeId") + type: str + + class NodeItem(BaseModel): """请求/响应中的节点变量类""" - node_id:str=Field(alias="nodeId") - api_id:str=Field(alias="apiId") - name:str - type:str - description:str - enable:str - branches:list[BranchItem] - depedency:DependencyItem - position:PositionItem - editable:bool - created_at: str= Field(alias="createdAt") + node_id: str = Field(alias="nodeId") + api_id: str = Field(alias="apiId") + name: str + type: str + description: str + enable: str + branches: list[BranchItem] + depedency: DependencyItem + position: PositionItem + editable: bool + created_at: str = Field(alias="createdAt") + + class EdgeItem(BaseModel): """请求/响应中的边变量类""" - egde_id:str=Field(alias="edgeId") - source_node:str=Field(alias="sourceNode") - target_node:str=Field(alias="targetNode") - type:str - branch_id:str=Field(alias="branchId") - created_at: str= Field(alias="createdAt") \ No newline at end of file + edge_id: str = Field(alias="edgeId") + source_node: str = Field(alias="sourceNode") + target_node: str = Field(alias="targetNode") + type: str + branch_id: str = Field(alias="branchId") + created_at: str = Field(alias="createdAt") diff --git a/apps/entities/request_data.py b/apps/entities/request_data.py index 10bc63d6c..20bdfcb58 100644 --- a/apps/entities/request_data.py +++ b/apps/entities/request_data.py @@ -7,7 +7,8 @@ from typing import Optional from pydantic import BaseModel, Field from apps.entities.task import RequestDataPlugin -from apps.entities.flow import PositionItem,FlowItem,NodeItem,EdgeItem +from apps.entities.flow import PositionItem, FlowItem, NodeItem, EdgeItem + class RequestDataFeatures(BaseModel): """POST /api/chat的features字段数据""" @@ -100,13 +101,16 @@ class PostKnowledgeIDData(BaseModel): kb_id: str + class PutFlowReq(BaseModel): """创建/修改流拓扑结构""" - flow_id:Optional[str]=Field(alias="flowId") - flow:FlowItem - nodes:list[NodeItem] - edges:list[EdgeItem] - focus_point:PositionItem=Field(alias="focusPoint") + flow_id: Optional[str] = Field(alias="flowId") + flow: FlowItem + nodes: list[NodeItem] + edges: list[EdgeItem] + focus_point: PositionItem = Field(alias="focusPoint") + + class PutNodeParameterReq: """修改节点的参数""" - content:str \ No newline at end of file + content: str diff --git a/apps/entities/response_data.py b/apps/entities/response_data.py index 515a6f6a3..a7942934b 100644 --- a/apps/entities/response_data.py +++ b/apps/entities/response_data.py @@ -6,11 +6,12 @@ from typing import Any, Optional from pydantic import BaseModel, Field -from apps.entities.collection import Blacklist, Document,NodeMetaData +from apps.entities.collection import Blacklist, Document, NodeMetaData from apps.entities.enum_var import DocumentStatus from apps.entities.plugin import PluginData from apps.entities.record import RecordData -from apps.entities.flow import PositionItem,FlowItem,NodeItem,EdgeItem +from apps.entities.flow import PositionItem, FlowItem, NodeItem, EdgeItem + class ResponseData(BaseModel): """基础返回数据结构""" @@ -56,6 +57,7 @@ class PostClientSessionRsp(ResponseData): result: PostClientSessionMsg + class AuthUserMsg(BaseModel): """GET /api/auth/user Result数据结构""" @@ -74,11 +76,13 @@ class HealthCheckRsp(BaseModel): status: str + class GetPluginListMsg(BaseModel): """GET /api/plugin Result数据结构""" plugins: list[PluginData] + class GetPluginListRsp(ResponseData): """GET /api/plugin 返回数据结构""" @@ -117,6 +121,7 @@ class ConversationListItem(BaseModel): doc_count: int created_time: str + class ConversationListMsg(BaseModel): """GET /api/conversation Result数据结构""" @@ -140,6 +145,7 @@ class AddConversationRsp(ResponseData): result: AddConversationMsg + class UpdateConversationRsp(ResponseData): """POST /api/conversation 返回数据结构""" @@ -151,6 +157,7 @@ class RecordListMsg(BaseModel): records: list[RecordData] + class RecordListRsp(ResponseData): """GET /api/record/{conversation_id} 返回数据结构""" @@ -202,6 +209,7 @@ class UploadDocumentMsg(BaseModel): documents: list[UploadDocumentMsgItem] + class UploadDocumentRsp(ResponseData): """POST /api/document/{conversation_id} 返回数据结构""" @@ -225,6 +233,7 @@ class GetKnowledgeIDMsg(BaseModel): kb_id: str + class GetKnowledgeIDRsp(ResponseData): """GET /api/knowledge 返回数据结构""" @@ -234,73 +243,101 @@ class GetKnowledgeIDRsp(ResponseData): class NodeMetaDataItem(BaseModel): """GET /api/flow/node/metadata 单个节点元数据结构""" api_id: str = Field(alias="apiId") - name:str - type:str - created_at: str= Field(alias="createdAt") + name: str + type: str + editable: bool + created_at: str = Field(alias="createdAt") + + class ServiceNodeMetaDatasItem(BaseModel): """GET /api/flow/node/metadata 服务与服务下节点元数据结构""" - service_id:str=Field(alias="serviceId") - name:str - type:str - node_meta_datas:list[NodeMetaDataItem]=Field(alias="nodeMetaData",default=[]) - created_at: str= Field(alias="createdAt") + service_id: str = Field(alias="serviceId") + name: str + type: str + node_meta_datas: list[NodeMetaDataItem] = Field( + alias="nodeMetaData", default=[]) + created_at: str = Field(alias="createdAt") + + class NodeMetaDataListMsg(ResponseData): - services:list[ServiceNodeMetaDatasItem] + total:int + services: list[ServiceNodeMetaDatasItem] + + class NodeMetaDataListRsp(ResponseData): """GET /api/flow/node/metadata 返回数据结构""" - result:NodeMetaDataListMsg + result: NodeMetaDataListMsg class FlowStructureGetMsg(BaseModel): """GET /api/flow/{flowId} result""" - flow:FlowItem - nodes:list[NodeItem] - edges:list[EdgeItem] - focus_point:PositionItem=Field(alias="focusPoint") + flow: FlowItem + nodes: list[NodeItem] + edges: list[EdgeItem] + focus_point: PositionItem = Field(alias="focusPoint") + class FlowStructureGetRsp(BaseModel): """GET /api/flow/{flowId} 返回数据结构""" - result:FlowStructureGetMsg + result: FlowStructureGetMsg + + class FlowStructurePutMsg(BaseModel): """PUT /api/flow result""" - flow_id:str=Field(alias="flowId") + flow_id: str = Field(alias="flowId") + + class FlowStructurePutRsp(ResponseData): """PUT /api/flow 返回数据结构""" - flow_id:str=Field(alias="flowId") + result: FlowStructurePutMsg + class FlowStructureDeleteMsg(BaseModel): """DELETE /api/flow/{flowId} result""" - flow_id:str=Field(alias="flowId") + flow_id: str = Field(alias="flowId") + + class FlowStructureDeleteRsp(ResponseData): """DELETE /api/flow/{flowId} 返回数据结构""" - flow_id:str=Field(alias="flowId") + result: FlowStructureDeleteMsg + class NodeParameterItem(BaseModel): - parameter_id:str=Field(alias="parameterId") - content:str - updated_at: str= Field(alias="updatedAt") + parameter_id: str = Field(alias="parameterId") + content: str + updated_at: str = Field(alias="updatedAt") + + class NodeParameterGetMsg(BaseModel): """GET /api/flow/node/parameter result""" - node_id:str=Field(alias="nodeId") - parameter:NodeParameterItem + node_id: str = Field(alias="nodeId") + parameter: NodeParameterItem + + class NodeParameterGetRsp(ResponseData): """GET /api/flow/node/parameter 返回数据结构""" - result:NodeParameterGetMsg + result: NodeParameterGetMsg + + class NodeParameterListMsg(BaseModel): """GET /api/flow/node/parameter/history result""" - node_id:str=Field(alias="nodeId") - parameter_history:list[NodeParameterItem]=Field(alias="parameterHistory") + node_id: str = Field(alias="nodeId") + total:int + parameter_history: list[NodeParameterItem] = Field( + alias="parameterHistory") + + class NodeParameterListRsp(ResponseData): """GET /api/flow/node/parameter/history 返回数据结构""" - result:NodeParameterListMsg + result: NodeParameterListMsg + class NodeParameterPutMsg(BaseModel): """PUT /api/flow/node/parameter result""" - node_id:str=Field(alias="nodeId") - parameter_id:str=Field(alias="parameterId") -class NodeParameterPutRsp(ResponseData): - """PUT /api/flow/node/parameter 返回数据结构""" - result:NodeParameterPutMsg + node_id: str = Field(alias="nodeId") + parameter_id: str = Field(alias="parameterId") - \ No newline at end of file +class NodeParameterPutRsp(ResponseData): + """PUT /api/flow/node/parameter 返回数据结构""" + result: NodeParameterPutMsg diff --git a/apps/manager/flow.py b/apps/manager/flow.py new file mode 100644 index 000000000..9b7dd01fe --- /dev/null +++ b/apps/manager/flow.py @@ -0,0 +1,27 @@ +"""评论 Manager + +Copyright (c) Huawei Technologies Co., Ltd. 2023-2024. All rights reserved. +""" +from typing import Optional,Tuple,List + +from apps.constants import LOGGER +from apps.entities.collection import ServiceNodeMetaDatas,Flow,Edge,Node,Position,Parameter +from apps.models.mongo import MongoDB +class FlowManager: + async def validate_user_workflow_access(user_sub:str,flow_id:str,editable:bool)-> bool: + return True + async def get_service_node_medatas_by_user_id(user_sub:str)->Tuple[int,List[ServiceNodeMetaDatas]]: + pass + async def get_flow_by_flow_id()->Tuple[Flow,List[Node],List[Edge],Position]: + pass + async def update_flow_by_flow_id(flow:Flow,nodes:List[Node],edges:List[Edge],focus_point:Position)->str: + pass + async def delete_flow_by_flow_id(flow_id:str)->str: + pass + async def get_node_latest_parameter_by_flow_id_and_node_id(flow_id:str,node_id:str)->Parameter: + pass + async def update_node_latest_parameter_by_flow_id_and_node_id(flow_id:str,node_id:str,content:str)->Parameter: + pass + async def get_node_parameter_history_by_flow_id_and_node_id(flow_id:str,node_id:str,page:int,page_size:int)->List[Parameter]: + pass + diff --git a/apps/routers/flow.py b/apps/routers/flow.py index 592b550ca..08dba801e 100644 --- a/apps/routers/flow.py +++ b/apps/routers/flow.py @@ -2,14 +2,16 @@ Copyright (c) Huawei Technologies Co., Ltd. 2023-2024. All rights reserved. """ -from fastapi import APIRouter, Depends, status,Path,Query,Body +from fastapi import APIRouter, Depends, status, Path, Query, Body from fastapi.responses import JSONResponse +from typing import Annotated from apps.dependency.csrf import verify_csrf_token from apps.dependency.user import verify_user -from apps.entities.request_data import PutFlowReq,PutNodeParameterReq -from apps.entities.response_data import NodeMetaDataListRsp,FlowStructureGetRsp,FlowStructurePutRsp,\ - FlowStructureDeleteRsp,NodeParameterGetRsp,NodeParameterListRsp,NodeParameterPutRsp +from apps.dependency import get_user +from apps.entities.request_data import PutFlowReq, PutNodeParameterReq +from apps.entities.response_data import NodeMetaDataListRsp, FlowStructureGetRsp, FlowStructurePutRsp, \ + FlowStructureDeleteRsp, NodeParameterGetRsp, NodeParameterListRsp, NodeParameterPutRsp from apps.manager.domain import DomainManager router = APIRouter( @@ -22,43 +24,67 @@ router = APIRouter( ) -@router.get("/node/metadata",response_model=NodeMetaDataListRsp) -async def get_node_metadatas(page:int =Query(...), - page_size:int =Query(...,alias="pageSize")): # noqa: ANN201 +@router.get("/node/metadata", response_model=NodeMetaDataListRsp) +async def get_node_metadatas( + user_sub: Annotated[str, Depends(get_user)], + page: int = Query(...), + page_size: int = Query(..., alias="pageSize"), + ): # noqa: ANN201 """获取节点元数据""" pass + @router.get("/{flowId}", response_model=FlowStructureGetRsp) -async def get_flow(flowId: str = Path(..., title="流的id")): - flow_id=flowId +async def get_flow( + user_sub: Annotated[str, Depends(get_user)], + flowId: str = Path(..., title="流的id") + ): + flow_id = flowId pass + @router.put("", response_model=FlowStructurePutRsp) -async def put_flow(flow_id:str = Query(..., alias="flowId"), - put_body: PutFlowReq=Body(...)): +async def put_flow( + user_sub: Annotated[str, Depends(get_user)], + flow_id: str = Query(..., alias="flowId"), + put_body: PutFlowReq = Body(...)): pass + @router.delete("/{flowId}", response_model=FlowStructureDeleteRsp) -async def delte_flow(flowId: str = Path(..., title="流的id")): - flow_id=flowId +async def delte_flow( + user_sub: Annotated[str, Depends(get_user)], + flowId: str = Path(..., title="流的id") + ): + flow_id = flowId pass + @router.get("/node/parameter", response_model=NodeParameterGetRsp) -async def get_node_parameter(flow_id:str = Query(..., alias="flowId"), - node_id:str = Query(..., alias="nodeId")): +async def get_node_parameter(user_sub: Annotated[str, Depends(get_user)], + flow_id: str = Query(..., alias="flowId"), + node_id: str = Query(..., alias="nodeId")): pass + + @router.get("/node/parameter/history", response_model=NodeParameterListRsp) -async def get_node_parameter_history(flow_id:str = Query(..., alias="flowId"), - node_id:str = Query(..., alias="nodeId"), - start_time:str = Query(..., alias="startTime"), - end_time:str = Query(..., alias="endTime"), - page:int =Query(...), - page_size:int =Query(...,alias="pageSize"), +async def get_node_parameter_history(user_sub: Annotated[str, Depends(get_user)], + flow_id: str = Query(..., alias="flowId"), + node_id: str = Query(..., alias="nodeId"), + start_time: str = Query(..., + alias="startTime"), + end_time: str = Query(..., + alias="endTime"), + page: int = Query(...), + page_size: int = Query(..., + alias="pageSize"), ): pass + + @router.put("/node/parameter", response_model=NodeParameterPutRsp) -async def put_node_parameter(flow_id:str = Query(..., alias="flowId"), - node_id:str = Query(..., alias="nodeId"), - put_body:PutNodeParameterReq=Body(...)): +async def put_node_parameter(user_sub: Annotated[str, Depends(get_user)], + flow_id: str = Query(..., alias="flowId"), + node_id: str = Query(..., alias="nodeId"), + put_body: PutNodeParameterReq = Body(...)): pass - diff --git a/apps/service/flow.py b/apps/service/flow.py new file mode 100644 index 000000000..0c7e39e24 --- /dev/null +++ b/apps/service/flow.py @@ -0,0 +1,3 @@ + +class FlowService: + pass \ No newline at end of file -- Gitee From 7a4ffb2e81b7637eaadada55a5fb2bc5db0994fd Mon Sep 17 00:00:00 2001 From: zxstty Date: Mon, 20 Jan 2025 22:23:03 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B5=81=E7=9B=B8?= =?UTF-8?q?=E5=85=B3api=E5=92=8Creq=E5=92=8Cres?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/entities/collection.py | 44 ------------------ apps/entities/flow.py | 54 --------------------- apps/entities/flow_topology.py | 77 ++++++++++++++++++++++++++++++ apps/entities/request_data.py | 2 +- apps/entities/response_data.py | 85 +++++++--------------------------- apps/manager/flow.py | 28 +++++------ apps/routers/flow.py | 74 +++++++++++------------------ 7 files changed, 138 insertions(+), 226 deletions(-) create mode 100644 apps/entities/flow_topology.py diff --git a/apps/entities/collection.py b/apps/entities/collection.py index c24d5ea14..6aadb066a 100644 --- a/apps/entities/collection.py +++ b/apps/entities/collection.py @@ -182,47 +182,3 @@ class Domain(BaseModel): definition: str updated_at: float = Field(default_factory=lambda: round( datetime.now(tz=timezone.utc).timestamp(), 3)) - - -class NodeMetaData(BaseModel): - """节点元数据""" - pass - - -class ServiceNodeMetaDatas(BaseModel): - """节点原数据""" - pass - - -class Position(BaseModel): - """前端相对位置""" - pass - - -class Flow(BaseModel): - """流的拓扑数据""" - pass - - -class Branch(BaseModel): - """节点分支信息""" - pass - - -class Dependency(BaseModel): - """节点伴生关系""" - pass - - -class Node(BaseModel): - """流拓扑中的节点数据""" - pass - - -class Edge(BaseModel): - """流拓扑中的边信息""" - pass - -class Parameter(BaseModel): - """"节点的配置参数""" - pass \ No newline at end of file diff --git a/apps/entities/flow.py b/apps/entities/flow.py index fe7fc79a7..03b379be1 100644 --- a/apps/entities/flow.py +++ b/apps/entities/flow.py @@ -197,57 +197,3 @@ class App(BaseModel): name: str description: str dir_path: str - - -class PositionItem(BaseModel): - """请求/响应中的前端相对位置变量类""" - x: float - y: float - - -class FlowItem(BaseModel): - """请求/响应中的流变量类""" - flow_id: str = Field(alias="flowId") - name: str - description: str - enable: bool - editable: bool - created_at: str = Field(alias="createdAt") - - -class BranchItem(BaseModel): - """请求/响应中的节点分支变量类""" - branch_id: str = Field(alias="branchId") - type: str - description: str - - -class DependencyItem(BaseModel): - """请求/响应中的节点依赖变量类""" - node_id: str = Field(alias="nodeId") - type: str - - -class NodeItem(BaseModel): - """请求/响应中的节点变量类""" - node_id: str = Field(alias="nodeId") - api_id: str = Field(alias="apiId") - name: str - type: str - description: str - enable: str - branches: list[BranchItem] - depedency: DependencyItem - position: PositionItem - editable: bool - created_at: str = Field(alias="createdAt") - - -class EdgeItem(BaseModel): - """请求/响应中的边变量类""" - edge_id: str = Field(alias="edgeId") - source_node: str = Field(alias="sourceNode") - target_node: str = Field(alias="targetNode") - type: str - branch_id: str = Field(alias="branchId") - created_at: str = Field(alias="createdAt") diff --git a/apps/entities/flow_topology.py b/apps/entities/flow_topology.py new file mode 100644 index 000000000..2e9c6849f --- /dev/null +++ b/apps/entities/flow_topology.py @@ -0,0 +1,77 @@ +import uuid +from typing import Optional + +from pydantic import BaseModel, Field + + +class ServiceItem(BaseModel): + """元数据归属的服务类""" + service_id: str = Field(alias="serviceId") + name: str + type: str + created_at: str = Field(alias="createdAt") + + +class NodeMetaDataItem(BaseModel): + """节点元数据类""" + api_id: str = Field(alias="apiId") + name: str + type: str + parametersTemplate: str + editable: str + created_at: str = Field(alias="createdAt") + + +class PositionItem(BaseModel): + """请求/响应中的前端相对位置变量类""" + x: float + y: float + + +class FlowItem(BaseModel): + """请求/响应中的流变量类""" + flow_id: Optional[str] = Field(alias="flowId") + name: str + description: str + enable: bool + editable: bool + created_at: str = Field(alias="createdAt") + + +class BranchItem(BaseModel): + """请求/响应中的节点分支变量类""" + branch_id: str = Field(alias="branchId") + type: str + description: str + + +class DependencyItem(BaseModel): + """请求/响应中的节点依赖变量类""" + node_id: str = Field(alias="nodeId") + type: str + + +class NodeItem(BaseModel): + """请求/响应中的节点变量类""" + node_id: str = Field(alias="nodeId") + api_id: str = Field(alias="apiId") + name: str + type: str + description: str + enable: str + parameters: str + branches: list[BranchItem] + depedency: DependencyItem + position: PositionItem + editable: bool + created_at: str = Field(alias="createdAt") + + +class EdgeItem(BaseModel): + """请求/响应中的边变量类""" + edge_id: str = Field(alias="edgeId") + source_node: str = Field(alias="sourceNode") + target_node: str = Field(alias="targetNode") + type: str + branch_id: str = Field(alias="branchId") + created_at: str = Field(alias="createdAt") diff --git a/apps/entities/request_data.py b/apps/entities/request_data.py index 20bdfcb58..7c113c449 100644 --- a/apps/entities/request_data.py +++ b/apps/entities/request_data.py @@ -7,7 +7,7 @@ from typing import Optional from pydantic import BaseModel, Field from apps.entities.task import RequestDataPlugin -from apps.entities.flow import PositionItem, FlowItem, NodeItem, EdgeItem +from apps.entities.flow_topology import PositionItem, FlowItem, NodeItem, EdgeItem class RequestDataFeatures(BaseModel): diff --git a/apps/entities/response_data.py b/apps/entities/response_data.py index a7942934b..f392eccff 100644 --- a/apps/entities/response_data.py +++ b/apps/entities/response_data.py @@ -6,11 +6,11 @@ from typing import Any, Optional from pydantic import BaseModel, Field -from apps.entities.collection import Blacklist, Document, NodeMetaData +from apps.entities.collection import Blacklist, Document from apps.entities.enum_var import DocumentStatus from apps.entities.plugin import PluginData from apps.entities.record import RecordData -from apps.entities.flow import PositionItem, FlowItem, NodeItem, EdgeItem +from apps.entities.flow_topology import ServiceItem, NodeMetaDataItem, PositionItem, FlowItem, NodeItem, EdgeItem class ResponseData(BaseModel): @@ -240,45 +240,37 @@ class GetKnowledgeIDRsp(ResponseData): result: GetKnowledgeIDMsg -class NodeMetaDataItem(BaseModel): - """GET /api/flow/node/metadata 单个节点元数据结构""" - api_id: str = Field(alias="apiId") - name: str - type: str - editable: bool - created_at: str = Field(alias="createdAt") +class NodeServiceListMsg(BaseModel): + """GET /api/flow/service result""" + total: int + services: list[ServiceItem] -class ServiceNodeMetaDatasItem(BaseModel): - """GET /api/flow/node/metadata 服务与服务下节点元数据结构""" - service_id: str = Field(alias="serviceId") - name: str - type: str - node_meta_datas: list[NodeMetaDataItem] = Field( - alias="nodeMetaData", default=[]) - created_at: str = Field(alias="createdAt") +class NodeServiceListRsp(ResponseData): + """GET /api/flow/service 返回数据结构""" + result: NodeServiceListMsg -class NodeMetaDataListMsg(ResponseData): - total:int - services: list[ServiceNodeMetaDatasItem] +class NodeMetaDataListMsg(BaseModel): + """GET /api/flow/service/node result""" + node_meta_datas: list[NodeMetaDataItem] class NodeMetaDataListRsp(ResponseData): - """GET /api/flow/node/metadata 返回数据结构""" + """GET /api/flow/service/node 返回数据结构""" result: NodeMetaDataListMsg class FlowStructureGetMsg(BaseModel): - """GET /api/flow/{flowId} result""" + """GET /api/flow result""" flow: FlowItem - nodes: list[NodeItem] edges: list[EdgeItem] - focus_point: PositionItem = Field(alias="focusPoint") + nodes: list[NodeItem] + focus_point: PositionItem -class FlowStructureGetRsp(BaseModel): - """GET /api/flow/{flowId} 返回数据结构""" +class FlowStructureGetRsp(ResponseData): + """GET /api/flow 返回数据结构""" result: FlowStructureGetMsg @@ -300,44 +292,3 @@ class FlowStructureDeleteMsg(BaseModel): class FlowStructureDeleteRsp(ResponseData): """DELETE /api/flow/{flowId} 返回数据结构""" result: FlowStructureDeleteMsg - - -class NodeParameterItem(BaseModel): - parameter_id: str = Field(alias="parameterId") - content: str - updated_at: str = Field(alias="updatedAt") - - -class NodeParameterGetMsg(BaseModel): - """GET /api/flow/node/parameter result""" - node_id: str = Field(alias="nodeId") - parameter: NodeParameterItem - - -class NodeParameterGetRsp(ResponseData): - """GET /api/flow/node/parameter 返回数据结构""" - result: NodeParameterGetMsg - - -class NodeParameterListMsg(BaseModel): - """GET /api/flow/node/parameter/history result""" - node_id: str = Field(alias="nodeId") - total:int - parameter_history: list[NodeParameterItem] = Field( - alias="parameterHistory") - - -class NodeParameterListRsp(ResponseData): - """GET /api/flow/node/parameter/history 返回数据结构""" - result: NodeParameterListMsg - - -class NodeParameterPutMsg(BaseModel): - """PUT /api/flow/node/parameter result""" - node_id: str = Field(alias="nodeId") - parameter_id: str = Field(alias="parameterId") - - -class NodeParameterPutRsp(ResponseData): - """PUT /api/flow/node/parameter 返回数据结构""" - result: NodeParameterPutMsg diff --git a/apps/manager/flow.py b/apps/manager/flow.py index 9b7dd01fe..4c29832da 100644 --- a/apps/manager/flow.py +++ b/apps/manager/flow.py @@ -2,26 +2,28 @@ Copyright (c) Huawei Technologies Co., Ltd. 2023-2024. All rights reserved. """ -from typing import Optional,Tuple,List +from typing import Optional, Tuple, List from apps.constants import LOGGER -from apps.entities.collection import ServiceNodeMetaDatas,Flow,Edge,Node,Position,Parameter +from apps.entities.flow_topology import ServiceItem, NodeMetaDataItem, FlowItem, NodeItem, EdgeItem, PositionItem from apps.models.mongo import MongoDB + + class FlowManager: - async def validate_user_workflow_access(user_sub:str,flow_id:str,editable:bool)-> bool: + async def validate_user_workflow_access(user_sub: str, app_id: str, editable: bool) -> bool: return True - async def get_service_node_medatas_by_user_id(user_sub:str)->Tuple[int,List[ServiceNodeMetaDatas]]: - pass - async def get_flow_by_flow_id()->Tuple[Flow,List[Node],List[Edge],Position]: - pass - async def update_flow_by_flow_id(flow:Flow,nodes:List[Node],edges:List[Edge],focus_point:Position)->str: - pass - async def delete_flow_by_flow_id(flow_id:str)->str: + + async def get_service_by_user_id(user_sub: str) -> Tuple[int, List[ServiceItem]]: pass - async def get_node_latest_parameter_by_flow_id_and_node_id(flow_id:str,node_id:str)->Parameter: + + async def get_node_meta_datas_by_user_id(user_sub: str) -> List[NodeMetaDataItem]: pass - async def update_node_latest_parameter_by_flow_id_and_node_id(flow_id:str,node_id:str,content:str)->Parameter: + + async def get_flow_by_app_and_flow_id(app_id: str, flow_id: str) -> Tuple[FlowItem, List[NodeItem], List[EdgeItem], PositionItem]: pass - async def get_node_parameter_history_by_flow_id_and_node_id(flow_id:str,node_id:str,page:int,page_size:int)->List[Parameter]: + + async def put_flow_by_app_and_flow_id(app_id: str, flow_id: str, flow: Tuple[FlowItem, List[NodeItem], List[EdgeItem], PositionItem]) -> str: pass + async def delete_flow_by_app_and_flow_id(flow_id: str) -> str: + pass diff --git a/apps/routers/flow.py b/apps/routers/flow.py index 08dba801e..a1c1cc3c7 100644 --- a/apps/routers/flow.py +++ b/apps/routers/flow.py @@ -10,8 +10,8 @@ from apps.dependency.csrf import verify_csrf_token from apps.dependency.user import verify_user from apps.dependency import get_user from apps.entities.request_data import PutFlowReq, PutNodeParameterReq -from apps.entities.response_data import NodeMetaDataListRsp, FlowStructureGetRsp, FlowStructurePutRsp, \ - FlowStructureDeleteRsp, NodeParameterGetRsp, NodeParameterListRsp, NodeParameterPutRsp +from apps.entities.response_data import NodeServiceListRsp, NodeMetaDataListRsp, FlowStructureGetRsp, \ + FlowStructurePutRsp, FlowStructureDeleteRsp from apps.manager.domain import DomainManager router = APIRouter( @@ -24,67 +24,47 @@ router = APIRouter( ) -@router.get("/node/metadata", response_model=NodeMetaDataListRsp) +@router.get("/service", response_model=NodeMetaDataListRsp) async def get_node_metadatas( - user_sub: Annotated[str, Depends(get_user)], - page: int = Query(...), - page_size: int = Query(..., alias="pageSize"), - ): # noqa: ANN201 - """获取节点元数据""" + user_sub: Annotated[str, Depends(get_user)], + page: int = Query(...), + page_size: int = Query(..., alias="pageSize"), +): + """获取节点数据所在服务的信息""" pass -@router.get("/{flowId}", response_model=FlowStructureGetRsp) +@router.get("/service/node", response_model=NodeMetaDataListRsp) async def get_flow( user_sub: Annotated[str, Depends(get_user)], - flowId: str = Path(..., title="流的id") - ): - flow_id = flowId + service_id: int = Query(..., alias="serviceId") +): pass -@router.put("", response_model=FlowStructurePutRsp) +@router.get("", response_model=FlowStructureGetRsp) async def put_flow( - user_sub: Annotated[str, Depends(get_user)], - flow_id: str = Query(..., alias="flowId"), - put_body: PutFlowReq = Body(...)): + user_sub: Annotated[str, Depends(get_user)], + app_id: str = Query(..., alias="appId"), + flow_id: str = Query(..., alias="flowId") +): pass -@router.delete("/{flowId}", response_model=FlowStructureDeleteRsp) +@router.put("", response_model=FlowStructurePutRsp) async def delte_flow( user_sub: Annotated[str, Depends(get_user)], - flowId: str = Path(..., title="流的id") - ): - flow_id = flowId - pass - - -@router.get("/node/parameter", response_model=NodeParameterGetRsp) -async def get_node_parameter(user_sub: Annotated[str, Depends(get_user)], - flow_id: str = Query(..., alias="flowId"), - node_id: str = Query(..., alias="nodeId")): + app_id: str = Query(..., alias="appId"), + flow_id: str = Query(..., alias="flowId"), + put_body: PutFlowReq = Body(...) +): pass -@router.get("/node/parameter/history", response_model=NodeParameterListRsp) -async def get_node_parameter_history(user_sub: Annotated[str, Depends(get_user)], - flow_id: str = Query(..., alias="flowId"), - node_id: str = Query(..., alias="nodeId"), - start_time: str = Query(..., - alias="startTime"), - end_time: str = Query(..., - alias="endTime"), - page: int = Query(...), - page_size: int = Query(..., - alias="pageSize"), - ): - pass - - -@router.put("/node/parameter", response_model=NodeParameterPutRsp) -async def put_node_parameter(user_sub: Annotated[str, Depends(get_user)], - flow_id: str = Query(..., alias="flowId"), - node_id: str = Query(..., alias="nodeId"), - put_body: PutNodeParameterReq = Body(...)): +@router.delete("", response_model=FlowStructureDeleteRsp) +async def delte_flow( + user_sub: Annotated[str, Depends(get_user)], + app_id: str = Query(..., alias="appId"), + flow_id: str = Query(..., alias="flowId") +): pass -- Gitee