69 lines
2.0 KiB
Python

from fastapi import APIRouter, Header, HTTPException, Request
from pydantic import BaseModel
from app.services.support_abuse import SupportGuardRejected, enforce_support_guard
from app.services.support_ticket import create_ticket, get_ticket_status
router = APIRouter(prefix="/api/support")
class TicketCreate(BaseModel):
name: str
email: str
subject: str
message: str
class TicketStatusRequest(BaseModel):
email: str
@router.post("/ticket")
def submit_ticket(
payload: TicketCreate,
request: Request,
support_captcha: str | None = Header(default=None, alias="X-Support-Captcha"),
):
try:
enforce_support_guard(
request=request,
endpoint="ticket_create",
email=payload.email.strip(),
captcha_token=support_captcha,
)
except SupportGuardRejected as exc:
raise HTTPException(status_code=exc.status_code, detail=exc.detail) from exc
if not payload.subject.strip() or not payload.message.strip():
raise HTTPException(status_code=400, detail="Subject and message are required")
ticket = create_ticket(
name=payload.name.strip(),
email=payload.email.strip(),
subject=payload.subject.strip(),
message=payload.message.strip(),
)
return ticket
@router.post("/ticket/status/{ticket_id}")
def ticket_status(
ticket_id: str,
payload: TicketStatusRequest,
request: Request,
support_captcha: str | None = Header(default=None, alias="X-Support-Captcha"),
):
try:
enforce_support_guard(
request=request,
endpoint="ticket_status",
email=payload.email.strip(),
ticket_id=ticket_id.strip(),
captcha_token=support_captcha,
)
except SupportGuardRejected as exc:
raise HTTPException(status_code=exc.status_code, detail=exc.detail) from exc
status = get_ticket_status(ticket_id.strip(), payload.email.strip())
if not status:
raise HTTPException(status_code=404, detail="Ticket not found")
return status