diff --git a/go.mod b/go.mod index f682c4e..22ab9b8 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module penahub.gitlab.yandexcloud.net/backend/penahub_common -go 1.19 +go 1.21 + +toolchain go1.21.4 require ( github.com/dgrijalva/jwt-go v3.2.0+incompatible diff --git a/privilege/config/model.go b/privilege/config/model.go deleted file mode 100644 index 2bee72e..0000000 --- a/privilege/config/model.go +++ /dev/null @@ -1,19 +0,0 @@ -package config - -import "time" - -type Privilege struct { - ID string `json:"_id"` - PrivilegeID string `json:"privilegeId"` - Name string `json:"name"` - ServiceKey string `json:"serviceKey"` - Description string `json:"description"` - Type string `json:"type"` - Value string `json:"value"` - Price float64 `json:"price"` - Amount int `json:"amount"` - IsDeleted bool `json:"isDeleted"` - CreatedAt time.Time `json:"createdAt"` - UpdatedAt time.Time `json:"updatedAt"` - DeletedAt time.Time `json:"deletedAt"` -} diff --git a/privilege/controller/privilege.go b/privilege/controller/privilege.go deleted file mode 100644 index 2f61126..0000000 --- a/privilege/controller/privilege.go +++ /dev/null @@ -1,70 +0,0 @@ -package privilege - -import ( - "encoding/json" - "github.com/gofiber/fiber/v2" - "penahub.gitlab.yandexcloud.net/backend/penahub_common/privilege/config" -) - -type Handler struct { - serviceName string - url string - arrPrivilege []config.Privilege -} - -func NewPrivilegeHandler(serviceName string, url string, arrPrivilege []config.Privilege) *Handler { - return &Handler{ - serviceName: serviceName, - url: url, - arrPrivilege: arrPrivilege, - } -} - -func (handler *Handler) GetPrivilege(c *fiber.Ctx) error { - agent := fiber.Get(handler.url) - statusCode, body, errs := agent.Bytes() - if len(errs) > 0 { - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ - "errs": errs, - }) - } - - var privileges []config.Privilege - err := json.Unmarshal(body, &privileges) - if err != nil { - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ - "err": err, - }) - } - - return c.Status(statusCode).JSON(privileges) -} - -func (handler *Handler) PostPrivilege(c *fiber.Ctx) error { - agent := fiber.Post(handler.url).JSON(handler.arrPrivilege) - statusCode, _, errs := agent.Bytes() - - if len(errs) > 0 { - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ - "errs": errs, - }) - } - - return c.SendStatus(statusCode) -} - -func ComparePrivileges(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 -} diff --git a/privilege/privilege.go b/privilege/privilege.go new file mode 100644 index 0000000..f3a7082 --- /dev/null +++ b/privilege/privilege.go @@ -0,0 +1,115 @@ +package privilege + +import ( + "fmt" + "github.com/gofiber/fiber/v2" + "time" +) + +type Client struct { + URL string + ServiceName string + Privileges []Privilege +} + +type Privilege struct { + ID string `json:"_id"` + PrivilegeID string `json:"privilegeId"` + Name string `json:"name"` + ServiceKey string `json:"serviceKey"` + Description string `json:"description"` + Type string `json:"type"` + Value string `json:"value"` + Price float64 `json:"price"` + Amount int `json:"amount"` + IsDeleted bool `json:"isDeleted"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` + DeletedAt time.Time `json:"deletedAt"` +} + +type Controller struct { + client Client + fiberClient *fiber.Client +} + +func NewPrivilege(client Client, fiberClient *fiber.Client) *Controller { + return &Controller{client: client, fiberClient: fiberClient} +} + +// PublishPrivileges публикует привилегии в сервисе. +func (c *Controller) PublishPrivileges() error { + old, err := c.getActualPrivileges() + if err != nil { + return err + } + + if len(old) == 0 { + return c.setupActualPrivileges() + } + + found := false + + for _, oldPriv := range old { + for _, newPriv := range c.client.Privileges { + if newPriv.PrivilegeID == oldPriv.PrivilegeID { + found = true + } + } + if !found { + if err := c.removePrivilege(oldPriv.PrivilegeID); err != nil { + return err + } + } + found = false + } + + return c.updatePrivileges() +} + +// getActualPrivileges возвращает текущие привилегии из сервиса. +func (c *Controller) getActualPrivileges() ([]Privilege, error) { + res := []Privilege{} + _, _, err := c.fiberClient.Get(c.client.URL + "/privilege/service/" + c.client.ServiceName).Struct(&res) + if err != nil { + return res, err[0] + } + fmt.Println("str", res) + return res, nil +} + +// updatePrivileges обновляет привилегии в сервисе. +func (c *Controller) updatePrivileges() error { + _, _, err := c.fiberClient.Put(c.client.URL + "/privilege/many").JSON(map[string][]Privilege{ + "privilege": c.client.Privileges, + }).Bytes() + if err != nil { + return err[0] + } + + return nil +} + +// setupActualPrivileges настраивает привилегии в сервисе. +func (c *Controller) setupActualPrivileges() error { + res := []Privilege{} + _, _, err := c.fiberClient.Post(c.client.URL + "/privilege/many").JSON(map[string][]Privilege{ + "privileges": c.client.Privileges, + }).Struct(&res) + + if err != nil { + return err[0] + } + + return nil +} + +// removePrivilege удаляет привилегию из сервиса по ID. +func (c *Controller) removePrivilege(id string) error { + _, _, err := c.fiberClient.Delete(c.client.URL + "/privilege/").JSON(map[string]string{"privilegeId": id}).Bytes() + if err != nil { + return err[0] + } + + return nil +}