feat: 添加飞书用户模块和订阅功能支持 - 新增feishu_users模块用于处理飞书用户身份验证和权限管理 - 新增subscriptions模块用于处理订阅相关功能 - 新增personalization模块用于个性化服务 - 在alembic迁移配置中注册新的模型模块 - 在API路由器中添加feishu_users和subscriptions路由 - 实现事件调度服务的改进,包括错误处理和状态更新优化 - 添加飞书命令处理的权限检查机制 - 实现飞书应用票据事件处理 - 改进审计日志记录功能 ```
81 lines
2.4 KiB
Python
81 lines
2.4 KiB
Python
from fastapi import APIRouter, Depends, Query
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.application.feishu.personal_data import FeishuPersonalDataService
|
|
from app.core.database import get_db
|
|
from app.core.security import ApiPrincipal, require_api_key
|
|
from app.modules.feishu_users.constants import FeishuUserRole, FeishuUserStatus
|
|
from app.modules.feishu_users.schemas import (
|
|
FeishuUserListRead,
|
|
FeishuUserRead,
|
|
FeishuUserUpdate,
|
|
)
|
|
from app.modules.feishu_users.services import FeishuUserManagementService
|
|
from app.modules.personalization.schemas import ErasureResult
|
|
|
|
router = APIRouter(prefix="/users", dependencies=[Depends(require_api_key)])
|
|
|
|
|
|
@router.get("", response_model=FeishuUserListRead)
|
|
def list_users(
|
|
role: FeishuUserRole | None = None,
|
|
status_filter: FeishuUserStatus | None = Query(default=None, alias="status"),
|
|
tenant_key: str | None = None,
|
|
limit: int = Query(default=100, ge=1, le=500),
|
|
offset: int = Query(default=0, ge=0),
|
|
db: Session = Depends(get_db),
|
|
principal: ApiPrincipal = Depends(require_api_key),
|
|
) -> dict:
|
|
items, total = FeishuUserManagementService(db).list_users(
|
|
role=role,
|
|
status_filter=status_filter,
|
|
tenant_key=tenant_key,
|
|
limit=limit,
|
|
offset=offset,
|
|
actor=principal.actor,
|
|
)
|
|
return {
|
|
"items": items,
|
|
"total": total,
|
|
"limit": limit,
|
|
"offset": offset,
|
|
}
|
|
|
|
|
|
@router.get("/{code}", response_model=FeishuUserRead)
|
|
def get_user(
|
|
code: str,
|
|
db: Session = Depends(get_db),
|
|
principal: ApiPrincipal = Depends(require_api_key),
|
|
) -> FeishuUserRead:
|
|
return FeishuUserManagementService(db).get_user(
|
|
code,
|
|
actor=principal.actor,
|
|
)
|
|
|
|
|
|
@router.patch("/{code}", response_model=FeishuUserRead)
|
|
def update_user(
|
|
code: str,
|
|
payload: FeishuUserUpdate,
|
|
db: Session = Depends(get_db),
|
|
principal: ApiPrincipal = Depends(require_api_key),
|
|
) -> FeishuUserRead:
|
|
return FeishuUserManagementService(db).update_user(
|
|
code,
|
|
changes=payload.model_dump(exclude_unset=True),
|
|
actor=principal.actor,
|
|
)
|
|
|
|
|
|
@router.delete("/{code}/personal-data", response_model=ErasureResult)
|
|
def erase_user_personal_data(
|
|
code: str,
|
|
db: Session = Depends(get_db),
|
|
principal: ApiPrincipal = Depends(require_api_key),
|
|
) -> ErasureResult:
|
|
return FeishuPersonalDataService(db).erase_by_user_code(
|
|
code,
|
|
actor=principal.actor,
|
|
)
|