feat(workspace, app, agent): add duplicate name validation and restrict model/memory config on agent publish
This commit is contained in:
@@ -1,10 +1,13 @@
|
||||
from sqlalchemy.orm import Session, joinedload
|
||||
from app.models.user_model import User
|
||||
from typing import List, Optional
|
||||
import uuid
|
||||
from app.models.workspace_model import Workspace, WorkspaceMember, WorkspaceRole
|
||||
from app.schemas.workspace_schema import WorkspaceCreate, WorkspaceUpdate
|
||||
from typing import List, Optional
|
||||
|
||||
from sqlalchemy.orm import Session, joinedload
|
||||
from sqlalchemy import select
|
||||
|
||||
from app.core.logging_config import get_db_logger
|
||||
from app.models.user_model import User
|
||||
from app.models.workspace_model import Workspace, WorkspaceMember, WorkspaceRole
|
||||
from app.schemas.workspace_schema import WorkspaceCreate
|
||||
|
||||
# 获取数据库专用日志器
|
||||
db_logger = get_db_logger()
|
||||
@@ -19,7 +22,7 @@ class WorkspaceRepository:
|
||||
def create_workspace(self, workspace_data: WorkspaceCreate, tenant_id: uuid.UUID) -> Workspace:
|
||||
"""创建工作空间"""
|
||||
db_logger.debug(f"创建工作空间记录: name={workspace_data.name}, tenant_id={tenant_id}")
|
||||
|
||||
|
||||
try:
|
||||
db_workspace = Workspace(
|
||||
name=workspace_data.name,
|
||||
@@ -34,7 +37,8 @@ class WorkspaceRepository:
|
||||
)
|
||||
self.db.add(db_workspace)
|
||||
self.db.flush()
|
||||
db_logger.info(f"工作空间记录创建成功: {workspace_data.name} (ID: {db_workspace.id}), storage_type: {workspace_data.storage_type}")
|
||||
db_logger.info(
|
||||
f"工作空间记录创建成功: {workspace_data.name} (ID: {db_workspace.id}), storage_type: {workspace_data.storage_type}")
|
||||
return db_workspace
|
||||
except Exception as e:
|
||||
db_logger.error(f"创建工作空间记录失败: name={workspace_data.name} - {str(e)}")
|
||||
@@ -43,7 +47,7 @@ class WorkspaceRepository:
|
||||
def get_workspace_by_id(self, workspace_id: uuid.UUID) -> Optional[Workspace]:
|
||||
"""根据ID获取工作空间"""
|
||||
db_logger.debug(f"根据ID查询工作空间: workspace_id={workspace_id}")
|
||||
|
||||
|
||||
try:
|
||||
workspace = self.db.query(Workspace).filter(Workspace.id == workspace_id).first()
|
||||
if workspace:
|
||||
@@ -65,7 +69,7 @@ class WorkspaceRepository:
|
||||
包含 llm, embedding, rerank 的字典,如果工作空间不存在则返回 None
|
||||
"""
|
||||
db_logger.debug(f"查询工作空间模型配置: workspace_id={workspace_id}")
|
||||
|
||||
|
||||
try:
|
||||
workspace = self.db.query(Workspace).filter(Workspace.id == workspace_id).first()
|
||||
if workspace:
|
||||
@@ -89,7 +93,7 @@ class WorkspaceRepository:
|
||||
def get_workspaces_by_user(self, user_id: uuid.UUID) -> List[Workspace]:
|
||||
"""获取用户参与的所有工作空间(包括用户创建的和作为成员的)"""
|
||||
db_logger.debug(f"查询用户参与的工作空间: user_id={user_id}")
|
||||
|
||||
|
||||
try:
|
||||
# 首先获取用户信息以获取 tenant_id
|
||||
from app.models.user_model import User
|
||||
@@ -97,7 +101,7 @@ class WorkspaceRepository:
|
||||
if not user:
|
||||
db_logger.warning(f"用户不存在: user_id={user_id}")
|
||||
return []
|
||||
|
||||
|
||||
if user.is_superuser:
|
||||
# 超级用户获取对应tenantid所有工作空间
|
||||
workspaces = (
|
||||
@@ -109,7 +113,7 @@ class WorkspaceRepository:
|
||||
)
|
||||
db_logger.debug(f"超用户查询所有工作空间: user_id={user_id}, 数量={len(workspaces)}")
|
||||
return workspaces
|
||||
|
||||
|
||||
# 获取用户作为成员的工作空间
|
||||
member_workspaces = (
|
||||
self.db.query(Workspace)
|
||||
@@ -120,7 +124,7 @@ class WorkspaceRepository:
|
||||
.order_by(Workspace.updated_at.desc())
|
||||
.all()
|
||||
)
|
||||
|
||||
|
||||
db_logger.debug(f"用户工作空间查询成功: user_id={user_id}, 数量={len(member_workspaces)}")
|
||||
return member_workspaces
|
||||
except Exception as e:
|
||||
@@ -130,7 +134,7 @@ class WorkspaceRepository:
|
||||
def get_workspaces_by_tenant(self, tenant_id: uuid.UUID) -> List[Workspace]:
|
||||
"""获取租户的所有工作空间"""
|
||||
db_logger.debug(f"查询租户的工作空间: tenant_id={tenant_id}")
|
||||
|
||||
|
||||
try:
|
||||
workspaces = (
|
||||
self.db.query(Workspace)
|
||||
@@ -144,14 +148,32 @@ class WorkspaceRepository:
|
||||
db_logger.error(f"查询租户工作空间失败: tenant_id={tenant_id} - {str(e)}")
|
||||
raise
|
||||
|
||||
def add_member(self, workspace_id: uuid.UUID, user_id: uuid.UUID, role: WorkspaceRole = WorkspaceRole.member) -> WorkspaceMember:
|
||||
def get_workspaces_by_name(self, tenant_id: uuid.UUID, workspace_name: str) -> List[Workspace]:
|
||||
try:
|
||||
stmt = (
|
||||
select(Workspace)
|
||||
.where(
|
||||
Workspace.tenant_id == tenant_id,
|
||||
Workspace.name == workspace_name,
|
||||
Workspace.is_active.is_(True)
|
||||
)
|
||||
)
|
||||
|
||||
workspaces = self.db.execute(stmt).scalars().all()
|
||||
return list(workspaces)
|
||||
except Exception as e:
|
||||
db_logger.error(f"查询工作空间失败: workspace_name={workspace_name} - {str(e)}")
|
||||
raise
|
||||
|
||||
def add_member(self, workspace_id: uuid.UUID, user_id: uuid.UUID,
|
||||
role: WorkspaceRole = WorkspaceRole.member) -> WorkspaceMember:
|
||||
"""添加工作空间成员"""
|
||||
db_logger.debug(f"添加工作空间成员: user_id={user_id}, workspace_id={workspace_id}, role={role}")
|
||||
|
||||
|
||||
try:
|
||||
db_member = WorkspaceMember(
|
||||
user_id=user_id,
|
||||
workspace_id=workspace_id,
|
||||
user_id=user_id,
|
||||
workspace_id=workspace_id,
|
||||
role=role
|
||||
)
|
||||
self.db.add(db_member)
|
||||
@@ -165,7 +187,7 @@ class WorkspaceRepository:
|
||||
def get_member(self, user_id: uuid.UUID, workspace_id: uuid.UUID) -> Optional[WorkspaceMember]:
|
||||
"""获取工作空间成员"""
|
||||
db_logger.debug(f"查询工作空间成员: user_id={user_id}, workspace_id={workspace_id}")
|
||||
|
||||
|
||||
try:
|
||||
member = self.db.query(WorkspaceMember).filter(
|
||||
WorkspaceMember.user_id == user_id,
|
||||
@@ -173,7 +195,8 @@ class WorkspaceRepository:
|
||||
WorkspaceMember.is_active.is_(True),
|
||||
).first()
|
||||
if member:
|
||||
db_logger.debug(f"工作空间成员查询成功: user_id={user_id}, workspace_id={workspace_id}, role={member.role}")
|
||||
db_logger.debug(
|
||||
f"工作空间成员查询成功: user_id={user_id}, workspace_id={workspace_id}, role={member.role}")
|
||||
else:
|
||||
db_logger.debug(f"工作空间成员不存在: user_id={user_id}, workspace_id={workspace_id}")
|
||||
return member
|
||||
@@ -199,7 +222,7 @@ class WorkspaceRepository:
|
||||
except Exception as e:
|
||||
db_logger.error(f"查询成员列表失败: workspace_id={workspace_id} - {str(e)}")
|
||||
raise
|
||||
|
||||
|
||||
def get_member_by_id(self, member_id: uuid.UUID) -> WorkspaceMember:
|
||||
"""按成员ID获取工作空间成员,并预加载 user 与 workspace 关系"""
|
||||
db_logger.debug(f"查询成员的工作空间: member_id={member_id}")
|
||||
@@ -214,7 +237,8 @@ class WorkspaceRepository:
|
||||
.first()
|
||||
)
|
||||
if member:
|
||||
db_logger.debug(f"成员查询成功: member_id={member_id}, workspace_id={member.workspace_id}, role={member.role}")
|
||||
db_logger.debug(
|
||||
f"成员查询成功: member_id={member_id}, workspace_id={member.workspace_id}, role={member.role}")
|
||||
else:
|
||||
db_logger.debug(f"成员不存在: member_id={member_id}")
|
||||
return member
|
||||
@@ -222,7 +246,8 @@ class WorkspaceRepository:
|
||||
db_logger.error(f"查询成员列表失败: member_id={member_id} - {str(e)}")
|
||||
raise
|
||||
|
||||
def update_member_role(self, workspace_id: uuid.UUID, user_id: uuid.UUID, role: WorkspaceRole) -> Optional[WorkspaceMember]:
|
||||
def update_member_role(self, workspace_id: uuid.UUID, user_id: uuid.UUID, role: WorkspaceRole) -> Optional[
|
||||
WorkspaceMember]:
|
||||
try:
|
||||
member = self.db.query(WorkspaceMember).filter(
|
||||
WorkspaceMember.workspace_id == workspace_id,
|
||||
@@ -255,7 +280,7 @@ class WorkspaceRepository:
|
||||
except Exception as e:
|
||||
db_logger.error(f"删除成员失败: workspace_id={workspace_id}, user_id={user_id} - {str(e)}")
|
||||
raise
|
||||
|
||||
|
||||
def delete_member_by_id(self, member_id: uuid.UUID) -> Optional[WorkspaceMember]:
|
||||
try:
|
||||
member = self.db.query(WorkspaceMember).filter(
|
||||
@@ -271,7 +296,7 @@ class WorkspaceRepository:
|
||||
except Exception as e:
|
||||
db_logger.error(f"删除成员失败: id={member_id} - {str(e)}")
|
||||
raise
|
||||
|
||||
|
||||
def update_member_role_by_id(self, id: uuid.UUID, role: WorkspaceRole) -> Optional[WorkspaceMember]:
|
||||
try:
|
||||
member = self.db.query(WorkspaceMember).filter(
|
||||
@@ -288,12 +313,18 @@ class WorkspaceRepository:
|
||||
db_logger.error(f"更新成员角色失败: id={id} - {str(e)}")
|
||||
raise
|
||||
|
||||
|
||||
# 保持向后兼容的函数
|
||||
def get_workspace_by_id(db: Session, workspace_id: uuid.UUID) -> Workspace | None:
|
||||
repo = WorkspaceRepository(db)
|
||||
return repo.get_workspace_by_id(workspace_id)
|
||||
|
||||
|
||||
def get_workspaces_by_name(db: Session, tenant_id: uuid.UUID, name: str) -> List[Workspace]:
|
||||
repo = WorkspaceRepository(db)
|
||||
return repo.get_workspaces_by_name(tenant_id, name)
|
||||
|
||||
|
||||
def get_workspaces_by_user(db: Session, user_id: uuid.UUID) -> List[Workspace]:
|
||||
repo = WorkspaceRepository(db)
|
||||
return repo.get_workspaces_by_user(user_id)
|
||||
@@ -315,7 +346,7 @@ def create_workspace(db: Session, workspace: WorkspaceCreate, tenant_id: uuid.UU
|
||||
|
||||
|
||||
def add_member_to_workspace(
|
||||
db: Session, user_id: uuid.UUID, workspace_id: uuid.UUID, role: WorkspaceRole
|
||||
db: Session, user_id: uuid.UUID, workspace_id: uuid.UUID, role: WorkspaceRole
|
||||
) -> WorkspaceMember:
|
||||
repo = WorkspaceRepository(db)
|
||||
return repo.add_member(workspace_id, user_id, role)
|
||||
@@ -325,39 +356,43 @@ def get_members_by_workspace(db: Session, workspace_id: uuid.UUID) -> List[Works
|
||||
repo = WorkspaceRepository(db)
|
||||
return repo.get_members_by_workspace(workspace_id)
|
||||
|
||||
|
||||
def get_member_by_id(db: Session, member_id: uuid.UUID) -> WorkspaceMember | None:
|
||||
repo = WorkspaceRepository(db)
|
||||
return repo.get_member_by_id(member_id)
|
||||
|
||||
|
||||
def update_member_role_in_workspace(
|
||||
db: Session,
|
||||
user_id: uuid.UUID,
|
||||
workspace_id: uuid.UUID,
|
||||
role: WorkspaceRole,
|
||||
db: Session,
|
||||
user_id: uuid.UUID,
|
||||
workspace_id: uuid.UUID,
|
||||
role: WorkspaceRole,
|
||||
) -> Optional[WorkspaceMember]:
|
||||
repo = WorkspaceRepository(db)
|
||||
return repo.update_member_role(workspace_id, user_id, role)
|
||||
|
||||
|
||||
def remove_member_from_workspace(
|
||||
db: Session,
|
||||
user_id: uuid.UUID,
|
||||
workspace_id: uuid.UUID,
|
||||
db: Session,
|
||||
user_id: uuid.UUID,
|
||||
workspace_id: uuid.UUID,
|
||||
) -> Optional[WorkspaceMember]:
|
||||
repo = WorkspaceRepository(db)
|
||||
return repo.deactivate_member(workspace_id, user_id)
|
||||
|
||||
|
||||
def remove_member_from_workspace_by_id(
|
||||
db: Session,
|
||||
member_id: uuid.UUID,
|
||||
db: Session,
|
||||
member_id: uuid.UUID,
|
||||
) -> Optional[WorkspaceMember]:
|
||||
repo = WorkspaceRepository(db)
|
||||
return repo.delete_member_by_id(member_id)
|
||||
|
||||
|
||||
def update_member_role_by_id(
|
||||
db: Session,
|
||||
id: uuid.UUID,
|
||||
role: WorkspaceRole,
|
||||
db: Session,
|
||||
id: uuid.UUID,
|
||||
role: WorkspaceRole,
|
||||
) -> Optional[WorkspaceMember]:
|
||||
repo = WorkspaceRepository(db)
|
||||
return repo.update_member_role_by_id(id, role)
|
||||
|
||||
Reference in New Issue
Block a user