Build lightweight AI agent admin
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
from typing import Optional
|
||||
from fastapi import Request
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.database import get_db
|
||||
from utils.context import get_current_user_info_from_context
|
||||
from utils.permission import apply_data_scope_filter
|
||||
|
||||
|
||||
def get_data_scope_filter(request: Request):
|
||||
"""
|
||||
FastAPI依赖函数:获取当前请求的数据权限过滤参数
|
||||
|
||||
使用方式:
|
||||
@router.get("/users")
|
||||
async def get_users(
|
||||
data_scope = Depends(get_data_scope_filter),
|
||||
db: AsyncSession = Depends(get_db)
|
||||
):
|
||||
items, total = await UserService.get_list_with_data_scope(
|
||||
db=db,
|
||||
**data_scope, # 自动展开为 role_id, is_superuser, user_id, user_dept_id, request_path, http_method
|
||||
page=page,
|
||||
page_size=page_size
|
||||
)
|
||||
|
||||
:param request: FastAPI Request对象
|
||||
:return: 数据权限参数字典
|
||||
"""
|
||||
# 从上下文获取用户信息(由中间件设置)
|
||||
user_info = get_current_user_info_from_context()
|
||||
|
||||
if not user_info:
|
||||
# 如果上下文中没有用户信息,返回默认值(不应该发生,因为有认证中间件)
|
||||
return {
|
||||
"role_id": None,
|
||||
"is_superuser": False,
|
||||
"user_id": None,
|
||||
"user_dept_id": None,
|
||||
"request_path": request.url.path,
|
||||
"http_method": request.method
|
||||
}
|
||||
|
||||
return {
|
||||
"role_id": user_info.get("role_id"),
|
||||
"is_superuser": user_info.get("is_superuser", False),
|
||||
"user_id": user_info.get("user_id"),
|
||||
"user_dept_id": user_info.get("dept_id"),
|
||||
"request_path": request.url.path,
|
||||
"http_method": request.method
|
||||
}
|
||||
|
||||
|
||||
async def get_data_scope_dict(
|
||||
request: Request,
|
||||
db: AsyncSession = Depends(get_db)
|
||||
):
|
||||
"""
|
||||
FastAPI依赖函数:获取当前请求的数据权限过滤条件字典
|
||||
|
||||
使用方式:
|
||||
@router.get("/users")
|
||||
async def get_users(
|
||||
data_scope_dict = Depends(get_data_scope_dict),
|
||||
db: AsyncSession = Depends(get_db)
|
||||
):
|
||||
# data_scope_dict 包含 filter_type, user_id, dept_id, dept_ids 等
|
||||
if data_scope_dict['filter_type'] == 'self':
|
||||
query = query.where(User.id == data_scope_dict['user_id'])
|
||||
...
|
||||
|
||||
:param request: FastAPI Request对象
|
||||
:param db: 数据库会话
|
||||
:return: 数据权限过滤条件字典
|
||||
"""
|
||||
# 从上下文获取用户信息(由中间件设置)
|
||||
user_info = get_current_user_info_from_context()
|
||||
|
||||
if not user_info:
|
||||
# 如果上下文中没有用户信息,返回默认的全部数据权限
|
||||
return {
|
||||
'scope': 0,
|
||||
'filter_type': 'all',
|
||||
'user_id': None,
|
||||
'dept_id': None,
|
||||
'dept_ids': None,
|
||||
}
|
||||
|
||||
return await apply_data_scope_filter(
|
||||
db=db,
|
||||
role_id=user_info.get("role_id"),
|
||||
is_superuser=user_info.get("is_superuser", False),
|
||||
user_id=user_info.get("user_id"),
|
||||
user_dept_id=user_info.get("dept_id"),
|
||||
request_path=request.url.path,
|
||||
http_method=request.method
|
||||
)
|
||||
|
||||
|
||||
def get_current_user_id(current_user = Depends(get_current_user)) -> str:
|
||||
"""
|
||||
FastAPI依赖函数:获取当前用户ID
|
||||
|
||||
使用方式:
|
||||
@router.post("/posts")
|
||||
async def create_post(
|
||||
data: PostCreate,
|
||||
current_user_id: str = Depends(get_current_user_id),
|
||||
db: AsyncSession = Depends(get_db)
|
||||
):
|
||||
post = await PostService.create(db, data, current_user_id=current_user_id)
|
||||
return post
|
||||
|
||||
:param current_user: 当前用户
|
||||
:return: 用户ID
|
||||
"""
|
||||
return current_user.id
|
||||
Reference in New Issue
Block a user