# -*- coding: utf-8 -*- # @Time : 2024/11/19 下午8:04 # @FileName: manage_tanant.py # @Software: PyCharm from fastapi import APIRouter from sqlalchemy import delete from dependencies import * router = APIRouter() from fastapi import HTTPException, Response from models import Tenant, User # 假设你已导入 Tenant 和 User 模型 from dependencies import SessionDep # 假设 SessionDep 是数据库会话的依赖 # 列举所有租户 @router.get("/api/s1/tenant") async def get_tenant(response: Response, session: SessionDep, current_user: User = Depends(get_current_user)): if current_user.role != 0: raise HTTPException(status_code=403, detail="Only Superadmin can list all tenants.") tenants = session.query(Tenant).all() # 获取所有租户 if not tenants: raise HTTPException(status_code=404, detail="No tenants found") tenant_data = [] for tenant in tenants: # 获取该租户中 role=1 的第一个用户(如果存在) tenant_user = next((user for user in tenant.users if user.role == 1), None) # 获取该租户中除了 role=1 以外的用户数量 user_num = len([user for user in tenant.users if user.role != 1]) # 构建租户信息 tenant_info = { "name": tenant.name, "username": tenant_user.username if tenant_user else None, # 如果找到 role=1 的用户,返回其 username "user_num": user_num # 除去 role=1 的用户数量 } tenant_data.append(tenant_info) return {"tenants": tenant_data} # 新增和修改租户 @router.post("/api/s1/tenant") async def create_or_update_tenant(data: dict, session: SessionDep, current_user: User = Depends(get_current_user)): if current_user.role != 0: raise HTTPException(status_code=403, detail="Only Superadmin can add or update tenants.") name = data.get("name") username = data.get("username") password = data.get("password") # 验证是否缺少必要参数 if not name: raise HTTPException(status_code=400, detail="Need more name") if username: # 如果 username 不为空,判断为新建租户 # 检查租户名是否已存在 tenant_query = select(Tenant).where(Tenant.name == name) existing_tenant = session.exec(tenant_query).first() if existing_tenant: raise HTTPException(status_code=409, detail="Tenant name already exists") # 创建新租户 tenant = Tenant(name=name) session.add(tenant) session.commit() session.refresh(tenant) # 创建新用户 user = User( username=username, password=password, # 记得加密密码 role=1, # 默认role为1 tenant_id=tenant.id, ) session.add(user) # 提交事务 session.commit() return {"message": "Tenant and User added successfully"} else: # 如果 username 为空,执行更新操作 # 根据租户名称查找 Tenant tenant_query = select(Tenant).where(Tenant.name == name) tenant = session.exec(tenant_query).first() # 如果找不到对应的租户,抛出错误 if not tenant: raise HTTPException(status_code=404, detail="Tenant not found") # 找到租户后,根据 tenant_id 查找该租户下的所有用户 user_query = select(User).where(User.tenant_id == tenant.id) user = session.exec(user_query).first() # 如果找不到对应的用户,抛出错误 if not user: raise HTTPException(status_code=404, detail="User not found") user.password = password session.add(user) session.commit() print(user) # 测试用 return {"message": "Tenant and User update successfully"} # 删除租户 @router.delete("/api/s1/tenant") async def delete_tenant(data: dict, session: SessionDep, current_user: User = Depends(get_current_user)): if current_user.role != 0: raise HTTPException(status_code=403, detail="Only Superadmin can delete tenants.") tenant_name = data.get("name") if not tenant_name: raise HTTPException(status_code=400, detail="Tenant name is required") # 查找租户 tenant = session.exec( select(Tenant).where(Tenant.name == tenant_name)).first() if not tenant: raise HTTPException(status_code=404, detail="Tenant not found") # 删除与租户相关的用户 stmt = delete(User).where(User.tenant_id == tenant.id) session.execute(stmt) # 删除租户 session.delete(tenant) session.commit() return {"detail": "Tenant deleted successfully"}