import json import pymongo from bson import ObjectId from fastapi import APIRouter, Depends, Request from fastapi.encoders import jsonable_encoder from motor.motor_asyncio import AsyncIOMotorDatabase from redis import Redis import crud, schemas from core.config import settings from core.security import get_password_hash from db import get_database from api import deps from db.ckdb import CKDrive, get_ck_db from db.redisdb import get_redis_pool, RedisDrive from utils import casbin_enforcer router = APIRouter() @router.post('/add_data_auth') async def add_data_auth(request: Request, data_id: schemas.DataAuthCreate, game: str = Depends(deps.get_game_project), db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """创建数据权限""" await crud.data_auth.create(db, data_id, game) return schemas.Msg(code=0, msg='ok', data=data_id) @router.post('/edit_data_auth') async def edit_data_auth(request: Request, data_id: schemas.DataAuthEdit, game: str, db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """修改数据权限""" await crud.data_auth.edit_data_auth(db, data_id) return schemas.Msg(code=0, msg='ok', data=data_id) @router.get('/all_event') async def all_event(request: Request, game: str, ck: CKDrive = Depends(get_ck_db), db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """获取所有事件""" values = await ck.distinct(game, 'event', '#event_name') values.sort() return schemas.Msg(code=0, msg='ok', data=values) @router.get("/list") async def data_authority(request: Request, game: str, db: AsyncIOMotorDatabase = Depends(get_database), ck: CKDrive = Depends(get_ck_db), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """获取前项目数据权限""" total_event = await ck.distinct_count(game, 'event', '#event_name') data = await crud.data_auth.get_game_data_auth(db, game) for item in data: item['id'] = str(item['_id']) del item['_id'] item['data_range'] = f'{len(item["data"])}/{total_event}' data = jsonable_encoder(data) return schemas.Msg(code=0, msg='ok', data=data) @router.get("/my_event") async def my_event(request: Request, game: str, db: AsyncIOMotorDatabase = Depends(get_database), rdb: RedisDrive = Depends(get_redis_pool), ck: CKDrive = Depends(get_ck_db), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: """获取自己的事件权限""" # data_auth_id = await crud.authority.get_data_auth_id(db, game, request.user.username) data_auth_id = await crud.authority.get_data_auth_id(db, game, 'sddfdaa') my_data_auth = await crud.data_auth.get(db, ObjectId(data_auth_id)) all_filed = await rdb.get(f'{game}_event') all_filed = json.loads(all_filed) data_attr = await crud.data_attr.find_many(db, game=game, cat='event') data_attr = {item['name']: item for item in data_attr} if not my_data_auth: return schemas.Msg(code=0, msg='ok', data=[]) key_prefix = f'{game}_event_' event_dict = await rdb.smembers_keys(*my_data_auth['data'], prefix=key_prefix) res = [] for k, v in event_dict.items(): event_attr = [] event_filter = [] for item in v: data_type = settings.CK_TYPE_DICT.get(all_filed.get(item)) title = data_attr.get(item, {}).get('show_name') or item event_attr.append( { 'id': item, 'data_type': data_type, 'title': title, 'category': settings.CK_OPERATOR.get(data_type) or [] } ) event_filter.append({ 'id': item, 'data_type': data_type, 'title': title, 'category': settings.CK_FILTER.get(data_type) or [] }) res.append({ 'event_name': k, 'event_attr': [{'id': 'event', 'title': '事件属性', 'category': event_attr}], 'event_filter': [{'id': 'event', 'title': '事件属性', 'category': event_filter}], } ) return schemas.Msg(code=0, msg='ok', data=[{'id': 'event', 'title': '默认分组', 'category': res }])