"""Outbound actions: contact the customer, escalate to Infrastructure.""" from __future__ import annotations from fastapi import APIRouter, Depends, HTTPException, status from pydantic import BaseModel from sqlalchemy.orm import Session from ..auth import current_user from ..config import get_settings from ..db import get_db from ..delivery import DeliveryError, create_jira, send_zendesk, sends_today from ..models import Case, User router = APIRouter(prefix="/api/actions", tags=["actions"]) settings = get_settings() class ZendeskBody(BaseModel): fingerprint: str to: str subject: str body: str priority: str = "normal" tags: list[str] = [] public: bool | None = None class JiraBody(BaseModel): fingerprint: str summary: str description: str project: str = "" issue_type: str = "" labels: list[str] = [] def _case(db: Session, fingerprint: str) -> Case: found = db.query(Case).filter(Case.fingerprint == fingerprint).one_or_none() if not found: raise HTTPException(status.HTTP_404_NOT_FOUND, "Open the case first - nothing is tracked for that alert yet.") return found @router.get("/status") def action_status(db: Session = Depends(get_db), user: User = Depends(current_user)): return { "zendesk_ready": settings.zendesk_ready, "jira_ready": settings.jira_ready, "send_enabled": settings.feature_send_enabled, "sends_today": sends_today(db), "daily_cap": settings.send_daily_cap, } @router.post("/zendesk") async def zendesk(body: ZendeskBody, db: Session = Depends(get_db), user: User = Depends(current_user)): case = _case(db, body.fingerprint) try: return await send_zendesk(db, case, user, to=body.to, subject=body.subject, body=body.body, priority=body.priority, tags=body.tags or None, public=body.public) except DeliveryError as exc: raise HTTPException(status.HTTP_400_BAD_REQUEST, str(exc)) from exc @router.post("/jira") async def jira(body: JiraBody, db: Session = Depends(get_db), user: User = Depends(current_user)): case = _case(db, body.fingerprint) try: return await create_jira(db, case, user, summary=body.summary, description=body.description, project=body.project, issue_type=body.issue_type, labels=body.labels or None) except DeliveryError as exc: raise HTTPException(status.HTTP_400_BAD_REQUEST, str(exc)) from exc