110 lines
3.5 KiB
Python
110 lines
3.5 KiB
Python
|
|
"""
|
||
|
|
Alert Rules Router - 告警规则配置接口
|
||
|
|
API endpoints for alert rule CRUD operations.
|
||
|
|
"""
|
||
|
|
|
||
|
|
from fastapi import APIRouter, Depends, HTTPException
|
||
|
|
from sqlalchemy import select
|
||
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||
|
|
|
||
|
|
from app.database import get_db
|
||
|
|
from app.dependencies import require_write
|
||
|
|
from app.models import AlertRule
|
||
|
|
from app.schemas import (
|
||
|
|
APIResponse,
|
||
|
|
AlertRuleCreate,
|
||
|
|
AlertRuleResponse,
|
||
|
|
AlertRuleUpdate,
|
||
|
|
)
|
||
|
|
|
||
|
|
router = APIRouter(prefix="/api/alert-rules", tags=["Alert Rules / 告警规则"])
|
||
|
|
|
||
|
|
|
||
|
|
@router.get(
|
||
|
|
"",
|
||
|
|
response_model=APIResponse[list[AlertRuleResponse]],
|
||
|
|
summary="获取告警规则列表 / List alert rules",
|
||
|
|
)
|
||
|
|
async def list_rules(db: AsyncSession = Depends(get_db)):
|
||
|
|
"""获取所有告警规则。"""
|
||
|
|
result = await db.execute(select(AlertRule).order_by(AlertRule.id))
|
||
|
|
rules = list(result.scalars().all())
|
||
|
|
return APIResponse(data=[AlertRuleResponse.model_validate(r) for r in rules])
|
||
|
|
|
||
|
|
|
||
|
|
@router.post(
|
||
|
|
"",
|
||
|
|
response_model=APIResponse[AlertRuleResponse],
|
||
|
|
status_code=201,
|
||
|
|
summary="创建告警规则 / Create alert rule",
|
||
|
|
dependencies=[Depends(require_write)],
|
||
|
|
)
|
||
|
|
async def create_rule(body: AlertRuleCreate, db: AsyncSession = Depends(get_db)):
|
||
|
|
"""创建新告警规则。"""
|
||
|
|
rule = AlertRule(
|
||
|
|
name=body.name,
|
||
|
|
rule_type=body.rule_type,
|
||
|
|
conditions=body.conditions,
|
||
|
|
is_active=body.is_active,
|
||
|
|
device_ids=body.device_ids,
|
||
|
|
group_id=body.group_id,
|
||
|
|
description=body.description,
|
||
|
|
)
|
||
|
|
db.add(rule)
|
||
|
|
await db.flush()
|
||
|
|
await db.refresh(rule)
|
||
|
|
return APIResponse(data=AlertRuleResponse.model_validate(rule))
|
||
|
|
|
||
|
|
|
||
|
|
@router.get(
|
||
|
|
"/{rule_id}",
|
||
|
|
response_model=APIResponse[AlertRuleResponse],
|
||
|
|
summary="获取告警规则详情 / Get alert rule",
|
||
|
|
)
|
||
|
|
async def get_rule(rule_id: int, db: AsyncSession = Depends(get_db)):
|
||
|
|
"""获取告警规则详情。"""
|
||
|
|
result = await db.execute(select(AlertRule).where(AlertRule.id == rule_id))
|
||
|
|
rule = result.scalar_one_or_none()
|
||
|
|
if not rule:
|
||
|
|
raise HTTPException(status_code=404, detail=f"规则 {rule_id} 不存在")
|
||
|
|
return APIResponse(data=AlertRuleResponse.model_validate(rule))
|
||
|
|
|
||
|
|
|
||
|
|
@router.put(
|
||
|
|
"/{rule_id}",
|
||
|
|
response_model=APIResponse[AlertRuleResponse],
|
||
|
|
summary="更新告警规则 / Update alert rule",
|
||
|
|
dependencies=[Depends(require_write)],
|
||
|
|
)
|
||
|
|
async def update_rule(
|
||
|
|
rule_id: int, body: AlertRuleUpdate, db: AsyncSession = Depends(get_db)
|
||
|
|
):
|
||
|
|
"""更新告警规则。"""
|
||
|
|
result = await db.execute(select(AlertRule).where(AlertRule.id == rule_id))
|
||
|
|
rule = result.scalar_one_or_none()
|
||
|
|
if not rule:
|
||
|
|
raise HTTPException(status_code=404, detail=f"规则 {rule_id} 不存在")
|
||
|
|
update_data = body.model_dump(exclude_unset=True)
|
||
|
|
for k, v in update_data.items():
|
||
|
|
setattr(rule, k, v)
|
||
|
|
await db.flush()
|
||
|
|
await db.refresh(rule)
|
||
|
|
return APIResponse(data=AlertRuleResponse.model_validate(rule))
|
||
|
|
|
||
|
|
|
||
|
|
@router.delete(
|
||
|
|
"/{rule_id}",
|
||
|
|
response_model=APIResponse,
|
||
|
|
summary="删除告警规则 / Delete alert rule",
|
||
|
|
dependencies=[Depends(require_write)],
|
||
|
|
)
|
||
|
|
async def delete_rule(rule_id: int, db: AsyncSession = Depends(get_db)):
|
||
|
|
"""删除告警规则。"""
|
||
|
|
result = await db.execute(select(AlertRule).where(AlertRule.id == rule_id))
|
||
|
|
rule = result.scalar_one_or_none()
|
||
|
|
if not rule:
|
||
|
|
raise HTTPException(status_code=404, detail=f"规则 {rule_id} 不存在")
|
||
|
|
await db.delete(rule)
|
||
|
|
await db.flush()
|
||
|
|
return APIResponse(message="规则已删除")
|