xbackend/api/api_v1/endpoints/project.py
2021-05-14 09:46:28 +08:00

155 lines
5.4 KiB
Python

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 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("/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)
):
"""查看项目成员"""
res = await crud.authority.find_many(db, ptype='g', v2=game)
data = [{'name': 'root', 'role': '超级管理员'}]
data += [{'name': item['v0'], 'role': item['v1']} for item in res]
return schemas.Msg(code=0, msg='ok', data=data)
@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.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)