54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
import logging
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
|
|
from ..models.notification import ExternalNotificationRequest
|
|
from ..services.notification_manager import NotificationManagerService
|
|
from ..dependencies import get_notification_manager
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter(prefix="/api/v1/dialogflow", tags=["notifications"])
|
|
|
|
|
|
@router.post("/notification", status_code=200)
|
|
async def process_notification(
|
|
request: ExternalNotificationRequest,
|
|
notification_manager: NotificationManagerService = Depends(
|
|
get_notification_manager
|
|
),
|
|
) -> None:
|
|
"""
|
|
Process push notification from external system.
|
|
|
|
This endpoint receives notifications (e.g., "Your card was blocked") and:
|
|
1. Stores them in Redis/Firestore
|
|
2. Associates them with the user's conversation session
|
|
3. Triggers a Dialogflow event
|
|
|
|
When the user later sends a message asking about the notification
|
|
("Why was it blocked?"), the message filter will classify it as
|
|
NOTIFICATION and route to the appropriate handler.
|
|
|
|
Args:
|
|
request: External notification request with text, phone, and parameters
|
|
|
|
Returns:
|
|
None (204 No Content)
|
|
|
|
Raises:
|
|
HTTPException: 400 if validation fails, 500 for internal errors
|
|
"""
|
|
try:
|
|
logger.info("Received notification request")
|
|
await notification_manager.process_notification(request)
|
|
logger.info("Successfully processed notification request")
|
|
# Match Java behavior: process but don't return response body
|
|
|
|
except ValueError as e:
|
|
logger.error(f"Validation error: {str(e)}", exc_info=True)
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error processing notification: {str(e)}", exc_info=True)
|
|
raise HTTPException(status_code=500, detail="Internal server error")
|