67 lines
2.1 KiB
Go
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
|
|
}
|