78 lines
2.0 KiB
Go
78 lines
2.0 KiB
Go
package webhook
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
"time"
|
|
|
|
"verification-platform-backend/internal/database"
|
|
"verification-platform-backend/internal/model"
|
|
)
|
|
|
|
type EventType string
|
|
|
|
const (
|
|
EventUserRegistered EventType = "user.registered"
|
|
EventUserLogin EventType = "user.login"
|
|
EventUserRecharged EventType = "user.recharged"
|
|
EventUserExpired EventType = "user.expired"
|
|
EventCardUsed EventType = "card.used"
|
|
EventCardExpired EventType = "card.expired"
|
|
EventAbnormalDetected EventType = "abnormal.detected"
|
|
)
|
|
|
|
type WebhookPayload struct {
|
|
Event EventType `json:"event"`
|
|
Timestamp int64 `json:"timestamp"`
|
|
Data map[string]interface{} `json:"data"`
|
|
}
|
|
|
|
func TriggerEvent(appID uint, event EventType, data map[string]interface{}) {
|
|
var webhooks []model.WebhookConfig
|
|
if err := database.DB.Where("application_id = ? AND status = ?", appID, "active").Find(&webhooks).Error; err != nil {
|
|
log.Printf("Failed to fetch webhooks: %v", err)
|
|
return
|
|
}
|
|
|
|
for _, webhook := range webhooks {
|
|
var events []string
|
|
if err := json.Unmarshal([]byte(webhook.Events), &events); err != nil {
|
|
log.Printf("Failed to parse webhook events: %v", err)
|
|
continue
|
|
}
|
|
|
|
if !containsEvent(events, string(event)) {
|
|
continue
|
|
}
|
|
|
|
payload := WebhookPayload{
|
|
Event: event,
|
|
Timestamp: time.Now().Unix(),
|
|
Data: data,
|
|
}
|
|
|
|
go sendWebhookNotification(&webhook, payload)
|
|
}
|
|
}
|
|
|
|
func containsEvent(events []string, event string) bool {
|
|
for _, e := range events {
|
|
if e == event || e == "*" {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func sendWebhookNotification(webhook *model.WebhookConfig, payload WebhookPayload) {
|
|
payloadBytes, err := json.Marshal(payload)
|
|
if err != nil {
|
|
log.Printf("Failed to marshal webhook payload: %v", err)
|
|
return
|
|
}
|
|
|
|
log.Printf("Sending webhook to %s: %s", webhook.URL, string(payloadBytes))
|
|
fmt.Printf("[Webhook] Sending to %s: Event=%s, AppID=%d\n", webhook.URL, payload.Event, webhook.ApplicationID)
|
|
}
|