""" 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="规则已删除")