160 lines
3.9 KiB
Go
160 lines
3.9 KiB
Go
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
|
|
}
|