from typing import Any 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 import get_uid router = APIRouter() @router.post("/create") async def create( request: Request, data_in: schemas.ReportCreate, game: str, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """新建报表""" try: await crud.report.create(db, data_in, user_id=request.user.id) except pymongo.errors.DuplicateKeyError: return schemas.Msg(code=-1, msg='error', data='报表已存在') return schemas.Msg(code=0, msg='ok', data='创建成功') @router.post("/edit") async def edit( request: Request, data_in: schemas.ReportEdit, game: str, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """编辑报表""" res = await crud.report.update_one(db, {'_id': data_in.report_id, 'user_id': request.user.id}, {'$set': {'query': data_in.query, 'name': data_in.name, 'desc': data_in.desc}}) if not res.modified_count: return schemas.Msg(code=-1, msg='只能报表所有者编辑') return schemas.Msg(code=0, msg='ok', data='编辑成功') @router.post("/copy") async def copy( request: Request, data_in: schemas.ReportCopy, game: str, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """复制报表到其他项目""" for report_id in data_in.report_ids: new_report = await crud.report.get(db, report_id) if not new_report: continue new_report_id = get_uid() new_report['_id'] = new_report_id new_report['project_id'] = data_in.dest_project_id await crud.report.insert_one(db, new_report) return schemas.Msg(code=0, msg='ok', data='编辑成功') @router.post("/read_report") async def read_report( request: Request, data_in: schemas.ReportRead, game: str, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> Any: """获取已建报表 属于自己的""" ext_where = dict() dashboard = dict() if data_in.report_id: ext_where = {'_id': {'$in': data_in.report_id}} else: ext_where['user_id'] = request.user.id if data_in.dashboard_id: dashboard = await crud.dashboard.get(db, id=data_in.dashboard_id) # projection = {'query': False} projection = None reports = await crud.report.read_report(db, project_id=data_in.project_id, projection=projection, **ext_where) for item in reports: item['added'] = False # item['name'] = item['name'] item['show_config'] = dict() added_ids = {item['report_id']: item for item in dashboard.get('reports', [])} if item['_id'] in added_ids: item['added'] = True item['show_config'] = added_ids[item['_id']] reports = sorted(reports, key=lambda x: x.get('show_config', {'sort': 999}).get('sort', 999) or 999) return schemas.Msg(code=0, msg='ok', data=reports) @router.post("/delete") async def delete( request: Request, data_in: schemas.ReportDelete, game: str, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """删除报表""" # 删除Report 自己创建的 del_report = await crud.report.delete(db, {'_id': data_in.id, 'user_id': current_user.id}) # 从看板弹出 del_item = {'report_id': data_in.id} await crud.dashboard.update_many(db, {}, {'$pull': {'reports': del_item}}) if del_report.deleted_count == 0: return schemas.Msg(code=-1, msg='error', data='删除失败') return schemas.Msg(code=0, msg='ok', data='删除成功')