whatsapp integration

This commit is contained in:
debu-2 2026-10-02 12:51:46 +05:30
parent d077292bbc
commit 141ca9fda3
15 changed files with 578 additions and 1 deletions

View file

@ -0,0 +1,97 @@
import logging
from typing import Any
from sqlalchemy.orm import Session
from .models import WhatsAppWebhookEvent
logger = logging.getLogger(__name__)
def _extract_events(payload: dict[str, Any]) -> list[dict[str, Any]]:
events: list[dict[str, Any]] = []
if payload.get("object") != "whatsapp_business_account":
return events
for entry in payload.get("entry", []):
waba_id = entry.get("id")
for change in entry.get("changes", []):
field = change.get("field", "unknown")
value = change.get("value", {})
phone_number_id = (value.get("metadata") or {}).get("phone_number_id")
if field == "messages":
for message in value.get("messages", []):
events.append(
{
"waba_id": waba_id,
"phone_number_id": phone_number_id,
"field": field,
"event_type": "message",
"from_wa_id": message.get("from"),
"message_id": message.get("id"),
"status": message.get("type"),
"payload": change,
}
)
for status in value.get("statuses", []):
events.append(
{
"waba_id": waba_id,
"phone_number_id": phone_number_id,
"field": field,
"event_type": "status",
"from_wa_id": status.get("recipient_id"),
"message_id": status.get("id"),
"status": status.get("status"),
"payload": change,
}
)
else:
events.append(
{
"waba_id": waba_id,
"phone_number_id": phone_number_id,
"field": field,
"event_type": field,
"from_wa_id": None,
"message_id": None,
"status": None,
"payload": change,
}
)
return events
def persist_webhook_payload(db: Session, payload: dict[str, Any]) -> int:
events = _extract_events(payload)
if not events:
events = [
{
"waba_id": None,
"phone_number_id": None,
"field": "unknown",
"event_type": "raw",
"from_wa_id": None,
"message_id": None,
"status": None,
"payload": payload,
}
]
for event in events:
db.add(
WhatsAppWebhookEvent(
waba_id=event.get("waba_id"),
phone_number_id=event.get("phone_number_id"),
field=event["field"],
event_type=event["event_type"],
from_wa_id=event.get("from_wa_id"),
message_id=event.get("message_id"),
status=event.get("status"),
payload=event["payload"],
)
)
db.commit()
logger.info("Stored %s WhatsApp webhook event(s)", len(events))
return len(events)