2025-07-07 08:39:44 +00:00
|
|
|
|
package senders
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"errors"
|
|
|
|
|
"fmt"
|
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type WebhookSender struct {
|
|
|
|
|
client *fiber.Client
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewWebhookSender() *WebhookSender {
|
|
|
|
|
return &WebhookSender{
|
|
|
|
|
client: fiber.AcquireClient(),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type WebhookPayload struct {
|
2025-07-07 08:49:23 +00:00
|
|
|
|
QAPairs map[string]string `json:"qa_pairs"` // вопрос -> ответ
|
2025-07-07 08:39:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (w *WebhookSender) SendLead(data LeadData) error {
|
|
|
|
|
if data.Template == "reject" { // это у нас для неуплоченных, смысл отправлять пост с напомиашкой есть?
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2025-07-07 08:49:23 +00:00
|
|
|
|
|
|
|
|
|
qaPairs := make(map[string]string)
|
|
|
|
|
for _, answer := range data.TemplateData.AllAnswers {
|
|
|
|
|
questionTitle, exists := data.TemplateData.QuestionsMap[answer.QuestionID]
|
|
|
|
|
if exists {
|
|
|
|
|
qaPairs[questionTitle] = answer.Content
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-07 08:39:44 +00:00
|
|
|
|
webhookData := WebhookPayload{
|
2025-07-07 08:49:23 +00:00
|
|
|
|
QAPairs: qaPairs,
|
2025-07-07 08:39:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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"
|
|
|
|
|
}
|