Commit 873f54d8 authored by 杨明橙's avatar 杨明橙

修改账单接口 相关权限验证

parent df3c5cc6
...@@ -2,7 +2,8 @@ from typing import Union, List, Any ...@@ -2,7 +2,8 @@ from typing import Union, List, Any
from fastapi import APIRouter, Depends, Query from fastapi import APIRouter, Depends, Query
from motor.core import AgnosticCollection from motor.core import AgnosticCollection
from dependencies import get_current_user, get_fund_collect, get_bill_collect from dependencies import get_current_user, get_fund_collect, get_bill_collect, get_permission_user_collect, \
get_permission_role_collect
from model import Response, Page, PageResponse, SortParams, FilterTime from model import Response, Page, PageResponse, SortParams, FilterTime
from model.bill import PCFBill, ExchangeBill, AdjustBill, StakingBill from model.bill import PCFBill, ExchangeBill, AdjustBill, StakingBill
from model.node import BaseNode from model.node import BaseNode
...@@ -13,9 +14,17 @@ from schema.node import BindNode ...@@ -13,9 +14,17 @@ from schema.node import BindNode
from service.beacon import BeaconChaService from service.beacon import BeaconChaService
from service.bill import update_bill from service.bill import update_bill
from service.fund import query_fund_assets_and_nodes, update_fund from service.fund import query_fund_assets_and_nodes, update_fund
from service.permission import check_permission
from tools.jwt_tools import User from tools.jwt_tools import User
router = APIRouter() router = APIRouter()
bill_type_to_permission = {
"sub": 'sub_redeem_bill',
"redemption": 'sub_redeem_bill',
"exchange": 'swap_bill',
"staking": 'staking_bill',
"adjust": 'adjust_bill'
}
@router.post('/pcf/', @router.post('/pcf/',
...@@ -28,7 +37,13 @@ async def create_pcf( ...@@ -28,7 +37,13 @@ async def create_pcf(
user: User = Depends(get_current_user), user: User = Depends(get_current_user),
fund_collect: AgnosticCollection = Depends(get_fund_collect), fund_collect: AgnosticCollection = Depends(get_fund_collect),
bill_collect: AgnosticCollection = Depends(get_bill_collect), bill_collect: AgnosticCollection = Depends(get_bill_collect),
permission_user_collect: AgnosticCollection = Depends(get_permission_user_collect),
permission_role_collect: AgnosticCollection = Depends(get_permission_role_collect)
): ):
await check_permission(['data_permission.sub_redeem_bill.add'],
create_pcf_bill.fund_id,
user.email, permission_user_collect,
permission_role_collect)
delta_volume = create_pcf_bill.volume if create_pcf_bill.bill_type == PCFBillType.sub else -create_pcf_bill.volume delta_volume = create_pcf_bill.volume if create_pcf_bill.bill_type == PCFBillType.sub else -create_pcf_bill.volume
assets, adjust_assets, pending_assets, staking_assets, nodes = await query_fund_assets_and_nodes(fund_collect, assets, adjust_assets, pending_assets, staking_assets, nodes = await query_fund_assets_and_nodes(fund_collect,
...@@ -55,7 +70,13 @@ async def create_exchange( ...@@ -55,7 +70,13 @@ async def create_exchange(
user: User = Depends(get_current_user), user: User = Depends(get_current_user),
fund_collect: AgnosticCollection = Depends(get_fund_collect), fund_collect: AgnosticCollection = Depends(get_fund_collect),
bill_collect: AgnosticCollection = Depends(get_bill_collect), bill_collect: AgnosticCollection = Depends(get_bill_collect),
permission_user_collect: AgnosticCollection = Depends(get_permission_user_collect),
permission_role_collect: AgnosticCollection = Depends(get_permission_role_collect)
): ):
await check_permission(['data_permission.swap_bill.add'],
create_exchange_bill.fund_id,
user.email, permission_user_collect,
permission_role_collect)
assets, adjust_assets, pending_assets, staking_assets, nodes = await query_fund_assets_and_nodes(fund_collect, assets, adjust_assets, pending_assets, staking_assets, nodes = await query_fund_assets_and_nodes(fund_collect,
create_exchange_bill.fund_id, create_exchange_bill.fund_id,
user.id, user.id,
...@@ -87,7 +108,14 @@ async def create_adjust( ...@@ -87,7 +108,14 @@ async def create_adjust(
user: User = Depends(get_current_user), user: User = Depends(get_current_user),
fund_collect: AgnosticCollection = Depends(get_fund_collect), fund_collect: AgnosticCollection = Depends(get_fund_collect),
bill_collect: AgnosticCollection = Depends(get_bill_collect), bill_collect: AgnosticCollection = Depends(get_bill_collect),
permission_user_collect: AgnosticCollection = Depends(get_permission_user_collect),
permission_role_collect: AgnosticCollection = Depends(get_permission_role_collect)
): ):
await check_permission(['data_permission.adjust_bill.add'],
create_adjust_bill.fund_id,
user.email, permission_user_collect,
permission_role_collect)
assets, adjust_assets, pending_assets, staking_assets, nodes = await query_fund_assets_and_nodes(fund_collect, assets, adjust_assets, pending_assets, staking_assets, nodes = await query_fund_assets_and_nodes(fund_collect,
create_adjust_bill.fund_id, create_adjust_bill.fund_id,
user.id, user.id,
...@@ -114,8 +142,15 @@ async def create_staking_api( ...@@ -114,8 +142,15 @@ async def create_staking_api(
user: User = Depends(get_current_user), user: User = Depends(get_current_user),
bill_collect: AgnosticCollection = Depends(get_bill_collect), bill_collect: AgnosticCollection = Depends(get_bill_collect),
fund_collect: AgnosticCollection = Depends(get_fund_collect), fund_collect: AgnosticCollection = Depends(get_fund_collect),
beacon_service: BeaconChaService = Depends(BeaconChaService) beacon_service: BeaconChaService = Depends(BeaconChaService),
permission_user_collect: AgnosticCollection = Depends(get_permission_user_collect),
permission_role_collect: AgnosticCollection = Depends(get_permission_role_collect)
): ):
await check_permission(['data_permission.staking_bill.add'],
create_staking_bill.fund_id,
user.email, permission_user_collect,
permission_role_collect)
assets, adjust_assets, pending_assets, staking_assets, nodes = await query_fund_assets_and_nodes(fund_collect, assets, adjust_assets, pending_assets, staking_assets, nodes = await query_fund_assets_and_nodes(fund_collect,
user_id=user.id, user_id=user.id,
fund_id=create_staking_bill.fund_id, fund_id=create_staking_bill.fund_id,
...@@ -158,7 +193,13 @@ async def update_pcf_bill( ...@@ -158,7 +193,13 @@ async def update_pcf_bill(
user: User = Depends(get_current_user), user: User = Depends(get_current_user),
fund_collect: AgnosticCollection = Depends(get_fund_collect), fund_collect: AgnosticCollection = Depends(get_fund_collect),
bill_collect: AgnosticCollection = Depends(get_bill_collect), bill_collect: AgnosticCollection = Depends(get_bill_collect),
permission_user_collect: AgnosticCollection = Depends(get_permission_user_collect),
permission_role_collect: AgnosticCollection = Depends(get_permission_role_collect)
): ):
await check_permission(['data_permission.sub_redeem_bill.edit'],
fund_id,
user.email, permission_user_collect,
permission_role_collect)
response = await update_bill( response = await update_bill(
bill_id=bill_id, bill_id=bill_id,
fund_id=fund_id, fund_id=fund_id,
...@@ -183,7 +224,13 @@ async def update_exchange_bill( ...@@ -183,7 +224,13 @@ async def update_exchange_bill(
user: User = Depends(get_current_user), user: User = Depends(get_current_user),
fund_collect: AgnosticCollection = Depends(get_fund_collect), fund_collect: AgnosticCollection = Depends(get_fund_collect),
bill_collect: AgnosticCollection = Depends(get_bill_collect), bill_collect: AgnosticCollection = Depends(get_bill_collect),
permission_user_collect: AgnosticCollection = Depends(get_permission_user_collect),
permission_role_collect: AgnosticCollection = Depends(get_permission_role_collect)
): ):
await check_permission(['data_permission.swap_bill.edit'],
fund_id,
user.email, permission_user_collect,
permission_role_collect)
response = await update_bill( response = await update_bill(
bill_id=bill_id, bill_id=bill_id,
fund_id=fund_id, fund_id=fund_id,
...@@ -208,7 +255,13 @@ async def update_adjust_bill( ...@@ -208,7 +255,13 @@ async def update_adjust_bill(
user: User = Depends(get_current_user), user: User = Depends(get_current_user),
fund_collect: AgnosticCollection = Depends(get_fund_collect), fund_collect: AgnosticCollection = Depends(get_fund_collect),
bill_collect: AgnosticCollection = Depends(get_bill_collect), bill_collect: AgnosticCollection = Depends(get_bill_collect),
permission_user_collect: AgnosticCollection = Depends(get_permission_user_collect),
permission_role_collect: AgnosticCollection = Depends(get_permission_role_collect)
): ):
await check_permission(['data_permission.adjust_bill.edit'],
fund_id,
user.email, permission_user_collect,
permission_role_collect)
response = await update_bill( response = await update_bill(
bill_id=bill_id, bill_id=bill_id,
fund_id=fund_id, fund_id=fund_id,
...@@ -233,7 +286,13 @@ async def update_staking_bill( ...@@ -233,7 +286,13 @@ async def update_staking_bill(
user: User = Depends(get_current_user), user: User = Depends(get_current_user),
fund_collect: AgnosticCollection = Depends(get_fund_collect), fund_collect: AgnosticCollection = Depends(get_fund_collect),
bill_collect: AgnosticCollection = Depends(get_bill_collect), bill_collect: AgnosticCollection = Depends(get_bill_collect),
permission_user_collect: AgnosticCollection = Depends(get_permission_user_collect),
permission_role_collect: AgnosticCollection = Depends(get_permission_role_collect)
): ):
await check_permission(['data_permission.staking_bill.edit'],
fund_id,
user.email, permission_user_collect,
permission_role_collect)
response = await update_bill( response = await update_bill(
bill_id=bill_id, bill_id=bill_id,
fund_id=fund_id, fund_id=fund_id,
...@@ -259,7 +318,14 @@ async def query_bill( ...@@ -259,7 +318,14 @@ async def query_bill(
page: Page = Depends(Page), page: Page = Depends(Page),
user: User = Depends(get_current_user), user: User = Depends(get_current_user),
bill_collect: AgnosticCollection = Depends(get_bill_collect), bill_collect: AgnosticCollection = Depends(get_bill_collect),
permission_user_collect: AgnosticCollection = Depends(get_permission_user_collect),
permission_role_collect: AgnosticCollection = Depends(get_permission_role_collect)
): ):
await check_permission([f'data_permission.{bill_type_to_permission[item.value]}.query' for item in query],
fund_id,
user.email, permission_user_collect,
permission_role_collect)
query = {"fund_id": fund_id, "user_id": user.id, "bill_type": {'$in': query}} query = {"fund_id": fund_id, "user_id": user.id, "bill_type": {'$in': query}}
if filter_time.start_time and filter_time.end_time: if filter_time.start_time and filter_time.end_time:
query.update({'record_time': filter_time.to_mongodb_query()}) query.update({'record_time': filter_time.to_mongodb_query()})
...@@ -282,8 +348,15 @@ async def query_bill( ...@@ -282,8 +348,15 @@ async def query_bill(
bill_id: str, bill_id: str,
bill_type: AllBillType, bill_type: AllBillType,
bill_collect: AgnosticCollection = Depends(get_bill_collect), bill_collect: AgnosticCollection = Depends(get_bill_collect),
user: User = Depends(get_current_user) user: User = Depends(get_current_user),
permission_user_collect: AgnosticCollection = Depends(get_permission_user_collect),
permission_role_collect: AgnosticCollection = Depends(get_permission_role_collect)
): ):
await check_permission([f'data_permission.{bill_type_to_permission[bill_type.value]}.delete'],
fund_id,
user.email, permission_user_collect,
permission_role_collect)
query = {"fund_id": fund_id, "user_id": user.id, "bill_type": bill_type, "id": bill_id} query = {"fund_id": fund_id, "user_id": user.id, "bill_type": bill_type, "id": bill_id}
await bill_collect.delete_one(query) await bill_collect.delete_one(query)
return Response() return Response()
...@@ -98,10 +98,8 @@ async def update( ...@@ -98,10 +98,8 @@ async def update(
fund_collect: AgnosticCollection = Depends(get_fund_collect) fund_collect: AgnosticCollection = Depends(get_fund_collect)
): ):
# 验证权限 # 验证权限
if not await check_permission(['data_permission.fund.update_info'], fund_id, user.email, permission_user_collect, await check_permission(['data_permission.fund.update_info'], fund_id, user.email, permission_user_collect,
permission_role_collect): permission_role_collect)
raise FundPermissionError()
db_update_data = update_fund_data.dict(exclude_unset=True) db_update_data = update_fund_data.dict(exclude_unset=True)
db_update_data.update({ db_update_data.update({
"update_time": int(datetime.datetime.utcnow().timestamp()) "update_time": int(datetime.datetime.utcnow().timestamp())
...@@ -123,9 +121,8 @@ async def get( ...@@ -123,9 +121,8 @@ async def get(
permission_role_collect: AgnosticCollection = Depends(get_permission_role_collect) permission_role_collect: AgnosticCollection = Depends(get_permission_role_collect)
): ):
# 验证权限 # 验证权限
if not await check_permission(['data_permission.fund.query_info'], fund_id, user.email, permission_user_collect, await check_permission(['data_permission.fund.query_info'], fund_id, user.email, permission_user_collect,
permission_role_collect): permission_role_collect)
raise FundPermissionError()
data = await fund_collect.find_one({'id': fund_id}) data = await fund_collect.find_one({'id': fund_id})
assert data, NotFundError() assert data, NotFundError()
...@@ -156,7 +153,7 @@ async def get( ...@@ -156,7 +153,7 @@ async def get(
fund_id = item['fund_id'] fund_id = item['fund_id']
task = g.create_task( task = g.create_task(
check_permission(['data_permission.fund.query_info'], fund_id, user.email, permission_user_collect, check_permission(['data_permission.fund.query_info'], fund_id, user.email, permission_user_collect,
permission_role_collect)) permission_role_collect, raise_exception=False))
tasks[fund_id] = task tasks[fund_id] = task
auth_fund_list = [k for k, v in tasks.items() if v.result()] auth_fund_list = [k for k, v in tasks.items() if v.result()]
......
...@@ -28,17 +28,14 @@ async def create_permission( ...@@ -28,17 +28,14 @@ async def create_permission(
): ):
# 检查是否有权限添加用户 # 检查是否有权限添加用户
assert 'admin' not in create_user_info.roles, FundPermissionError() # 不可添加admin assert 'admin' not in create_user_info.roles, FundPermissionError() # 不可添加admin
is_auth = await check_permission([f'member_permission.{role}.add' for role in create_user_info.roles], await check_permission([f'member_permission.{role}.add' for role in create_user_info.roles],
create_user_info.fund_id, create_user_info.fund_id,
user.email, permission_user_collect, user.email, permission_user_collect,
permission_role_collect) permission_role_collect)
if is_auth: query = {"fund_id": create_user_info.fund_id, "email": create_user_info.email}
query = {"fund_id": create_user_info.fund_id, "email": create_user_info.email} update = {"$addToSet": {"roles": {"$each": create_user_info.roles}}}
update = {"$addToSet": {"roles": {"$each": create_user_info.roles}}} await permission_user_collect.update_one(query, update, upsert=True)
await permission_user_collect.update_one(query, update, upsert=True) return Response(data='')
return Response(data='')
else:
raise FundPermissionError()
@router.delete('/user/', @router.delete('/user/',
...@@ -53,17 +50,14 @@ async def delete_permission( ...@@ -53,17 +50,14 @@ async def delete_permission(
): ):
# 检查是否有权限添加用户 # 检查是否有权限添加用户
assert 'admin' not in delete_user_info.roles, FundPermissionError('无法删除 admin') # 不可删除admin assert 'admin' not in delete_user_info.roles, FundPermissionError('无法删除 admin') # 不可删除admin
is_auth = await check_permission([f'member_permission.{role}.add' for role in delete_user_info.roles], await check_permission([f'member_permission.{role}.add' for role in delete_user_info.roles],
delete_user_info.fund_id, delete_user_info.fund_id,
user.email, permission_user_collect, user.email, permission_user_collect,
permission_role_collect) permission_role_collect)
if is_auth: query = {"fund_id": delete_user_info.fund_id, "email": delete_user_info.email}
query = {"fund_id": delete_user_info.fund_id, "email": delete_user_info.email} update = {"$pull": {"roles": {"$in": delete_user_info.roles}}}
update = {"$pull": {"roles": {"$in": delete_user_info.roles}}} await permission_user_collect.update_one(query, update, upsert=True)
await permission_user_collect.update_one(query, update, upsert=True) return Response(data='')
return Response(data='')
else:
raise FundPermissionError()
@router.get('/user/', @router.get('/user/',
......
...@@ -2,259 +2,9 @@ import json ...@@ -2,259 +2,9 @@ import json
from motor.core import AgnosticCollection from motor.core import AgnosticCollection
from exception.token import FundPermissionError
from schema.permission import CreateRole, CreateUserInfo from schema.permission import CreateRole, CreateUserInfo
# sys_permission_table = [
# {
# "code": 'data_permission',
# "label": "数据管理权限",
# "children": [
# # 基金管理
# {
# "code": "data_permission.fund",
# "label": '基金管理',
# "children": [
# {
# "code": "data_permission.fund.query_info",
# "label": "查询基金基础信息"
# },
# {
# "code": "data_permission.fund.update_info",
# "label": "更新基金基础信息"
# },
# {
# "code": "data_permission.fund.query_list",
# "label": "查询基金列表"
# },
# {
# "code": "data_permission.fund.query_asset",
# "label": "访问账目页面"
# },
# ]
# },
# # 质押节点
# {
# "code": "data_permission.node",
# "label": '质押节点',
# "children": [
# {
# "code": "data_permission.node.bind_node",
# "label": "绑定节点"
# },
# {
# "code": "data_permission.node.untie_node",
# "label": "解绑节点"
# },
# {
# "code": "data_permission.node.query_node",
# "label": "查询节点"
# }
# ]
# },
# # 账目-申购/赎回
# {
# "code": "data_permission.sub_redeem_bill",
# "label": '账目-申购/赎回',
# "children": [
# {
# "code": "data_permission.sub_redeem_bill.add",
# "label": "添加"
# },
# {
# "code": "data_permission.sub_redeem_bill.delete",
# "label": "删除"
# },
# {
# "code": "data_permission.sub_redeem_bill.edit",
# "label": "修改"
# },
# {
# "code": "data_permission.sub_redeem_bill.query",
# "label": "查询"
# },
# ]
# },
# # 账目-换币
# {
# "code": "data_permission.swap_bill",
# "label": '账目-换币',
# "children": [
# {
# "code": "data_permission.swap_bill.add",
# "label": "添加"
# },
# {
# "code": "data_permission.swap_bill.delete",
# "label": "删除"
# },
# {
# "code": "data_permission.swap_bill.edit",
# "label": "修改"
# },
# {
# "code": "data_permission.swap_bill.query",
# "label": "查询"
# },
# ]
# },
# # 账目-质押
# {
# "code": "data_permission.staking_bill",
# "label": '账目-质押',
# "children": [
# {
# "code": "data_permission.staking_bill.add",
# "label": "添加"
# },
# {
# "code": "data_permission.staking_bill.delete",
# "label": "删除"
# },
# {
# "code": "data_permission.staking_bill.edit",
# "label": "修改"
# },
# {
# "code": "data_permission.staking_bill.query",
# "label": "查询"
# },
# ]
# },
# # 账目-调整账户
# {
# "code": "data_permission.adjust_bill",
# "label": '账目-调整账户',
# "children": [
# {
# "code": "data_permission.adjust_bill.add",
# "label": "添加"
# },
# {
# "code": "data_permission.adjust_bill.delete",
# "label": "删除"
# },
# {
# "code": "data_permission.adjust_bill.edit",
# "label": "修改"
# },
# {
# "code": "data_permission.adjust_bill.query",
# "label": "查询"
# },
# ]
# },
# # 净值管理
# {
# "code": "data_permission.nav",
# "label": '净值管理',
# "children": [
# {
# "code": "data_permission.nav.recalculate",
# "label": "基金重新计算净值"
# },
# {
# "code": "data_permission.nav.add",
# "label": "新增"
# },
# {
# "code": "data_permission.nav.delete",
# "label": "删除"
# },
# {
# "code": "data_permission.nav.edit",
# "label": "修改"
# },
# {
# "code": "data_permission.nav.query",
# "label": "查询"
# },
# ]
# },
# ]
# },
# {
# "code": 'role_permission',
# "label": "角色管理权限",
# "children": [
# # 角色的管理
# {
# "code": "role_permission.role",
# "label": '角色管理',
# "children": [
# {
# "code": "role_permission.role.add",
# "label": "添加"
# },
# {
# "code": "role_permission.role.delete",
# "label": "删除"
# },
# {
# "code": "role_permission.role.edit",
# "label": "修改"
# },
# {
# "code": "role_permission.role.query",
# "label": "查询"
# },
# ]
# },
# ]
# },
# {
# "code": 'member_permission',
# "label": "人员管理权限",
# "children": [
# # 基金经理人员的管理
# {
# "code": "member_permission.fund_manager",
# "label": '基金经理',
# "children": [
# {
# "code": "member_permission.fund_manager.add",
# "label": "添加"
# },
# {
# "code": "member_permission.fund_manager.delete",
# "label": "删除"
# },
# {
# "code": "member_permission.fund_manager.edit",
# "label": "修改"
# },
# {
# "code": "member_permission.fund_manager.query",
# "label": "查询"
# },
# ]
# },
# # 基金经理助理
# {
# "code": "member_permission.fund_manager_assistant",
# "label": '基金经理助理',
# "children": [
# {
# "code": "member_permission.fund_manager_assistant.add",
# "label": "添加"
# },
# {
# "code": "member_permission.fund_manager_assistant.delete",
# "label": "删除"
# },
# {
# "code": "member_permission.fund_manager_assistant.edit",
# "label": "修改"
# },
# {
# "code": "member_permission.fund_manager_assistant.query",
# "label": "查询"
# },
# ]
# },
# ]
# }
# ]
sys_default_permission = { sys_default_permission = {
"data_permission": { "data_permission": {
"label": "数据管理权限", "label": "数据管理权限",
...@@ -570,7 +320,7 @@ async def find_all_roles(fund_id, permission_role_collect: AgnosticCollection): ...@@ -570,7 +320,7 @@ async def find_all_roles(fund_id, permission_role_collect: AgnosticCollection):
async def check_permission(for_check_permission_list, fund_id, email, permission_user_collect, async def check_permission(for_check_permission_list, fund_id, email, permission_user_collect,
permission_role_collect): permission_role_collect, raise_exception=True):
""" """
验证的权限同时都满足 返回True 否则返回False 验证的权限同时都满足 返回True 否则返回False
:param for_check_permission_list: :param for_check_permission_list:
...@@ -578,18 +328,25 @@ async def check_permission(for_check_permission_list, fund_id, email, permission ...@@ -578,18 +328,25 @@ async def check_permission(for_check_permission_list, fund_id, email, permission
:param email: :param email:
:param permission_user_collect: :param permission_user_collect:
:param permission_role_collect: :param permission_role_collect:
:param raise_exception: 是否抛出异常
:return: :return:
""" """
this_fund_role = await permission_user_collect.find_one({'email': email, 'fund_id': fund_id}) this_fund_role = await permission_user_collect.find_one({'email': email, 'fund_id': fund_id})
if not this_fund_role: if not this_fund_role:
return False if raise_exception:
raise FundPermissionError()
else:
return FundPermissionError
else: else:
permission_list, roles = await find_user_permission(fund_id, email, permission_user_collect, permission_list, roles = await find_user_permission(fund_id, email, permission_user_collect,
permission_role_collect) permission_role_collect)
if all(x in permission_list for x in for_check_permission_list): if all(x in permission_list for x in for_check_permission_list):
return True return True
else: else:
return False if raise_exception:
raise FundPermissionError()
else:
return FundPermissionError
async def find_user_permission(fund_id, email, permission_user_collect, permission_role_collect): async def find_user_permission(fund_id, email, permission_user_collect, permission_role_collect):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment