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 }