worker/internal/senders/webhook_sender.go

70 lines
1.8 KiB
Go
Raw Normal View History

2025-07-07 08:39:44 +00:00
package senders
import (
"encoding/json"
"errors"
"fmt"
"gitea.pena/SQuiz/common/model"
"github.com/gofiber/fiber/v2"
)
type WebhookSender struct {
client *fiber.Client
}
func NewWebhookSender() *WebhookSender {
return &WebhookSender{
client: fiber.AcquireClient(),
}
}
type WebhookPayload struct {
QuizConfig model.ResultInfo `json:"quiz_config"`
AnswerContent model.ResultContent `json:"answer_content"`
AllAnswers []model.ResultAnswer `json:"all_answers"`
QuestionsMap map[uint64]string `json:"questions_map"`
AnswerTime string `json:"answer_time"`
QuizID int64 `json:"quiz_id"`
Subject string `json:"subject"`
}
func (w *WebhookSender) SendLead(data LeadData) error {
if data.Template == "reject" { // это у нас для неуплоченных, смысл отправлять пост с напомиашкой есть?
return nil
}
webhookData := WebhookPayload{
QuizConfig: data.TemplateData.QuizConfig,
AnswerContent: data.TemplateData.AnswerContent,
AllAnswers: data.TemplateData.AllAnswers,
QuestionsMap: data.TemplateData.QuestionsMap,
AnswerTime: data.TemplateData.AnswerTime,
QuizID: data.TemplateData.QuizID,
Subject: data.Subject,
}
jsonData, err := json.Marshal(webhookData)
if err != nil {
return fmt.Errorf("error marshaling webhook data: %w", err)
}
url := data.To.(string)
agent := w.client.Post(url)
agent.Set("Content-Type", "application/json").Body(jsonData)
statusCode, _, errs := agent.Bytes()
if len(errs) > 0 {
return fmt.Errorf("error send webhook request: %w", errors.Join(errs...))
}
if statusCode != fiber.StatusOK {
return fmt.Errorf("received an incorrect status code from webhook: %d", statusCode)
}
return nil
}
func (w *WebhookSender) Name() string {
return "webhook"
}