bitrix/internal/controllers/webhook.go
2024-10-23 15:04:44 +03:00

91 lines
3.4 KiB
Go

package controllers
import (
"fmt"
"github.com/gofiber/fiber/v2"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/quiz/bitrix/internal/service"
)
// https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=99&LESSON_ID=2486
func (c *WebhookController) WebhookCreate(ctx *fiber.Ctx) error {
code := ctx.Query("code") // первый авторизационный код
domain := ctx.Query("domain") // домен портала, на котором происходит авторизация
state := ctx.Query("state") // значение, переданное в первом запросе
scope := ctx.Query("scope") // список прав доступа к REST API
memberID := ctx.Query("member_id") // уникальный идентификатор портала - id битрикса главного
serverDomain := ctx.Query("server_domain") // домен сервера авторизации
if code == "" || domain == "" || memberID == "" || serverDomain == "" {
c.logger.Error("Missing required fields", zap.String("code", code), zap.String("domain", domain), zap.String("member_id", memberID), zap.String("server_domain", serverDomain))
return ctx.Status(fiber.StatusBadRequest).SendString("Missing required fields")
}
if state == "" {
return ctx.Status(fiber.StatusBadRequest).SendString("State cannot be empty")
}
accountID, err := c.encrypt.DecryptStr([]byte(state))
if err != nil {
c.logger.Error("Error deserializing Protobuf message", zap.Error(err))
return ctx.Status(fiber.StatusInternalServerError).SendString("Failed to process state parameter")
}
if accountID == "" {
c.logger.Error("AccountID is missing from state")
return ctx.Status(fiber.StatusBadRequest).SendString("Invalid state parameter")
}
req := service.ParamsWebhookCreate{
Code: code,
Domain: domain,
AccountID: accountID,
MemberID: memberID,
Scope: scope,
ServerDomain: serverDomain,
}
err = c.service.WebhookCreate(ctx.Context(), req)
if err != nil {
c.logger.Error("Error creating webhook", zap.Error(err))
return ctx.Status(fiber.StatusInternalServerError).SendString(fmt.Sprintf("Internal Server Error: %v", err.Error()))
}
return ctx.Redirect(c.redirectURL)
}
//// todo проверить надо есть ли такое вообще
//func (c *WebhookController) WebhookDelete(ctx *fiber.Ctx) error {
// clientUUID := ctx.Query("client_uuid")
// signature := ctx.Query("signature")
// amoIDStr := ctx.Query("account_id")
//
// fmt.Println(clientUUID)
// fmt.Println(signature)
// fmt.Println(amoIDStr)
//
// if clientUUID == "" || signature == "" || amoIDStr == "" {
// return ctx.Status(fiber.StatusBadRequest).SendString("some nil values")
// }
//
// amoID, err := strconv.Atoi(amoIDStr)
// if err != nil {
// return ctx.Status(fiber.StatusBadRequest).SendString("invalid account_id type")
// }
//
// if !c.verify.CheckIntegrationID(clientUUID) {
// return ctx.Status(fiber.StatusUnauthorized).SendString("invalid hook signature")
// }
//
// if !c.verify.VerifySignature(clientUUID, signature, amoID) {
// return ctx.Status(fiber.StatusUnauthorized).SendString("invalid hook signature")
// }
//
// err = c.service.WebhookDelete(ctx.Context(), amoID)
// if err != nil {
// return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error")
// }
//
// return ctx.SendStatus(fiber.StatusOK)
//}