import pymongo from fastapi import APIRouter, Depends, Request from motor.motor_asyncio import AsyncIOMotorDatabase import crud, schemas from db import get_database from api import deps from utils.func import get_uid router = APIRouter() @router.post("/create") async def create( data_in: schemas.DashboardCreate, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """创建看板""" try: await crud.dashboard.create(db, data_in, user_id=current_user.id) except pymongo.errors.DuplicateKeyError: return schemas.Msg(code=-1, msg='看板已存在', data='看板已存在') return schemas.Msg(code=0, msg='ok', data='创建成功') @router.post("/delete") async def delete( request: Request, data_in: schemas.DashboardDelete, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """删除看板""" del_dashboard = await crud.dashboard.delete(db, {'_id': {'$in': data_in.ids}, 'user_id': request.user.id}) if del_dashboard.deleted_count == 0: return schemas.Msg(code=-1, msg='error', data='删除失败') return schemas.Msg(code=0, msg='ok', data='删除成功') @router.post("/move") async def move( data_in: schemas.DashboardMove, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """ 移动看板 """ for source_id in data_in.source_ids: res = await crud.dashboard.update_one(db, {'_id': source_id}, {'$set': dict(cat=data_in.cat, pid=data_in.dest_pid)}) return schemas.Msg(code=0, msg='ok', data='移动成功') @router.post("/copy") async def copy( data_in: schemas.DashboardCopy, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """ 复制到其他项目 """ # 检查是否存在默认空间 不存在就创建 dest_project_id = data_in.dest_project_id dest_default_space = await crud.space.find_one(db, {'project_id': dest_project_id, 'name': '默认空间'}, {'_id': True}) dest_space_id = dest_default_space.get('_id') # 创建默认空间 if not dest_space_id: default_space = await crud.space.create(db, schemas.SpaceCreate(name='默认空间', project_id=dest_project_id), user=current_user) dest_space_id = default_space.inserted_id dashboards = await crud.dashboard.find_many(db, {'_id': {'$in': data_in.source_ids}}, {'_id': False}) for item in dashboards: item['project_id'] = dest_project_id item['pid'] = dest_space_id item['cat'] = 'space' item['_id'] = get_uid() for report in item['reports']: report_id = report['report_id'] new_report = await crud.report.get(db, report_id) new_report_id = get_uid() new_report['_id'] = new_report_id new_report['project_id'] = dest_project_id report['report_id'] = new_report_id await crud.report.insert_one(db, new_report) await crud.dashboard.update_one(db, {'project_id': item['project_id'], 'name': item['name'], 'user_id': item['user_id']}, {'$set': item}, upsert=True) return schemas.Msg(code=0, msg='ok', data='复制成功') @router.post("/add_report") async def add_report(data_in: schemas.AddReport, game: str, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ): """添加报表""" reports = [item.dict() for item in data_in.report_ids] # res = await crud.dashboard.update_one(db, {'_id': data_in.id}, # {'$push': {'reports': {'$each': reports}}}) await crud.dashboard.update_one(db, {'_id': data_in.id}, {'$set': {'reports': reports}}) return schemas.Msg(code=0, msg='ok', data='ok') @router.post("/del_report") async def del_report( game: str, data_in: schemas.DelReport, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ): """删除报表""" del_item = {'report_id': data_in.report_id} await crud.dashboard.update_one(db, {'_id': data_in.id}, {'$pull': {'reports': del_item}}) return schemas.Msg(code=0, msg='ok', data='ok') @router.post("/") async def dashboards(request: Request, game: str, data_in: schemas.ReadDashboard, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ): """获取一个看板""" res = await crud.dashboard.get(db, id=data_in.id) # res['reports'] = await crud.report.find_many(db, **{'_id': {'$in': [item['report_id'] for item in res.get('reports')]}}) return schemas.Msg(code=0, msg='ok', data=res['reports'])