-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
本地组件保存 openai升级
- Loading branch information
Showing
8 changed files
with
196 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
from bisheng.api.errcode.base import BaseErrorCode | ||
|
||
|
||
# 组件模块 返回错误码,业务代码103 | ||
class ComponentExistError(BaseErrorCode): | ||
Code: int = 10300 | ||
Msg: str = '组件已存在' | ||
|
||
|
||
class ComponentNotExistError(BaseErrorCode): | ||
Code: int = 10301 | ||
Msg: str = '组件不存在' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
from typing import Any, List | ||
|
||
from bisheng.api.errcode.component import ComponentExistError, ComponentNotExistError | ||
from bisheng.api.v1.schemas import UnifiedResponseModel, resp_200 | ||
from bisheng.database.models.component import Component, ComponentDao | ||
|
||
|
||
class ComponentService: | ||
@classmethod | ||
def get_all_component(cls, user: Any) -> UnifiedResponseModel[List[Component]]: | ||
res = ComponentDao.get_user_components(user.get('user_id')) | ||
return resp_200(data=res) | ||
|
||
@classmethod | ||
def save_component(cls, component: Component) -> UnifiedResponseModel[Component]: | ||
exist_component = ComponentDao.get_component_by_name(component.user_id, component.name) | ||
if exist_component: | ||
return ComponentExistError.return_resp() | ||
component = ComponentDao.insert_component(component) | ||
return resp_200(data=component) | ||
|
||
@classmethod | ||
def update_component(cls, component: Component) -> UnifiedResponseModel[Component]: | ||
exist_component = ComponentDao.get_component_by_name(component.user_id, component.name) | ||
if not exist_component: | ||
return ComponentNotExistError.return_resp() | ||
exist_component.data = component.data | ||
exist_component.description = component.description | ||
component = ComponentDao.update_component(exist_component) | ||
return resp_200(data=component) | ||
|
||
@classmethod | ||
def delete_component(cls, user_id: int, name: str) -> UnifiedResponseModel[Component]: | ||
exist_component = ComponentDao.get_component_by_name(user_id, name) | ||
if not exist_component: | ||
return ComponentNotExistError.return_resp() | ||
component = ComponentDao.delete_component(exist_component) | ||
return resp_200(data=component) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
import json | ||
from typing import List | ||
|
||
from bisheng.api.services.component import ComponentService | ||
from bisheng.api.v1.schemas import CreateComponentReq, UnifiedResponseModel | ||
from bisheng.database.models.component import Component | ||
from fastapi import APIRouter, Body, Depends | ||
from fastapi_jwt_auth import AuthJWT | ||
|
||
router = APIRouter(prefix='/component', tags=['Component']) | ||
|
||
|
||
@router.get('', response_model=UnifiedResponseModel[List[Component]]) | ||
def get_all_components(*, | ||
Authorize: AuthJWT = Depends()): | ||
# get login user | ||
Authorize.jwt_required() | ||
current_user = json.loads(Authorize.get_jwt_subject()) | ||
return ComponentService.get_all_component(current_user) | ||
|
||
|
||
@router.post('', response_model=UnifiedResponseModel[Component]) | ||
def save_components(*, | ||
data: CreateComponentReq, | ||
Authorize: AuthJWT = Depends()): | ||
# get login user | ||
Authorize.jwt_required() | ||
current_user = json.loads(Authorize.get_jwt_subject()) | ||
component = Component(**data.dict(), user_id=current_user.get('user_id'), user_name=current_user.get('user_name')) | ||
return ComponentService.save_component(component) | ||
|
||
|
||
@router.patch('', response_model=UnifiedResponseModel[Component]) | ||
def update_component(*, | ||
data: CreateComponentReq, | ||
Authorize: AuthJWT = Depends()): | ||
# get login user | ||
Authorize.jwt_required() | ||
current_user = json.loads(Authorize.get_jwt_subject()) | ||
component = Component(**data.dict(), user_id=current_user.get('user_id'), user_name=current_user.get('user_name')) | ||
return ComponentService.update_component(component) | ||
|
||
|
||
@router.delete('', response_model=UnifiedResponseModel[Component]) | ||
def delete_component(*, | ||
name: str = Body(..., embed=True, description='组件名'), | ||
Authorize: AuthJWT = Depends()): | ||
Authorize.jwt_required() | ||
current_user = json.loads(Authorize.get_jwt_subject()) | ||
|
||
return ComponentService.delete_component(current_user.get('user_id'), name) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
from datetime import datetime | ||
from typing import Any, Dict, List, Optional | ||
from uuid import UUID, uuid4 | ||
|
||
from bisheng.database.base import session_getter | ||
from bisheng.database.models.base import SQLModelSerializable | ||
from pydantic import validator | ||
from sqlmodel import JSON, Column, DateTime, Field, select, text | ||
|
||
|
||
class ComponentBase(SQLModelSerializable): | ||
name: str = Field(max_length=50, index=True, description='保存的组件名称') | ||
description: Optional[str] = Field(default='', description='组件描述') | ||
data: Optional[Any] = Field(default=None, description='组件数据') | ||
user_id: int = Field(default=None, index=True, description='创建人ID') | ||
user_name: str = Field(default=None, description='创建人姓名') | ||
create_time: Optional[datetime] = Field(sa_column=Column( | ||
DateTime, nullable=False, index=True, server_default=text('CURRENT_TIMESTAMP'))) | ||
update_time: Optional[datetime] = Field(sa_column=Column( | ||
DateTime, nullable=False, server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))) | ||
|
||
|
||
class Component(ComponentBase, table=True): | ||
id: UUID = Field(default_factory=uuid4, primary_key=True, unique=True) | ||
data: Optional[Dict] = Field(default=None, sa_column=Column(JSON)) | ||
|
||
@validator('data') | ||
def validate_json(cls, v): | ||
# dict_keys(['description', 'name', 'id', 'data']) | ||
if not v: | ||
return v | ||
if not isinstance(v, dict): | ||
raise ValueError('Flow must be a valid JSON') | ||
|
||
# data must contain nodes and edges | ||
if 'nodes' not in v.keys(): | ||
raise ValueError('Flow must have nodes') | ||
if 'edges' not in v.keys(): | ||
raise ValueError('Flow must have edges') | ||
return v | ||
|
||
|
||
class ComponentDao(ComponentBase): | ||
|
||
@classmethod | ||
def get_user_components(cls, user_id: int) -> List[Component]: | ||
with session_getter() as session: | ||
statement = select(Component).where(Component.user_id == user_id) | ||
return session.exec(statement).all() | ||
|
||
@classmethod | ||
def get_component_by_name(cls, user_id: int, name: str) -> Component | None: | ||
with session_getter() as session: | ||
statement = select(Component).where(Component.user_id == user_id, Component.name == name) | ||
return session.exec(statement).first() | ||
|
||
@classmethod | ||
def insert_component(cls, component: Component) -> Component: | ||
with session_getter() as session: | ||
session.add(component) | ||
session.commit() | ||
session.refresh(component) | ||
return component | ||
|
||
@classmethod | ||
def update_component(cls, component: Component) -> Component: | ||
with session_getter() as session: | ||
session.add(component) | ||
session.commit() | ||
session.refresh(component) | ||
return component | ||
|
||
@classmethod | ||
def delete_component(cls, component: Component) -> Component: | ||
with session_getter() as session: | ||
session.delete(component) | ||
session.commit() | ||
return component |