common/privilege/controller/privilege.go
2023-12-01 19:46:02 +03:00

67 lines
2.1 KiB
Go

package controller
import (
"github.com/gofiber/fiber/v2"
"github.com/sirupsen/logrus"
"net/http"
"penahub.gitlab.yandexcloud.net/backend/penahub_common/privilege/client"
"penahub.gitlab.yandexcloud.net/backend/penahub_common/privilege/config"
)
type Controller struct {
logger *logrus.Logger
hubAdmin *client.HubAdminClient
}
func NewPrivilegeController(logger *logrus.Logger, hubAdmin *client.HubAdminClient) *Controller {
return &Controller{
logger: logger,
hubAdmin: hubAdmin,
}
}
func (receiver *Controller) Check(c *fiber.Ctx) error {
ctx := c.Context()
var requestParams config.RequestParams
if err := c.BodyParser(&requestParams); err != nil {
receiver.logger.Errorf("failed to parse request body: %v", err)
return c.Status(http.StatusBadRequest).JSON(map[string]string{"error": "invalid request body"})
}
existingPrivileges, err := receiver.hubAdmin.GetPrivilege(ctx)
if err != nil {
receiver.logger.Errorf("failed to get existing privileges: %v", err)
return c.Status(http.StatusInternalServerError).JSON(map[string]string{"error": "failed to get existing privileges"})
}
updatedPrivileges := compareAndMergePrivileges(existingPrivileges, requestParams.Privileges)
if len(updatedPrivileges) == 0 {
return c.Status(http.StatusOK).JSON("no updates")
}
_, err = receiver.hubAdmin.PostPrivilege(ctx, updatedPrivileges)
if err != nil {
receiver.logger.Errorf("failed to post privileges: %v", err)
return c.Status(http.StatusInternalServerError).JSON(map[string]string{"error": "failed to post privileges"})
}
return c.Status(http.StatusOK).JSON(map[string][]config.Privilege{"successful registration": updatedPrivileges})
}
func compareAndMergePrivileges(existing []config.Privilege, incoming []config.Privilege) []config.Privilege {
existingMap := make(map[string]config.Privilege)
result := make([]config.Privilege, 0)
for _, privilege := range existing {
existingMap[privilege.ID] = privilege
}
for _, privilege := range incoming {
if _, found := existingMap[privilege.ID]; !found {
result = append(existing, existingMap[privilege.ID])
}
}
return result
}