diff --git a/backend/alembic/versions/020_workspace_ddl.py b/backend/alembic/versions/020_workspace_ddl.py new file mode 100644 index 00000000..860955e7 --- /dev/null +++ b/backend/alembic/versions/020_workspace_ddl.py @@ -0,0 +1,32 @@ +"""020_workspace_ddl + +Revision ID: a6b44114c17f +Revises: dcaecd481715 +Create Date: 2025-07-06 18:03:36.143060 + +""" +from alembic import op +import sqlalchemy as sa +import sqlmodel.sql.sqltypes + + +# revision identifiers, used by Alembic. +revision = 'a6b44114c17f' +down_revision = 'dcaecd481715' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'sys_workspace', + sa.Column('id', sa.BigInteger(), primary_key=True, nullable=False), + sa.Column('name', sa.String(255), nullable=False), + sa.Column('create_time', sa.BigInteger(), default=0, nullable=False) + ) + op.create_index(op.f('ix_sys_workspace_id'), 'sys_workspace', ['id'], unique=False) + + +def downgrade(): + op.drop_table('sys_workspace') + op.drop_index(op.f('ix_sys_workspace_id'), table_name='sys_workspace') diff --git a/backend/apps/api.py b/backend/apps/api.py index 9702c247..ff75d577 100644 --- a/backend/apps/api.py +++ b/backend/apps/api.py @@ -4,12 +4,13 @@ from apps.chat.api import chat from apps.dashboard.api import dashboard_api from apps.datasource.api import datasource from apps.settings.api import terminology -from apps.system.api import login, user, aimodel +from apps.system.api import login, user, aimodel, workspace from apps.mcp import mcp api_router = APIRouter() api_router.include_router(login.router) api_router.include_router(user.router) +api_router.include_router(workspace.router) api_router.include_router(aimodel.router) api_router.include_router(terminology.router) api_router.include_router(datasource.router) diff --git a/backend/apps/system/api/workspace.py b/backend/apps/system/api/workspace.py new file mode 100644 index 00000000..541b38b0 --- /dev/null +++ b/backend/apps/system/api/workspace.py @@ -0,0 +1,44 @@ +from fastapi import APIRouter +from sqlmodel import select +from apps.system.models.system_model import WorkspaceBase, WorkspaceEditor, WorkspaceModel +from common.core.deps import SessionDep +from common.utils.time import get_timestamp + +router = APIRouter(tags=["system/workspace"], prefix="/system/workspace") + +@router.get("", response_model=list[WorkspaceModel]) +async def query(session: SessionDep): + return session.exec(select(WorkspaceModel).order_by(WorkspaceModel.create_time)).all() + +@router.post("") +async def add(session: SessionDep, creator: WorkspaceBase): + db_model = WorkspaceModel.model_validate(creator) + db_model.create_time = get_timestamp() + session.add(db_model) + session.commit() + +@router.put("") +async def update(session: SessionDep, editor: WorkspaceEditor): + id = editor.id + db_model = session.get(WorkspaceModel, id) + if not db_model: + raise ValueError(f"WorkspaceModel with id {id} not found") + update_data = WorkspaceModel.model_validate(editor) + db_model.sqlmodel_update(update_data) + session.add(db_model) + session.commit() + +@router.get("/{id}", response_model=WorkspaceModel) +async def get_one(session: SessionDep, id: int): + db_model = session.get(WorkspaceModel, id) + if not db_model: + raise ValueError(f"WorkspaceModel with id {id} not found") + return db_model + +@router.delete("/{id}") +async def delete(session: SessionDep, id: int): + db_model = session.get(WorkspaceModel, id) + if not db_model: + raise ValueError(f"WorkspaceModel with id {id} not found") + session.delete(db_model) + session.commit() \ No newline at end of file diff --git a/backend/apps/system/models/system_model.py b/backend/apps/system/models/system_model.py index 89d7d997..4d318e33 100644 --- a/backend/apps/system/models/system_model.py +++ b/backend/apps/system/models/system_model.py @@ -1,6 +1,7 @@ from sqlmodel import BigInteger, Field, Text, SQLModel from common.core.models import SnowflakeBase +from common.core.schemas import BaseCreatorDTO class AiModelBase: @@ -17,4 +18,17 @@ class AiModelDetail(SnowflakeBase, AiModelBase, table=True): protocol: int = Field(nullable=False, default = 1) config: str = Field(sa_type = Text()) status: int = Field(nullable=False, default = 1) - create_time: int = Field(default=0, sa_type=BigInteger()) \ No newline at end of file + create_time: int = Field(default=0, sa_type=BigInteger()) + + + + +class WorkspaceBase(SQLModel): + name: str = Field(max_length=255, nullable=False) + +class WorkspaceEditor(WorkspaceBase, BaseCreatorDTO): + pass + +class WorkspaceModel(SnowflakeBase, WorkspaceBase, table=True): + __tablename__ = "sys_workspace" + create_time: int = Field(default=0, sa_type=BigInteger()) \ No newline at end of file