Ticket form: new stack + description step

This commit is contained in:
AI Assistant
2025-11-14 19:06:36 +03:00
parent 3d121054ab
commit 3306d01e0d
16 changed files with 488 additions and 73 deletions

View File

@@ -2,11 +2,20 @@
Claims API Routes - Обработка заявок
"""
from fastapi import APIRouter, HTTPException
from .models import ClaimCreateRequest, ClaimResponse
from .models import (
ClaimCreateRequest,
ClaimResponse,
TicketFormDescriptionRequest,
)
import uuid
from datetime import datetime
import json
import logging
from ..services.redis_service import redis_service
from ..config import settings
router = APIRouter(prefix="/api/v1/claims", tags=["Claims"])
logger = logging.getLogger(__name__)
@router.post("/create", response_model=ClaimResponse)
@@ -49,3 +58,43 @@ async def get_claim(claim_id: str):
"message": "Заявка в обработке"
}
@router.post("/description")
async def publish_ticket_form_description(payload: TicketFormDescriptionRequest):
"""
Публикует свободное описание проблемы в Redis канал ticket_form:description
(слушается воркфлоу в n8n)
"""
try:
channel = payload.channel or f"{settings.redis_prefix}description"
event = {
"type": "ticket_form_description",
"session_id": payload.session_id,
"claim_id": payload.claim_id,
"phone": payload.phone,
"email": payload.email,
"description": payload.problem_description.strip(),
"source": payload.source,
"timestamp": datetime.utcnow().isoformat(),
}
logger.info(
"📝 TicketForm description received",
extra={"session_id": payload.session_id, "claim_id": payload.claim_id},
)
await redis_service.publish(channel, json.dumps(event, ensure_ascii=False))
logger.info(
"📡 TicketForm description published",
extra={"channel": channel, "session_id": payload.session_id},
)
return {
"success": True,
"channel": channel,
"event": event,
}
except Exception as e:
logger.exception("❌ Failed to publish ticket form description")
raise HTTPException(
status_code=500,
detail=f"Не удалось опубликовать описание: {e}"
)

View File

@@ -62,3 +62,14 @@ class ClaimResponse(BaseModel):
claim_number: Optional[str] = None
message: str
class TicketFormDescriptionRequest(BaseModel):
"""Отправка свободного описания проблемы (Ticket Form)"""
session_id: str = Field(..., description="ID клиентской сессии")
claim_id: Optional[str] = Field(None, description="ID заявки (если уже создана)")
phone: Optional[str] = Field(None, description="Номер телефона заявителя")
email: Optional[str] = Field(None, description="Email заявителя")
problem_description: str = Field(..., min_length=10, description="Свободное описание ситуации")
source: str = Field("ticket_form", description="Источник события")
channel: Optional[str] = Field(None, description="Переопределение Redis канала (опционально)")