import pymongo from fastapi import APIRouter, Depends, Request from motor.motor_asyncio import AsyncIOMotorDatabase import crud, schemas from api import deps from core.config import settings from db import get_database from db.ckdb import CKDrive, get_ck_db from schemas.project import ProjectCreate from utils import casbin_enforcer router = APIRouter() @router.post("/create") async def create( data_in: ProjectCreate, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """创建项目""" try: await crud.project.create(db, data_in, user_id=current_user.id) except pymongo.errors.DuplicateKeyError: return schemas.Msg(code=-1, msg='项目名已存在', data='项目名已存在') # todo 建默认文件夹 # 新建项目管理员权限 role_name = f'{data_in.game}_admin' role_dom = data_in.game casbin_enforcer.add_policy(role_name, role_dom, '*', '*') await crud.authority.create(db, 'p', role_name, role_dom, '*', '*') # 添加角色 await crud.authority.create(db, 'g', settings.SUPERUSER_NAME, role_name, '*', '*', role_name='项目管理员', game=role_dom) return schemas.Msg(code=0, msg='创建成功') @router.get("/") async def read_project(request: Request, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ): """查看自己拥有的项目""" res = await crud.project.read_project(db, user_id=current_user.id) return schemas.Msg(code=0, msg='ok', data=res) @router.post("/detail") async def read_project(request: Request, game: str, data_in: schemas.ProjectDetail, db: AsyncIOMotorDatabase = Depends(get_database), ck: CKDrive = Depends(get_ck_db), current_user: schemas.UserDB = Depends(deps.get_current_user) ): """查看项目信息""" res = await crud.project.read_project(db, user_id=current_user.id, _id=data_in.project_id) if res: res = res[0] event_count = await ck.count(game, 'event') user_count = await ck.count(game, 'user_view') event_type_count = await ck.distinct_count(game, 'event') event_attr_count = await ck.field_count(db=game, tb='event') user_attr_count = await ck.field_count(db=game, tb='user_view') res['event_count'] = event_count res['user_count'] = user_count res['event_type_count'] = event_type_count res['event_attr_count'] = event_attr_count res['user_attr_count'] = user_attr_count return schemas.Msg(code=0, msg='ok', data=res) @router.post("/rename") async def rename_project(request: Request, data_in: schemas.ProjectRename, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ): """修改项目名""" try: res = await crud.project.rename(db, data_in) except pymongo.errors.DuplicateKeyError: return schemas.Msg(code=-1, msg='项目名已存在') return schemas.Msg(code=0, msg='ok', data=res) @router.post("/add_members") async def add_members(request: Request, game: str, data_in: schemas.ProjectMember, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ): """项目添加成员""" # await crud.project.add_members(db, data_in) for item in data_in.members: casbin_enforcer.add_grouping_policy(item.username, item.role, game) await crud.authority.create(db, 'g', item.username, item.role, game) return schemas.Msg(code=0, msg='ok', data=data_in) @router.get("/members") async def members(request: Request, game: str, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ): """查看项目成员""" roles = await crud.authority.find_many(db, ptype='g', v2=game) data = {item['v0']: {'name': item['v0'], 'role': item['v1']} for item in roles} data['root'] = {'name': 'root', 'role': '超级管理员'} users = await crud.user.get_by_users(db, name={'$in': list(data.keys())}) res = [] for user in users.data: res.append({ **user.dict(), 'role': data[user.name]['role'] }) return schemas.Msg(code=0, msg='ok', data=res) @router.post("/del_member") async def members(request: Request, game: str, data_in: schemas.ProjectDelMember, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ): """删除项目成员""" casbin_enforcer.delete_user(data_in.username) await crud.project.del_members(data_in) await crud.authority.delete(db, ptype='g', v2=game, v0=data_in.username) return schemas.Msg(code=0, msg='ok') @router.post("/kanban") async def read_kanban( data_in: schemas.ProjectKanban, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ): """获取自己的看板""" res = {'kanban': [], 'spaces': []} # 我的看板 kanban = await crud.folder.read_folder(db, project_id=data_in.id, user_id=current_user.id, cat='kanban') for item in kanban: dashboards = await crud.dashboard.find_many(db, pid=item['_id']) res['kanban'].append({ 'name': item['name'], 'children': [], '_id': item['_id'] }) for d in dashboards: res['kanban'][-1]['children'].append({ 'name': d['name'], '_id': item['_id'] }) # 我的空间 where = { 'project_id': data_in.id, 'members._id': current_user.id # '$or': [{'rw_members': current_user.id}, {'r_members': current_user.id}] } spaces = await crud.space.find_many(db, **where) # 空间 文件夹 看板 for item in spaces: res['spaces'].append({ 'name': item['name'], 'children': [], '_id': item['_id'] }) res['spaces'][-1]['authority'] = 'rw' if current_user.id in item['members'] else 'r' for f in await crud.folder.find_many(db, pid=item['_id']): res['spaces'][-1]['children'].append({ 'name': f['name'], '_id': f['_id'], 'children': [], 'isFolder': True }) for d in await crud.dashboard.find_many(db, pid=f['_id']): res['spaces'][-1]['children'][-1]['children'].append({ 'name': d['name'], '_id': d['_id'] }) # 空间 看板 for d in await crud.dashboard.find_many(db, pid=item['_id']): res['spaces'][-1]['children'].append({ 'name': d['name'], '_id': d['_id'], 'isFolder': False }) return schemas.Msg(code=0, msg='ok', data=res)