fix(webhooks): replace parity stubs
This commit is contained in:
+24
-31
@@ -358,7 +358,7 @@ func RegisterRoutes(
|
||||
tgGroup := webhookGroup.Group("/telegram")
|
||||
tgGroup.POST("/:bot_token", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.TelegramWebhook == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.TelegramWebhook.HandleTelegramWebhook(c)
|
||||
@@ -372,14 +372,14 @@ func RegisterRoutes(
|
||||
waGroup := webhookGroup.Group("/whatsapp")
|
||||
waGroup.GET("/:phone_number", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.WhatsAppWebhook == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.WhatsAppWebhook.HandleWhatsAppVerification(c)
|
||||
})
|
||||
waGroup.POST("/:phone_number", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.WhatsAppWebhook == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.WhatsAppWebhook.HandleWhatsAppWebhook(c)
|
||||
@@ -392,21 +392,21 @@ func RegisterRoutes(
|
||||
ttGroup := webhookGroup.Group("/tiktok")
|
||||
ttGroup.POST("", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.TikTokWebhook == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.TikTokWebhook.HandleTikTokWebhook(c)
|
||||
})
|
||||
ttGroup.GET("/:business_id", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.TikTokWebhook == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.TikTokWebhook.HandleTikTokVerification(c)
|
||||
})
|
||||
ttGroup.POST("/:business_id", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.TikTokWebhook == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.TikTokWebhook.HandleTikTokWebhook(c)
|
||||
@@ -418,7 +418,7 @@ func RegisterRoutes(
|
||||
lineGroup := webhookGroup.Group("/line")
|
||||
lineGroup.POST("/:line_channel_id", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.LineWebhook == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.LineWebhook.HandleLineWebhook(c)
|
||||
@@ -430,7 +430,7 @@ func RegisterRoutes(
|
||||
// Reference: Twilio SMS API https://www.twilio.com/docs/sms/api/message-resource
|
||||
webhookGroup.POST("/sms/:phone_number", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.TwilioWebhook == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.TwilioWebhook.HandleTwilioInboundSMS(c)
|
||||
@@ -438,35 +438,35 @@ func RegisterRoutes(
|
||||
twilioGroup := webhookGroup.Group("/twilio")
|
||||
twilioGroup.POST("/sms/:phone_number", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.TwilioWebhook == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.TwilioWebhook.HandleTwilioInboundSMS(c)
|
||||
})
|
||||
twilioGroup.POST("/status/:phone_number", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.TwilioWebhook == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.TwilioWebhook.HandleTwilioDeliveryStatus(c)
|
||||
})
|
||||
twilioGroup.POST("/delivery_status", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.TwilioWebhook == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.TwilioWebhook.HandleTwilioDeliveryStatus(c)
|
||||
})
|
||||
engine.POST("/twilio/delivery_status", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.TwilioWebhook == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.TwilioWebhook.HandleTwilioDeliveryStatus(c)
|
||||
})
|
||||
engine.POST("/twilio/callback", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.TwilioWebhook == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.TwilioWebhook.HandleTwilioCallback(c)
|
||||
@@ -485,14 +485,14 @@ func RegisterRoutes(
|
||||
twWebhookGroup := webhookGroup.Group("/twitter")
|
||||
twWebhookGroup.GET("", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.TwitterChannel == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.TwitterChannel.WebhookCRC(c)
|
||||
})
|
||||
twWebhookGroup.POST("", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.TwitterChannel == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.TwitterChannel.WebhookEvent(c)
|
||||
@@ -500,14 +500,14 @@ func RegisterRoutes(
|
||||
// Legacy GoChat aliases kept for already configured Twitter webhooks.
|
||||
twWebhookGroup.GET("/webhook", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.TwitterChannel == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.TwitterChannel.WebhookCRC(c)
|
||||
})
|
||||
twWebhookGroup.POST("/webhook", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.TwitterChannel == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.TwitterChannel.WebhookEvent(c)
|
||||
@@ -515,21 +515,21 @@ func RegisterRoutes(
|
||||
|
||||
webhookGroup.GET("/instagram", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.FacebookWebhook == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.FacebookWebhook.HandleInstagramVerification(c)
|
||||
})
|
||||
webhookGroup.POST("/instagram", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.FacebookWebhook == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.FacebookWebhook.HandleInstagramWebhook(c)
|
||||
})
|
||||
webhookGroup.POST("/shopify", func(c *gin.Context) {
|
||||
if handlers == nil || handlers.ShopifyWebhook == nil {
|
||||
chatwootParityStub(c)
|
||||
webhookProviderUnavailable(c)
|
||||
return
|
||||
}
|
||||
handlers.ShopifyWebhook.HandleShopifyWebhook(c)
|
||||
@@ -2056,20 +2056,13 @@ func registerWidgetRoutes(g *gin.RouterGroup, h *widget.WidgetHandler) {
|
||||
widget.POST("/:website_token/offline_message", h.SubmitOfflineMessage)
|
||||
}
|
||||
|
||||
func chatwootParityStub(c *gin.Context) {
|
||||
c.JSON(501, gin.H{
|
||||
"error": "not implemented",
|
||||
"message": "Chatwoot parity route is registered; behavior is tracked for implementation",
|
||||
func webhookProviderUnavailable(c *gin.Context) {
|
||||
c.JSON(http.StatusServiceUnavailable, gin.H{
|
||||
"error": "webhook provider unavailable",
|
||||
"message": "webhook handler is not configured",
|
||||
})
|
||||
}
|
||||
|
||||
// --- Placeholder handlers for webhooks ---
|
||||
// Full implementation deferred to P7 (channels)
|
||||
|
||||
func webhookStub(c *gin.Context) {
|
||||
c.JSON(200, gin.H{"message": "Webhook callback placeholder (P7)"})
|
||||
}
|
||||
|
||||
func healthCheck(c *gin.Context) {
|
||||
uptime := time.Since(startTime)
|
||||
c.JSON(200, gin.H{
|
||||
|
||||
@@ -98,6 +98,35 @@ func TestRegisterRoutesBootsWithChatwootParityConflictGroups(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestWebhookNilHandlerReturnsProviderUnavailable(t *testing.T) {
|
||||
gin.SetMode(gin.TestMode)
|
||||
engine := gin.New()
|
||||
|
||||
RegisterRoutes(
|
||||
engine,
|
||||
nil,
|
||||
nil,
|
||||
nil,
|
||||
&Handlers{},
|
||||
nil,
|
||||
nil,
|
||||
&config.JWTConfig{},
|
||||
middleware.CORSConfig{},
|
||||
nil,
|
||||
)
|
||||
|
||||
w := httptest.NewRecorder()
|
||||
req := httptest.NewRequest(http.MethodPost, "/webhooks/telegram/bot-token", nil)
|
||||
engine.ServeHTTP(w, req)
|
||||
|
||||
if w.Code != http.StatusServiceUnavailable {
|
||||
t.Fatalf("expected status %d, got %d", http.StatusServiceUnavailable, w.Code)
|
||||
}
|
||||
if strings.Contains(w.Body.String(), "not implemented") || strings.Contains(w.Body.String(), "placeholder") {
|
||||
t.Fatalf("nil webhook fallback returned placeholder body: %s", w.Body.String())
|
||||
}
|
||||
}
|
||||
|
||||
func TestTwilioVoiceRoutesServeConferenceAndPersistCallbacks(t *testing.T) {
|
||||
gin.SetMode(gin.TestMode)
|
||||
db, call := setupRouterTwilioVoiceDB(t)
|
||||
|
||||
Reference in New Issue
Block a user