122 lines
3.9 KiB
Python
122 lines
3.9 KiB
Python
"""Quick reply session service for managing FAQ sessions."""
|
|
|
|
import logging
|
|
from uuid import uuid4
|
|
|
|
from capa_de_integracion.models.quick_replies import QuickReplyScreen
|
|
from capa_de_integracion.services.firestore_service import FirestoreService
|
|
from capa_de_integracion.services.quick_reply_content import QuickReplyContentService
|
|
from capa_de_integracion.services.redis_service import RedisService
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class QuickReplySessionResponse:
|
|
"""Response from quick reply session service."""
|
|
|
|
def __init__(self, session_id: str, quick_replies: QuickReplyScreen) -> None:
|
|
"""Initialize response.
|
|
|
|
Args:
|
|
session_id: The session ID
|
|
quick_replies: The quick reply screen data
|
|
|
|
"""
|
|
self.session_id = session_id
|
|
self.quick_replies = quick_replies
|
|
|
|
|
|
class QuickReplySessionService:
|
|
"""Service for managing quick reply FAQ sessions."""
|
|
|
|
def __init__(
|
|
self,
|
|
redis_service: RedisService,
|
|
firestore_service: FirestoreService,
|
|
quick_reply_content_service: QuickReplyContentService,
|
|
) -> None:
|
|
"""Initialize quick reply session service.
|
|
|
|
Args:
|
|
redis_service: Redis service instance
|
|
firestore_service: Firestore service instance
|
|
quick_reply_content_service: Quick reply content service instance
|
|
|
|
"""
|
|
self.redis_service = redis_service
|
|
self.firestore_service = firestore_service
|
|
self.quick_reply_content_service = quick_reply_content_service
|
|
|
|
def _validate_phone(self, phone: str) -> None:
|
|
"""Validate phone number.
|
|
|
|
Args:
|
|
phone: Phone number to validate
|
|
|
|
Raises:
|
|
ValueError: If phone is empty or invalid
|
|
|
|
"""
|
|
if not phone or not phone.strip():
|
|
msg = "Phone number is required"
|
|
raise ValueError(msg)
|
|
|
|
async def start_quick_reply_session(
|
|
self,
|
|
telefono: str,
|
|
_nombre: str,
|
|
pantalla_contexto: str,
|
|
) -> QuickReplySessionResponse:
|
|
"""Start a quick reply FAQ session for a specific screen.
|
|
|
|
Creates or updates a conversation session with pantalla_contexto set,
|
|
loads the quick reply questions for the screen, and returns them.
|
|
|
|
Args:
|
|
telefono: User's phone number
|
|
_nombre: User's name (currently unused but part of API contract)
|
|
pantalla_contexto: Screen context identifier
|
|
|
|
Returns:
|
|
Quick reply session response with session ID and quick replies
|
|
|
|
Raises:
|
|
ValueError: If validation fails or data is invalid
|
|
Exception: If there's an error creating session or loading content
|
|
|
|
"""
|
|
self._validate_phone(telefono)
|
|
|
|
# Get or create session
|
|
session = await self.firestore_service.get_session_by_phone(telefono)
|
|
if session:
|
|
session_id = session.session_id
|
|
await self.firestore_service.update_pantalla_contexto(
|
|
session_id, pantalla_contexto,
|
|
)
|
|
session.pantalla_contexto = pantalla_contexto
|
|
else:
|
|
session_id = str(uuid4())
|
|
user_id = f"user_by_phone_{telefono.replace(' ', '').replace('-', '')}"
|
|
session = await self.firestore_service.create_session(
|
|
session_id, user_id, telefono, pantalla_contexto,
|
|
)
|
|
|
|
# Cache session in Redis
|
|
await self.redis_service.save_session(session)
|
|
logger.info(
|
|
"Created quick reply session %s for screen: %s",
|
|
session_id,
|
|
pantalla_contexto,
|
|
)
|
|
|
|
# Load quick replies for the screen
|
|
quick_replies = await self.quick_reply_content_service.get_quick_replies(
|
|
pantalla_contexto,
|
|
)
|
|
|
|
return QuickReplySessionResponse(
|
|
session_id=session_id,
|
|
quick_replies=quick_replies,
|
|
)
|