131 lines
3.1 KiB
Go
131 lines
3.1 KiB
Go
|
package privileges;
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"time"
|
||
|
"github.com/gofiber/fiber/v2"
|
||
|
)
|
||
|
|
||
|
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"`
|
||
|
IsDeleted bool `json:"isDeleted"`
|
||
|
CreatedAt time.Time `json:"createdAt"`
|
||
|
UpdatedAt time.Time `json:"updatedAt"`
|
||
|
DeletedAt time.Time `json:"deletedAt"`
|
||
|
}
|
||
|
|
||
|
const skey = "Шаблонизатор"
|
||
|
|
||
|
var (
|
||
|
Privileges = []Privilege{
|
||
|
{
|
||
|
PrivilegeID: "templateCnt",
|
||
|
Name: "Количество Шаблонов",
|
||
|
ServiceKey: skey,
|
||
|
Description: "Количество шаблонов, которые может сделать пользователь сервиса",
|
||
|
Type: "count",
|
||
|
Value: "шаблон",
|
||
|
},
|
||
|
{
|
||
|
PrivilegeID: "templateUnlimTime",
|
||
|
Name: "Безлимит",
|
||
|
ServiceKey: skey,
|
||
|
Description: "Количество дней, в течении которых пользование сервисом безлимитно",
|
||
|
Type: "day",
|
||
|
Value: "день",
|
||
|
},
|
||
|
{
|
||
|
PrivilegeID: "templateStorage",
|
||
|
Name: "Размер Диска",
|
||
|
ServiceKey: skey,
|
||
|
Description: "Обьём ПенаДиска для хранения шаблонов и результатов шаблонизации",
|
||
|
Type: "count",
|
||
|
Value: "МБ",
|
||
|
},
|
||
|
}
|
||
|
)
|
||
|
|
||
|
func PublishPrivileges(ctx context.Context, domain string) error {
|
||
|
old, err := getActualPrivileges(ctx, domain)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if len(old) == 0 {
|
||
|
return setupActualPrivileges(ctx, Privileges, domain)
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
replacement []Privilege
|
||
|
found = false
|
||
|
)
|
||
|
|
||
|
for _, oldPriv := range old {
|
||
|
for _, newPriv := range Privileges {
|
||
|
if newPriv.PrivilegeID == oldPriv.PrivilegeID {
|
||
|
found := true
|
||
|
}
|
||
|
}
|
||
|
if !found {
|
||
|
if err := removePrivilege(ctx, domain, old.Priv.PrivilegeID); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
found := false
|
||
|
}
|
||
|
|
||
|
return updatePrivileges(ctx, Privileges, domain)
|
||
|
}
|
||
|
|
||
|
func getActualPrivileges(
|
||
|
ctx context.Context,
|
||
|
domain string) ([]Privilege, error) {
|
||
|
var res []Privilege
|
||
|
_, _, err := fiber.Get(domain+"/privilege/service/templategen").Struct(&res)
|
||
|
return res, nil
|
||
|
}
|
||
|
|
||
|
func updatePrivileges(ctx context.Context, data []Privilege, domain string) error {
|
||
|
_, _, err := fiber.Put(domain+"/privilege/many").JSON(map[string][]Privilege{
|
||
|
"privilegies": data,
|
||
|
}).Bytes()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func setupActualPrivileges(
|
||
|
ctx context.Context,
|
||
|
data []Privilege,
|
||
|
domain string) error {
|
||
|
var res []Privilege
|
||
|
_, _, err := fiber.Post(domain+"/privilege/many").JSON(map[string][]Privilege{
|
||
|
"privilegies": data,
|
||
|
}).Struct(&res)
|
||
|
|
||
|
if err != nil {
|
||
|
return err[0]
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func removePrivilege(ctx context.Context, domain, id string) error {
|
||
|
_, _, err := fiber.Delete(domain+"/privilege/")
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|