101 lines
3.6 KiB
Go
101 lines
3.6 KiB
Go
package version
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"runtime"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/clause"
|
|
|
|
"git.ilapage.cn/ila/yovision/Sense/server/app/sense/quota"
|
|
"git.ilapage.cn/ila/yovision/Sense/server/cmd/migrate/migration"
|
|
migrationModels "git.ilapage.cn/ila/yovision/Sense/server/cmd/migrate/migration/models"
|
|
common "git.ilapage.cn/ila/yovision/Sense/server/common/models"
|
|
)
|
|
|
|
func init() {
|
|
_, fileName, _, _ := runtime.Caller(0)
|
|
migration.Migrate.SetVersion(migration.GetFilename(fileName), migrateSenseQuota)
|
|
}
|
|
|
|
func migrateSenseQuota(db *gorm.DB, version string) error {
|
|
return db.Transaction(func(tx *gorm.DB) error {
|
|
if err := tx.AutoMigrate("a.Setting{}, "a.Change{}); err != nil {
|
|
return err
|
|
}
|
|
now := time.Now().UTC()
|
|
setting := quota.Setting{ID: quota.SettingID, Limit: initialQuotaLimit(), Source: "migration", Version: 1}
|
|
setting.CreatedAt, setting.UpdatedAt = now, now
|
|
if err := tx.Clauses(clause.OnConflict{DoNothing: true}).Create(&setting).Error; err != nil {
|
|
return err
|
|
}
|
|
root, err := ensureDeviceMenu(tx, migrationModels.SysMenu{
|
|
MenuName: senseLayoutMenuName, Title: "视频感知", Icon: "video-camera", Path: "/sense",
|
|
MenuType: "M", Component: "Layout", Sort: 5, Visible: "0", IsFrame: "1",
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
page, err := ensureDeviceMenu(tx, migrationModels.SysMenu{
|
|
MenuName: "SenseQuota", Title: "容量与配额", Icon: "data-line", Path: "quota",
|
|
Paths: fmt.Sprintf("/0/%d", root.MenuId), MenuType: "C", Permission: "sense:quota:list",
|
|
ParentId: root.MenuId, Component: "/sense/quota/index", Sort: 8, Visible: "0", IsFrame: "1",
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
update, err := ensureDeviceMenu(tx, migrationModels.SysMenu{
|
|
MenuName: "SenseQuotaUpdate", Title: "调整配额", MenuType: "F", Action: "PUT",
|
|
Permission: "sense:quota:update", ParentId: page.MenuId,
|
|
Paths: fmt.Sprintf("/0/%d/%d", root.MenuId, page.MenuId), Sort: 1, Visible: "1", IsFrame: "1",
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
var devicePage migrationModels.SysMenu
|
|
if err = tx.Where("menu_name = ?", "SenseDeviceManage").First(&devicePage).Error; err != nil {
|
|
return err
|
|
}
|
|
enable, err := ensureDeviceMenu(tx, migrationModels.SysMenu{
|
|
MenuName: "SenseDeviceEnable", Title: "启用设备", MenuType: "F", Action: "PUT",
|
|
Permission: "sense:device:enable", ParentId: devicePage.MenuId,
|
|
Paths: fmt.Sprintf("/0/%d/%d", root.MenuId, devicePage.MenuId), Sort: 5, Visible: "1", IsFrame: "1",
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, role := range []string{"implementation_operator", "site_admin", "viewer"} {
|
|
if err = attachDeviceRole(tx, role, []migrationModels.SysMenu{page}); err != nil {
|
|
return err
|
|
}
|
|
if err = tx.Clauses(clause.OnConflict{DoNothing: true}).Create(&deviceCasbinRule{Ptype: "p", V0: role, V1: "/api/v1/quota", V2: "GET"}).Error; err != nil {
|
|
return err
|
|
}
|
|
}
|
|
if err = attachDeviceRole(tx, "site_admin", []migrationModels.SysMenu{update, enable}); err != nil {
|
|
return err
|
|
}
|
|
for _, policy := range [][2]string{{"/api/v1/quota", "PUT"}, {"/api/v1/devices/:id/enable", "PUT"}} {
|
|
if err = tx.Clauses(clause.OnConflict{DoNothing: true}).Create(&deviceCasbinRule{Ptype: "p", V0: "site_admin", V1: policy[0], V2: policy[1]}).Error; err != nil {
|
|
return err
|
|
}
|
|
}
|
|
if err = rebuildSenseMenuPaths(tx, root.MenuId, "/0"); err != nil {
|
|
return err
|
|
}
|
|
return tx.Create(&common.Migration{Version: version}).Error
|
|
})
|
|
}
|
|
|
|
func initialQuotaLimit() int {
|
|
value, err := strconv.Atoi(strings.TrimSpace(os.Getenv("SENSE_PROVISIONING_QUOTA")))
|
|
if err != nil || value < 1 || value > 100000 {
|
|
return 16
|
|
}
|
|
return value
|
|
}
|