Ticket form: new stack + description step
This commit is contained in:
@@ -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}"
|
||||
)
|
||||
|
||||
|
||||
@@ -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 канала (опционально)")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user