common/privilege/privilege.go

160 lines
3.9 KiB
Go
Raw Normal View History

2023-12-03 15:36:00 +00:00
package privilege
import (
2023-12-03 17:46:10 +00:00
"encoding/json"
2023-12-03 15:36:00 +00:00
"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
}
2024-01-23 16:22:44 +00:00
fmt.Println("Old Privilege:", old)
2024-02-23 05:46:33 +00:00
if len(old) == 0 {
return c.setupActualPrivileges(old)
}
2023-12-03 15:36:00 +00:00
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
}
2024-01-23 16:22:44 +00:00
fmt.Println("Privilege is removed, PrivilegeID:", oldPriv.PrivilegeID)
2023-12-03 15:36:00 +00:00
}
found = false
}
2024-01-22 23:02:32 +00:00
return c.updatePrivileges(old)
2023-12-03 15:36:00 +00:00
}
// getActualPrivileges возвращает текущие привилегии из сервиса.
func (c *Controller) getActualPrivileges() ([]Privilege, error) {
res := []Privilege{}
2023-12-03 17:46:10 +00:00
_, 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)
2023-12-03 15:36:00 +00:00
if err != nil {
2023-12-03 17:46:10 +00:00
return res, err
2023-12-03 15:36:00 +00:00
}
2023-12-03 17:46:10 +00:00
2023-12-03 15:36:00 +00:00
return res, nil
}
// updatePrivileges обновляет привилегии в сервисе.
2024-01-22 23:02:32 +00:00
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
2024-02-23 05:35:13 +00:00
} else {
oldPrivileges[i].Price = oldPriv.Price
2024-01-22 23:02:32 +00:00
}
}
}
_, _, errs := c.fiberClient.Put(c.client.URL + "/privilege/many").JSON(map[string][]Privilege{
"privileges": oldPrivileges,
2023-12-03 15:36:00 +00:00
}).Bytes()
2024-01-22 23:02:32 +00:00
if errs != nil {
return errs[0]
2023-12-03 15:36:00 +00:00
}
2024-02-23 05:46:33 +00:00
if len(oldPrivileges) != len(c.client.Privileges) {
2024-02-23 05:45:12 +00:00
return c.setupActualPrivileges(oldPrivileges)
}
2023-12-03 15:36:00 +00:00
return nil
}
// setupActualPrivileges настраивает привилегии в сервисе.
2024-02-23 05:45:12 +00:00
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)
}
2023-12-03 17:46:10 +00:00
}
2023-12-03 15:36:00 +00:00
2024-02-23 05:45:12 +00:00
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]
}
2023-12-03 15:36:00 +00:00
}
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
}