69 lines
2.0 KiB
Python
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
|