# webhook_handler.py from dataclasses import dataclass from typing import List, Dict, Any import time import logging from fastapi import Request, status from fastapi.responses import JSONResponse logger = logging.getLogger(__name__) @dataclass class WebhookResponse: request_id: str results: List[Dict] class WebhookHandler: def __init__(self, message_handler): self.message_handler = message_handler self.logger = logging.getLogger(__name__) async def process_webhook(self, payload: dict, whatsapp_token: str, whatsapp_url:str,gemini_api:str, rag_system:Any = None, agentMemory:Any = None, memory:Any = None) -> WebhookResponse: request_id = f"req_{int(time.time()*1000)}" results = [] # self.logger.info(f"Processing webhook request {payload}") try: entries = payload.get("entry", []) for entry in entries: entry_id = entry.get("id") # self.logger.info(f"Processing entry_id: {entry_id}") changes = entry.get("changes", []) for change in changes: messages = change.get("value", {}).get("messages", []) # self.logger.info(f"message length: {len(messages)}") for message in messages: # self.logger.info(f"Processing message: {message}") response = await self.message_handler.handle( raw_message=message, whatsapp_token=whatsapp_token, whatsapp_url=whatsapp_url, gemini_api=gemini_api, rag_system=rag_system, agentMemory = agentMemory, memory = memory ) results.append(response) except Exception as e: self.logger.error(f"Error processing webhook: {str(e)}") return WebhookResponse( request_id=request_id, results=[{"status": "error", "error": str(e)}] ) self.logger.info(f"Webhook processing completed - Results: {len(results)}") return WebhookResponse(request_id=request_id, results=results)