meta whatsapp chat

This commit is contained in:
debu-2 2026-10-08 00:50:36 +05:30
parent 54f75387eb
commit 5ced0d0812
10 changed files with 1015 additions and 25 deletions

View file

@ -5,7 +5,8 @@ from sqlalchemy import select
from sqlalchemy.orm import Session
from .config import settings
from .models import WhatsAppMessage
from .models import WhatsAppMessage, WhatsAppPhoneAsset
from .whatsapp_config import resolved_whatsapp_phone_number_id
PHONE_DIGITS_RE = re.compile(r"^\d{10,15}$")
@ -50,6 +51,7 @@ def serialize_message(message: WhatsAppMessage) -> dict:
"message_type": message.message_type,
"status": message.status,
"media": media,
"contact_name": message.contact_name,
"created_at": message.created_at,
}
@ -93,13 +95,39 @@ def record_inbound_messages(db: Session, payload: dict[str, Any]) -> int:
if payload.get("object") != "whatsapp_business_account":
return 0
business = business_phone()
platform_number = business_phone()
platform_phone_id = resolved_whatsapp_phone_number_id(db)
created = 0
for entry in payload.get("entry", []):
for change in entry.get("changes", []):
if change.get("field") != "messages":
continue
value = change.get("value", {})
metadata = value.get("metadata") if isinstance(value.get("metadata"), dict) else {}
phone_number_id = str(metadata.get("phone_number_id") or "") or None
owner_id = None
line_number = platform_number
if phone_number_id and phone_number_id != platform_phone_id:
asset = db.scalar(
select(WhatsAppPhoneAsset).where(WhatsAppPhoneAsset.phone_number_id == phone_number_id)
)
if asset is None:
continue
owner_id = asset.user_id
raw_line = asset.display_phone or str(metadata.get("display_phone_number") or "")
try:
line_number = normalize_wa_number(raw_line)
except ValueError:
line_number = re.sub(r"\D", "", raw_line) or platform_number
names: dict[str, str] = {}
for contact in value.get("contacts") or []:
if not isinstance(contact, dict):
continue
wa_id = str(contact.get("wa_id") or "")
profile = contact.get("profile") if isinstance(contact.get("profile"), dict) else {}
name = profile.get("name")
if wa_id and isinstance(name, str) and name.strip():
names[wa_id] = name.strip()
for message in value.get("messages", []):
from_number = message.get("from") or ""
body = _extract_text_body(message)
@ -108,11 +136,14 @@ def record_inbound_messages(db: Session, payload: dict[str, Any]) -> int:
direction="inbound",
wa_message_id=message.get("id"),
from_number=from_number,
to_number=business,
to_number=line_number,
body=body,
message_type=message.get("type") or "text",
status="received",
payload=message,
user_id=owner_id,
phone_number_id=phone_number_id if owner_id else None,
contact_name=names.get(from_number),
)
)
created += 1
@ -130,12 +161,14 @@ def record_inbound_messages(db: Session, payload: dict[str, Any]) -> int:
WhatsAppMessage(
direction="outbound",
wa_message_id=wa_id,
from_number=business,
from_number=line_number,
to_number=status.get("recipient_id") or "",
body=None,
message_type="status",
status=status.get("status") or "unknown",
payload=status,
user_id=owner_id,
phone_number_id=phone_number_id if owner_id else None,
)
)
created += 1
@ -153,16 +186,21 @@ def record_outbound_message(
wa_message_id: str | None,
status: str = "sent",
payload: dict | None = None,
from_number: str | None = None,
user_id: Any = None,
phone_number_id: str | None = None,
) -> WhatsAppMessage:
message = WhatsAppMessage(
direction="outbound",
wa_message_id=wa_message_id,
from_number=business_phone(),
from_number=from_number or business_phone(),
to_number=to_number,
body=body,
message_type=message_type,
status=status,
payload=payload,
user_id=user_id,
phone_number_id=phone_number_id,
)
db.add(message)
db.commit()