Improve coverage

This commit is contained in:
2026-02-20 06:02:57 +00:00
parent 5ceaadb20c
commit 734cade8d9
28 changed files with 2719 additions and 387 deletions

View File

@@ -4,10 +4,12 @@ from .conversation_manager import ConversationManagerService
from .dlp_service import DLPService
from .notification_manager import NotificationManagerService
from .quick_reply_content import QuickReplyContentService
from .quick_reply_session_service import QuickReplySessionService
__all__ = [
"ConversationManagerService",
"DLPService",
"NotificationManagerService",
"QuickReplyContentService",
"QuickReplySessionService",
]

View File

@@ -0,0 +1,121 @@
"""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,
)