feat(webhook): persist incoming provider messages

This commit is contained in:
2026-06-04 23:54:07 +08:00
parent b3865f9084
commit 5eb726b124
14 changed files with 535 additions and 84 deletions
+14 -3
View File
@@ -27,6 +27,7 @@ import (
type TwilioWebhookHandler struct {
twilioWebhook *twiliochannel.WebhookHandler
db *gorm.DB
persister *IncomingPersister
}
// NewTwilioWebhookHandler creates a Twilio SMS webhook handler for Gin integration.
@@ -34,6 +35,7 @@ func NewTwilioWebhookHandler(twilioWebhook *twiliochannel.WebhookHandler, db *go
return &TwilioWebhookHandler{
twilioWebhook: twilioWebhook,
db: db,
persister: NewIncomingPersister(db),
}
}
@@ -54,9 +56,18 @@ func (h *TwilioWebhookHandler) HandleTwilioInboundSMS(c *gin.Context) {
return
}
// Dispatch to the channel-level webhook handler
// Twilio expects a TwiML XML response, not JSON
h.twilioWebhook.HandleInboundSMS(c.Writer, c.Request, inbox)
incomingMsg, err := h.twilioWebhook.ProcessInboundSMS(c.Request, inbox)
if err != nil {
applogger.L().Errorf("Twilio webhook: process inbound SMS failed for inbox %d: %v", inbox.ID, err)
c.Data(http.StatusOK, "application/xml", []byte("<Response></Response>"))
return
}
if incomingMsg != nil {
if _, persistErr := h.persister.PersistIncoming(c.Request.Context(), inbox, incomingMsg); persistErr != nil {
applogger.L().Errorf("Twilio webhook: persist inbound SMS failed for inbox %d source_id=%s: %v", inbox.ID, incomingMsg.SourceID, persistErr)
}
}
c.Data(http.StatusOK, "application/xml", []byte("<Response></Response>"))
}
// HandleTwilioDeliveryStatus processes a Twilio delivery status callback.