import pymongo from fastapi import APIRouter, Depends from motor.motor_asyncio import AsyncIOMotorDatabase import crud, schemas from db import get_database from api import deps router = APIRouter() @router.post("/create") async def create( game: str, data_in: schemas.SpaceCreate, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """创建空间""" try: if data_in.is_all_member: data_in.members.clear() users = await crud.user.find_many(db) for user in users: if user['_id'] == current_user.id: continue data_in.members.append(schemas.space.Member(**user, authority=data_in.authority)) await crud.space.create(db, data_in, user=current_user) except pymongo.errors.DuplicateKeyError: return schemas.Msg(code=-1, msg='空间已存在', data='空间已存在') return schemas.Msg(code=0, msg='创建成功', data='创建成功') @router.post("/delete") async def delete( data_in: schemas.SpaceDelete, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """删除空间""" # 删除空间 自己创建的 del_space = await crud.space.delete(db, {'_id': data_in.id}) # 删除文件夹 del_folder = await crud.folder.find_many(db, {'pid': data_in.id}) del_folder_ids = [f['_id'] for f in del_folder] await crud.folder.delete(db, {'pid': data_in.id}) # 删除文件夹下的 dashboard if del_folder_ids: await crud.dashboard.delete(db, {'_id': {'$in': del_folder_ids}}) # 删除空间下的 dashboard await crud.dashboard.delete(db, {'pid': data_in.id}) if del_space.deleted_count == 0: return schemas.Msg(code=-1, msg='error', data='删除失败') return schemas.Msg(code=0, msg='ok', data='删除成功') @router.post("/rename") async def rename( data_in: schemas.SpaceRename, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """重命名空间""" res = await crud.space.rename(db, data_in) return schemas.Msg(code=0, msg='ok', data=1) @router.post("/set_members") async def set_members( data_in: schemas.AddSpaceMembers, game: str, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """设置空间成员""" res = await crud.space.set_members(db, data_in) return schemas.Msg(code=0, msg='ok', data=1) @router.post("/detail") async def detail( data_in: schemas.SpaceDetail, game: str, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """空间详细""" space_info = await crud.space.get(db, id=data_in.space_id) exists_member = {item.get('user_id') for item in space_info.get('members', [])} members_info = await crud.user.find_ids(db, list(exists_member)) members_info = {item['_id']: item for item in members_info} for item in space_info.get('members', []): if user_info := members_info.get(item['user_id']): item.update(schemas.UserDB(**user_info).dict(by_alias=True)) return schemas.Msg(code=0, msg='ok', data=space_info)