meta whatsapp chat
This commit is contained in:
parent
54f75387eb
commit
5ced0d0812
10 changed files with 1015 additions and 25 deletions
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue