from typing import Optional, List from fastapi import APIRouter, Depends, Query, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from backend.database import get_db from backend.schemas import NotifyRequest, NotifyResponse from backend.notify_service import NotifyService router = APIRouter(prefix="/api", tags=["notify"]) @router.post("/notify", response_model=NotifyResponse) async def send_notification( request: NotifyRequest, db: AsyncSession = Depends(get_db) ): """发送通知到指定通道或按标签发送""" if not request.channels and not request.tags: raise HTTPException( status_code=400, detail="Either 'channels' or 'tags' must be provided" ) service = NotifyService() results = await service.send_to_channels( db, request.channels, request.tags, request.title, request.body, request.priority ) total = len(results) sent = sum(1 for r in results if r["status"] == "sent") failed = sum(1 for r in results if r["status"] == "failed") return { "success": sent == total, "results": results, "total": total, "sent": sent, "failed": failed } @router.get("/notify") async def send_notification_get( channels: Optional[str] = Query(None, description="通道名称,多个用逗号分隔"), tags: Optional[str] = Query(None, description="标签,多个用逗号分隔"), title: Optional[str] = Query(None), body: str = Query(..., description="消息内容"), priority: str = Query("normal"), db: AsyncSession = Depends(get_db) ): """通过 GET 请求发送通知(方便脚本调用)""" channel_list = channels.split(",") if channels else None tag_list = tags.split(",") if tags else None if not channel_list and not tag_list: raise HTTPException( status_code=400, detail="Either 'channels' or 'tags' must be provided" ) service = NotifyService() results = await service.send_to_channels( db, channel_list, tag_list, title, body, priority ) total = len(results) sent = sum(1 for r in results if r["status"] == "sent") return { "success": sent == total, "results": results, "total": total, "sent": sent, "failed": total - sent }