feat: Replace mock WhatsApp with real Meta Graph API webhook
- 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
This commit is contained in:
+61
-12
@@ -1,10 +1,69 @@
|
||||
"""Pydantic schemas for mock WhatsApp endpoint."""
|
||||
"""Pydantic schemas for Meta WhatsApp webhook."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel
|
||||
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):
|
||||
@@ -16,13 +75,3 @@ class MockWhatsAppRequest(BaseModel):
|
||||
class MockWhatsAppResponse(BaseModel):
|
||||
status: str = "received"
|
||||
message: str = "Command logged successfully"
|
||||
|
||||
|
||||
class MockWhatsAppLogEntry(BaseModel):
|
||||
id: int
|
||||
command: str
|
||||
from_number: str | None
|
||||
ticket_id: int | None
|
||||
received_at: datetime
|
||||
|
||||
model_config = {"from_attributes": True}
|
||||
|
||||
Reference in New Issue
Block a user