package privilege import ( "encoding/json" "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 } fmt.Println("Old Privilege:", old) if len(old) == 0 { return c.setupActualPrivileges(old) } 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 } fmt.Println("Privilege is removed, PrivilegeID:", oldPriv.PrivilegeID) } found = false } return c.updatePrivileges(old) } // getActualPrivileges возвращает текущие привилегии из сервиса. func (c *Controller) getActualPrivileges() ([]Privilege, error) { res := []Privilege{} _, body, errs := c.fiberClient.Get(c.client.URL + "/privilege/service/" + c.client.ServiceName).Bytes() if errs != nil { return res, errs[0] } fmt.Println("Response Body:", string(body)) err := json.Unmarshal(body, &res) if err != nil { return res, err } return res, nil } // updatePrivileges обновляет привилегии в сервисе. func (c *Controller) updatePrivileges(oldPrivileges []Privilege) error { newPrivilegesMap := make(map[string]Privilege) for _, newPriv := range c.client.Privileges { newPrivilegesMap[newPriv.PrivilegeID] = newPriv } for i, oldPriv := range oldPrivileges { if newPriv, exists := newPrivilegesMap[oldPriv.PrivilegeID]; exists { if newPriv.Price != 0 { oldPrivileges[i].Price = newPriv.Price } else { oldPrivileges[i].Price = oldPriv.Price } } } _, _, errs := c.fiberClient.Put(c.client.URL + "/privilege/many").JSON(map[string][]Privilege{ "privileges": oldPrivileges, }).Bytes() if errs != nil { return errs[0] } if len(oldPrivileges) != len(c.client.Privileges) { return c.setupActualPrivileges(oldPrivileges) } return nil } // setupActualPrivileges настраивает привилегии в сервисе. func (c *Controller) setupActualPrivileges(oldPrivileges []Privilege) error { newPrivileges := []Privilege{} for _, newPriv := range c.client.Privileges { isNew := true for _, oldPriv := range oldPrivileges { if newPriv.PrivilegeID == oldPriv.PrivilegeID { isNew = false break } } if isNew { newPrivileges = append(newPrivileges, newPriv) } } if len(newPrivileges) > 0 { _, _, errs := c.fiberClient.Post(c.client.URL + "/privilege/many").JSON(map[string][]Privilege{ "privileges": newPrivileges, }).Bytes() if errs != nil { return errs[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 }