xbackend/api/api_v1/endpoints/report.py
2021-07-23 23:19:52 +08:00

91 lines
2.9 KiB
Python

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
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:
"""编辑报表"""
await crud.report.update_one(db, {'_id': data_in.report_id},
{'$set': {'query': data_in.query, 'name': data_in.name, 'desc': data_in.desc}})
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}}
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, user_id=request.user.id, project_id=data_in.project_id,
projection=projection, **ext_where)
for item in reports:
item['added'] = False
added_ids = [item['report_id'] for item in dashboard.get('reports', [])]
if item['_id'] in added_ids:
item['added'] = True
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)
if del_report.deleted_count == 0:
return schemas.Msg(code=-1, msg='error', data='删除失败')
return schemas.Msg(code=0, msg='ok', data='删除成功')