- POST /api/whatsapp/webhook handles Meta verification (hub.challenge) - Inbound text messages create tickets via create_ticket() - Auto-reply confirmation sent back via Meta Graph API - WhatsApp messages logged with ticket linkage in whatsapp_log - Added WHATSAPP_PHONE_NUMBER_ID, WHATSAPP_ACCESS_TOKEN, WHATSAPP_VERIFY_TOKEN config - Kept /mock-log debug endpoint for backward compatibility - Graceful degradation: logs message even if ticket/reply fails
78 lines
2.1 KiB
Python
78 lines
2.1 KiB
Python
"""Pydantic schemas for Meta WhatsApp webhook."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
# ── Meta Webhook Verification ────────────────────────────────────────
|
|
class WebhookVerificationResponse(BaseModel):
|
|
challenge: str
|
|
|
|
|
|
# ── Inbound Message Parsing ─────────────────────────────────────────
|
|
class MessageText(BaseModel):
|
|
text: str
|
|
|
|
|
|
class Message(BaseModel):
|
|
from_field: str = Field(alias="from")
|
|
id: str | None = None
|
|
text: MessageText | None = None
|
|
type: str | None = None
|
|
|
|
|
|
class Contact(BaseModel):
|
|
wa_id: str | None = None
|
|
profile: dict | None = None
|
|
|
|
|
|
class EntryMessagesItem(BaseModel):
|
|
id: str | None = None
|
|
message: Message | None = None
|
|
contacts: list[Contact] | None = None
|
|
timestamp: str | None = None
|
|
|
|
|
|
class Entry(BaseModel):
|
|
id: str | None = None
|
|
changes: list[EntryMessagesItem] | None = None
|
|
metadata: dict | None = None
|
|
|
|
|
|
class MetaWebhookRequest(BaseModel):
|
|
object: str | None = None
|
|
entry: list[Entry] | None = None
|
|
|
|
|
|
# ── Auto-reply ──────────────────────────────────────────────────────
|
|
class WhatsAppReplyResponse(BaseModel):
|
|
success: bool
|
|
message: str
|
|
|
|
|
|
# ── Legacy mock schemas (kept for /mock-log endpoint) ───────────────
|
|
class MockWhatsAppLogEntry(BaseModel):
|
|
id: int
|
|
from_number: str
|
|
message_text: str
|
|
wa_message_id: str | None
|
|
ticket_id: int | None
|
|
ticket_number: str | None
|
|
received_at: datetime
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class MockWhatsAppRequest(BaseModel):
|
|
command: str
|
|
from_number: str | None = None
|
|
ticket_id: int | None = None
|
|
|
|
|
|
class MockWhatsAppResponse(BaseModel):
|
|
status: str = "received"
|
|
message: str = "Command logged successfully"
|