110 lines
2.8 KiB
Go
110 lines
2.8 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"strings"
|
|
|
|
"next-terminal/server/branding"
|
|
"next-terminal/server/common"
|
|
"next-terminal/server/env"
|
|
"next-terminal/server/model"
|
|
"next-terminal/server/repository"
|
|
"next-terminal/server/utils"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type resourceSharer struct {
|
|
ID string `gorm:"primary_key,type:varchar(36)" json:"id"`
|
|
ResourceId string `gorm:"index,type:varchar(36)" json:"resourceId"`
|
|
ResourceType string `gorm:"index,type:varchar(36)" json:"resourceType"`
|
|
StrategyId string `gorm:"index,type:varchar(36)" json:"strategyId"`
|
|
UserId string `gorm:"index,type:varchar(36)" json:"userId"`
|
|
UserGroupId string `gorm:"index,type:varchar(36)" json:"userGroupId"`
|
|
}
|
|
|
|
var MigrateService = &migrateService{}
|
|
|
|
type migrateService struct {
|
|
baseService
|
|
}
|
|
|
|
func (s *migrateService) Migrate() error {
|
|
var needMigrate = false
|
|
var localVersion = ""
|
|
property, err := repository.PropertyRepository.FindByName(context.Background(), "version")
|
|
if err != nil {
|
|
if !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return err
|
|
}
|
|
// 未获取到版本数据
|
|
needMigrate = true
|
|
} else {
|
|
localVersion = property.Value
|
|
// 数据库版本小于当前版本
|
|
needMigrate = strings.Compare(localVersion, branding.Version) < 0
|
|
}
|
|
|
|
if !needMigrate {
|
|
return nil
|
|
}
|
|
|
|
if err := s.migrateFormV127to130(localVersion); err != nil {
|
|
return err
|
|
}
|
|
|
|
return PropertyService.Update(map[string]interface{}{"version": branding.Version})
|
|
}
|
|
|
|
func (s *migrateService) migrateFormV127to130(localVersion string) (err error) {
|
|
if !strings.Contains(localVersion, "beta") && strings.Compare(localVersion, "v1.3.0") > 0 {
|
|
return nil
|
|
}
|
|
err = env.GetDB().Exec(`update strategies set create_dir = 0 where create_dir = ''`).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
ctx := context.Background()
|
|
var results []resourceSharer
|
|
err = env.GetDB().Raw(`select * from resource_sharers where resource_type = 'asset'`).Find(&results).Error
|
|
if err != nil {
|
|
// 数据库不存在
|
|
return nil
|
|
}
|
|
|
|
// 证明存在旧数据库,执行迁移
|
|
var items []model.Authorised
|
|
for _, result := range results {
|
|
assetId := result.ResourceId
|
|
strategyId := result.StrategyId
|
|
userId := result.UserId
|
|
userGroupId := result.UserGroupId
|
|
|
|
id := utils.Sign([]string{assetId, userId, userGroupId})
|
|
|
|
if err := repository.AuthorisedRepository.DeleteById(ctx, id); err != nil {
|
|
return err
|
|
}
|
|
|
|
authorised := model.Authorised{
|
|
ID: id,
|
|
AssetId: assetId,
|
|
CommandFilterId: "",
|
|
StrategyId: strategyId,
|
|
UserId: userId,
|
|
UserGroupId: userGroupId,
|
|
Created: common.NowJsonTime(),
|
|
}
|
|
items = append(items, authorised)
|
|
}
|
|
|
|
err = repository.AuthorisedRepository.CreateInBatches(ctx, items)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
// 删除旧数据库
|
|
return env.GetDB().Exec(`drop table resource_sharers`).Error
|
|
}
|