refactor(core): 重构核心模块结构并更新导入路径 - 将配置相关的设置从 app.core.config 移除 - 将常量定义从 app.core.constants 移除 - 将数据库相关功能从 app.core.database 移除 - 将基础数据库模型从 app.core.db_base 移除 - 将敏感信息掩码功能从 app.core.masking 移除 - 将中间件定义从 app.core.middleware 移除 - 将操作保护功能从 app.core.operation_guard 移除 - 将分页工具从 app.core.pagination 移除 - 将请求上下文管理从 app.core.request_context 移除 - 将调度器功能从 app.core.scheduler 移除 - 将安全认证逻辑从 app.core.security 移除 - 将任务队列相关功能从 app.core.task_queue 移除 - 将时间工具从 app.core.time 移除 - 更新 alembic 配置中的 Base 模型导入路径 - 更新各模块中对重构后组件的引用路径 ```
184 lines
4.8 KiB
Python
184 lines
4.8 KiB
Python
from fastapi import APIRouter, Depends, Query
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.core.background.task_queue import enqueue_risk_event_generation
|
|
from app.core.database import get_db
|
|
from app.core.security import ApiPrincipal, require_api_key, require_operations_enabled
|
|
from app.modules.risk.constants import RiskEventActionKey, RiskGenerationResultKey
|
|
from app.modules.risk.schemas import (
|
|
RiskAssignRequest,
|
|
RiskCloseRequest,
|
|
RiskCommentRequest,
|
|
RiskReopenRequest,
|
|
RiskResolveRequest,
|
|
)
|
|
from app.modules.risk.service import RiskService
|
|
|
|
router = APIRouter(dependencies=[Depends(require_api_key)])
|
|
|
|
|
|
@router.get("/summary")
|
|
def risk_summary(
|
|
db: Session = Depends(get_db),
|
|
) -> dict:
|
|
return RiskService(db).summary()
|
|
|
|
|
|
@router.get("/overdue-tasks")
|
|
def overdue_tasks(
|
|
db: Session = Depends(get_db),
|
|
) -> dict:
|
|
return {RiskGenerationResultKey.ITEMS: RiskService(db).overdue_tasks()}
|
|
|
|
|
|
@router.get("/delayed-projects")
|
|
def delayed_projects(
|
|
db: Session = Depends(get_db),
|
|
) -> dict:
|
|
return {RiskGenerationResultKey.ITEMS: RiskService(db).delayed_projects()}
|
|
|
|
|
|
@router.get("/over-budget-projects")
|
|
def over_budget_projects(
|
|
db: Session = Depends(get_db),
|
|
) -> dict:
|
|
return {RiskGenerationResultKey.ITEMS: RiskService(db).over_budget_projects()}
|
|
|
|
|
|
@router.get("/funds")
|
|
def fund_risks(
|
|
db: Session = Depends(get_db),
|
|
) -> dict:
|
|
return {RiskGenerationResultKey.ITEMS: RiskService(db).fund_risks()}
|
|
|
|
|
|
@router.get("/suppliers")
|
|
def supplier_risks(
|
|
db: Session = Depends(get_db),
|
|
) -> dict:
|
|
return {RiskGenerationResultKey.ITEMS: RiskService(db).supplier_risks()}
|
|
|
|
|
|
@router.get("/events")
|
|
def risk_events(
|
|
limit: int = Query(default=100, ge=1, le=500),
|
|
status: str | None = None,
|
|
db: Session = Depends(get_db),
|
|
) -> dict:
|
|
return {
|
|
RiskGenerationResultKey.ITEMS: RiskService(db).list_events(
|
|
limit=limit,
|
|
status_filter=status,
|
|
)
|
|
}
|
|
|
|
|
|
@router.get("/events/{event_id}/actions")
|
|
def risk_event_actions(
|
|
event_id: int,
|
|
limit: int = Query(default=100, ge=1, le=500),
|
|
db: Session = Depends(get_db),
|
|
) -> dict:
|
|
return {
|
|
RiskEventActionKey.ITEMS: RiskService(db).list_actions(
|
|
risk_event_id=event_id,
|
|
limit=limit,
|
|
)
|
|
}
|
|
|
|
|
|
@router.post("/events/{event_id}/assign")
|
|
def assign_risk_event(
|
|
event_id: int,
|
|
payload: RiskAssignRequest,
|
|
db: Session = Depends(get_db),
|
|
principal: ApiPrincipal = Depends(require_api_key),
|
|
) -> dict:
|
|
require_operations_enabled()
|
|
return RiskService(db).assign_event(
|
|
event_id,
|
|
assigned_to=payload.assigned_to,
|
|
comment=payload.comment,
|
|
actor=principal.actor,
|
|
)
|
|
|
|
|
|
@router.post("/events/{event_id}/comment")
|
|
def comment_risk_event(
|
|
event_id: int,
|
|
payload: RiskCommentRequest,
|
|
db: Session = Depends(get_db),
|
|
principal: ApiPrincipal = Depends(require_api_key),
|
|
) -> dict:
|
|
require_operations_enabled()
|
|
return RiskService(db).comment_event(
|
|
event_id,
|
|
comment=payload.comment,
|
|
payload=payload.payload,
|
|
actor=principal.actor,
|
|
)
|
|
|
|
|
|
@router.post("/events/{event_id}/resolve")
|
|
def resolve_risk_event(
|
|
event_id: int,
|
|
payload: RiskResolveRequest,
|
|
db: Session = Depends(get_db),
|
|
principal: ApiPrincipal = Depends(require_api_key),
|
|
) -> dict:
|
|
require_operations_enabled()
|
|
return RiskService(db).resolve_event(
|
|
event_id,
|
|
comment=payload.comment,
|
|
payload=payload.payload,
|
|
actor=principal.actor,
|
|
)
|
|
|
|
|
|
@router.post("/events/{event_id}/close")
|
|
def close_risk_event(
|
|
event_id: int,
|
|
payload: RiskCloseRequest,
|
|
db: Session = Depends(get_db),
|
|
principal: ApiPrincipal = Depends(require_api_key),
|
|
) -> dict:
|
|
require_operations_enabled()
|
|
return RiskService(db).close_event(
|
|
event_id,
|
|
closed_reason=payload.closed_reason,
|
|
review_summary=payload.review_summary,
|
|
actor=principal.actor,
|
|
)
|
|
|
|
|
|
@router.post("/events/{event_id}/reopen")
|
|
def reopen_risk_event(
|
|
event_id: int,
|
|
payload: RiskReopenRequest,
|
|
db: Session = Depends(get_db),
|
|
principal: ApiPrincipal = Depends(require_api_key),
|
|
) -> dict:
|
|
require_operations_enabled()
|
|
return RiskService(db).reopen_event(
|
|
event_id,
|
|
comment=payload.comment,
|
|
actor=principal.actor,
|
|
)
|
|
|
|
|
|
@router.post("/events/generate")
|
|
def generate_risk_events(
|
|
db: Session = Depends(get_db),
|
|
principal: ApiPrincipal = Depends(require_api_key),
|
|
) -> dict:
|
|
require_operations_enabled()
|
|
return RiskService(db).generate_events(actor=principal.actor)
|
|
|
|
|
|
@router.post("/events/enqueue")
|
|
def enqueue_risk_events(
|
|
principal: ApiPrincipal = Depends(require_api_key),
|
|
) -> dict:
|
|
require_operations_enabled()
|
|
return enqueue_risk_event_generation(actor=principal.actor)
|