243 lines
8.4 KiB
Python
243 lines
8.4 KiB
Python
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),
|
|
rdb: RedisDrive = Depends(get_redis_pool),
|
|
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)
|
|
|
|
my_data_auth = []
|
|
if data_auth_id:
|
|
# 所有数据权限
|
|
if data_auth_id == '*':
|
|
my_data_auth = await ck.distinct(game, 'event', '#event_name')
|
|
|
|
else:
|
|
# 设置了数据权限
|
|
my_data_auth = await crud.data_auth.get(db, ObjectId(data_auth_id))
|
|
my_data_auth = my_data_auth['data']
|
|
|
|
if not my_data_auth:
|
|
return schemas.Msg(code=0, msg='ok', data=[])
|
|
|
|
event_list = []
|
|
event_list.append({'id': 'event', 'title': '全部事件', 'category': []})
|
|
for item in my_data_auth:
|
|
event_list[-1]['category'].append({
|
|
'event_name': item,
|
|
# todo 后面添加事件属性管理
|
|
'event_desc': item
|
|
})
|
|
|
|
return schemas.Msg(code=0, msg='ok', data=event_list)
|
|
|
|
|
|
@router.post('/load_prop_quotas')
|
|
async def load_prop_quotas(request: Request,
|
|
game: str,
|
|
data_in: schemas.LoadProQuotas,
|
|
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:
|
|
"""事件属性 聚合条件"""
|
|
key = f'{game}_event_{data_in.event_name}'
|
|
event_prop_set = await rdb.smembers(key)
|
|
event_prop_list = sorted(event_prop_set)
|
|
|
|
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}
|
|
event_props = []
|
|
for item in event_prop_list:
|
|
data_type = settings.CK_TYPE_DICT.get(all_filed.get(item))
|
|
title = data_attr.get(item, {}).get('show_name') or item
|
|
event_prop = {
|
|
'id': item,
|
|
'data_type': data_type,
|
|
'title': title,
|
|
'category': settings.CK_OPERATOR.get(data_type) or []
|
|
}
|
|
event_props.append(event_prop)
|
|
|
|
staid_quots = [
|
|
{
|
|
"id": "*",
|
|
"data_type": None,
|
|
"analysis": "total_count",
|
|
"title": "总次数",
|
|
"category": []
|
|
},
|
|
{
|
|
"id": "*",
|
|
"analysis": "touch_user_count",
|
|
"data_type": None,
|
|
"title": "触发用户数",
|
|
"category": []
|
|
},
|
|
{
|
|
"id": "*",
|
|
"analysis": "touch_user_avg",
|
|
"data_type": None,
|
|
"title": "人均次数",
|
|
"category": []
|
|
},
|
|
]
|
|
|
|
res = {
|
|
'props': event_props,
|
|
'staid_quots': staid_quots
|
|
|
|
}
|
|
|
|
return schemas.Msg(code=0, msg='ok', data=res)
|
|
|
|
|
|
@router.post('/load_filter_props')
|
|
async def load_filter_props(request: Request,
|
|
game: str,
|
|
data_in: schemas.LoadProQuotas,
|
|
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:
|
|
"""事件属性 过滤条件"""
|
|
key = f'{game}_event_{data_in.event_name}'
|
|
event_prop_set = await rdb.smembers(key)
|
|
event_prop_list = sorted(event_prop_set)
|
|
|
|
key = f'{game}_user'
|
|
user_prop_set = await rdb.get(key)
|
|
user_prop_list = sorted(event_prop_set)
|
|
|
|
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}
|
|
event_props = []
|
|
for item in event_prop_list:
|
|
data_type = settings.CK_TYPE_DICT.get(all_filed.get(item))
|
|
title = data_attr.get(item, {}).get('show_name') or item
|
|
event_prop = {
|
|
'id': item,
|
|
'data_type': data_type,
|
|
'title': title,
|
|
'category': settings.CK_FILTER.get(data_type) or []
|
|
}
|
|
event_props.append(event_prop)
|
|
|
|
data_attr = await crud.data_attr.find_many(db, game=game, cat='user')
|
|
data_attr = {item['name']: item for item in data_attr}
|
|
user_props = []
|
|
for item in user_prop_list:
|
|
data_type = settings.CK_TYPE_DICT.get(all_filed.get(item))
|
|
title = data_attr.get(item, {}).get('show_name') or item
|
|
user_prop = {
|
|
'id': item,
|
|
'data_type': data_type,
|
|
'title': title,
|
|
'category': settings.CK_FILTER.get(data_type) or []
|
|
}
|
|
user_props.append(user_prop)
|
|
|
|
res = [
|
|
{
|
|
'title': '事件属性',
|
|
'id': 'event',
|
|
'category': event_props
|
|
},
|
|
{
|
|
'title': '用户属性',
|
|
'id': 'user',
|
|
'category': user_props
|
|
}
|
|
]
|
|
|
|
return schemas.Msg(code=0, msg='ok', data=res)
|