优化
This commit is contained in:
+97
-68
@@ -2,8 +2,7 @@ package data
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"strings"
|
||||
"sort"
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
@@ -38,7 +37,7 @@ func (r *versionRepo) CreateVersion(ctx context.Context, v *biz.Version) error {
|
||||
return nil
|
||||
}
|
||||
func (r *versionRepo) DeleteVersions(ctx context.Context, ids []uint) error {
|
||||
return r.data.gormDB.WithContext(ctx).Delete(&versionPO{}, ids).Error
|
||||
return r.data.gormDB.WithContext(ctx).Where("id IN ?", ids).Delete(&versionPO{}).Error
|
||||
}
|
||||
func (r *versionRepo) FindVersion(ctx context.Context, id uint) (*biz.Version, error) {
|
||||
var po versionPO
|
||||
@@ -77,24 +76,27 @@ func (r *versionRepo) BuildVersionBundle(ctx context.Context, menuIDs, apiIDs, d
|
||||
var menus []menuPO
|
||||
if len(menuIDs) > 0 {
|
||||
if err := r.data.gormDB.WithContext(ctx).Where("id IN ?", menuIDs).Order("sort,id").Find(&menus).Error; err != nil {
|
||||
return nil, err
|
||||
return nil, &biz.VersionStageError{Stage: biz.VersionStageMenus, Err: err}
|
||||
}
|
||||
}
|
||||
byID := map[uint]*biz.Menu{}
|
||||
for _, po := range menus {
|
||||
v := menuFromPO(po)
|
||||
v.Children = []*biz.Menu{}
|
||||
var btns []menuButtonPO
|
||||
_ = r.data.gormDB.WithContext(ctx).Where("sys_base_menu_id = ?", po.ID).Find(&btns).Error
|
||||
for _, btn := range btns {
|
||||
v.Buttons = append(v.Buttons, &biz.MenuButton{Name: btn.Name, Description: btn.Description})
|
||||
}
|
||||
byID[po.ID] = v
|
||||
}
|
||||
if len(menuIDs) > 0 {
|
||||
var buttons []menuButtonPO
|
||||
if err := r.data.gormDB.WithContext(ctx).Where("sys_base_menu_id IN ?", menuIDs).Find(&buttons).Error; err != nil {
|
||||
return nil, &biz.VersionStageError{Stage: biz.VersionStageMenus, Err: err}
|
||||
}
|
||||
for _, button := range buttons {
|
||||
if menu := byID[button.MenuID]; menu != nil {
|
||||
menu.Buttons = append(menu.Buttons, &biz.MenuButton{Name: button.Name, Description: button.Description})
|
||||
}
|
||||
}
|
||||
var parameters []menuParameterPO
|
||||
if err := r.data.gormDB.WithContext(ctx).Where("sys_base_menu_id IN ?", menuIDs).Find(¶meters).Error; err != nil {
|
||||
return nil, err
|
||||
return nil, &biz.VersionStageError{Stage: biz.VersionStageMenus, Err: err}
|
||||
}
|
||||
for _, parameter := range parameters {
|
||||
if menu := byID[parameter.MenuID]; menu != nil {
|
||||
@@ -110,6 +112,14 @@ func (r *versionRepo) BuildVersionBundle(ctx context.Context, menuIDs, apiIDs, d
|
||||
bundle.Menus = append(bundle.Menus, v)
|
||||
}
|
||||
}
|
||||
var sortMenus func([]*biz.Menu)
|
||||
sortMenus = func(items []*biz.Menu) {
|
||||
sort.Slice(items, func(i, j int) bool { return items[i].Sort < items[j].Sort })
|
||||
for _, item := range items {
|
||||
sortMenus(item.Children)
|
||||
}
|
||||
}
|
||||
sortMenus(bundle.Menus)
|
||||
var cleanMenu func(*biz.Menu)
|
||||
cleanMenu = func(menu *biz.Menu) {
|
||||
menu.ID = 0
|
||||
@@ -133,7 +143,7 @@ func (r *versionRepo) BuildVersionBundle(ctx context.Context, menuIDs, apiIDs, d
|
||||
var apis []apiPO
|
||||
if len(apiIDs) > 0 {
|
||||
if err := r.data.gormDB.WithContext(ctx).Where("id IN ?", apiIDs).Find(&apis).Error; err != nil {
|
||||
return nil, err
|
||||
return nil, &biz.VersionStageError{Stage: biz.VersionStageAPIs, Err: err}
|
||||
}
|
||||
}
|
||||
for _, po := range apis {
|
||||
@@ -144,7 +154,7 @@ func (r *versionRepo) BuildVersionBundle(ctx context.Context, menuIDs, apiIDs, d
|
||||
var dictionaries []dictionaryPO
|
||||
if len(dictIDs) > 0 {
|
||||
if err := r.data.gormDB.WithContext(ctx).Where("id IN ?", dictIDs).Find(&dictionaries).Error; err != nil {
|
||||
return nil, err
|
||||
return nil, &biz.VersionStageError{Stage: biz.VersionStageDictionaries, Err: err}
|
||||
}
|
||||
}
|
||||
dictionariesRepo := &dictionaryRepo{data: r.data}
|
||||
@@ -153,7 +163,7 @@ func (r *versionRepo) BuildVersionBundle(ctx context.Context, menuIDs, apiIDs, d
|
||||
v.ID = 0
|
||||
details, _, err := dictionariesRepo.ListDictionaryDetails(ctx, 0, 0, biz.DictionaryDetailFilter{DictionaryID: po.ID})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, &biz.VersionStageError{Stage: biz.VersionStageDictionaries, Err: err}
|
||||
}
|
||||
for _, d := range details {
|
||||
d.ID = 0
|
||||
@@ -168,67 +178,86 @@ func (r *versionRepo) BuildVersionBundle(ctx context.Context, menuIDs, apiIDs, d
|
||||
return bundle, nil
|
||||
}
|
||||
func (r *versionRepo) ImportVersionBundle(ctx context.Context, b *biz.VersionBundle) error {
|
||||
return r.data.gormDB.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
||||
var addMenus func([]*biz.Menu, uint) error
|
||||
addMenus = func(items []*biz.Menu, parent uint) error {
|
||||
for _, item := range items {
|
||||
var existing menuPO
|
||||
err := tx.Where("name = ? AND path = ?", item.Name, item.Path).First(&existing).Error
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
po := menuToPO(item)
|
||||
po.ID = 0
|
||||
po.ParentID = parent
|
||||
if err = tx.Create(&po).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
existing = po
|
||||
for _, button := range item.Buttons {
|
||||
if err = tx.Create(&menuButtonPO{Name: button.Name, Description: button.Description, MenuID: po.ID}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
for _, parameter := range item.Parameters {
|
||||
if err = tx.Create(&menuParameterPO{MenuID: po.ID, Type: parameter.Type, Key: parameter.Key, Value: parameter.Value}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else if err != nil {
|
||||
return err
|
||||
}
|
||||
if err = addMenus(item.Children, existing.ID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
db := r.data.gormDB.WithContext(ctx)
|
||||
if len(b.Menus) > 0 {
|
||||
if err := db.Transaction(func(tx *gorm.DB) error { return importVersionMenus(tx, b.Menus, 0) }); err != nil {
|
||||
return &biz.VersionStageError{Stage: biz.VersionStageMenus, Err: err}
|
||||
}
|
||||
if err := addMenus(b.Menus, 0); err != nil {
|
||||
}
|
||||
if len(b.APIs) > 0 {
|
||||
if err := db.Transaction(func(tx *gorm.DB) error { return importVersionAPIs(tx, b.APIs) }); err != nil {
|
||||
return &biz.VersionStageError{Stage: biz.VersionStageAPIs, Err: err}
|
||||
}
|
||||
}
|
||||
if len(b.Dictionaries) > 0 {
|
||||
if err := db.Transaction(func(tx *gorm.DB) error { return importVersionDictionaries(tx, b.Dictionaries) }); err != nil {
|
||||
return &biz.VersionStageError{Stage: biz.VersionStageDictionaries, Err: err}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func importVersionMenus(tx *gorm.DB, items []*biz.Menu, parentID uint) error {
|
||||
for _, item := range items {
|
||||
var existing menuPO
|
||||
if err := tx.Where("name = ? AND path = ?", item.Name, item.Path).First(&existing).Error; err == nil {
|
||||
if err = importVersionMenus(tx, item.Children, existing.ID); err != nil {
|
||||
return err
|
||||
}
|
||||
continue
|
||||
}
|
||||
po := menuToPO(item)
|
||||
po.ID = 0
|
||||
po.ParentID = parentID
|
||||
if err := tx.Create(&po).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
for _, item := range b.APIs {
|
||||
po := apiPO{Path: item.Path, Description: item.Description, APIGroup: item.APIGroup, Method: strings.ToUpper(item.Method)}
|
||||
if err := tx.Where("path = ? AND method = ?", po.Path, po.Method).FirstOrCreate(&po).Error; err != nil {
|
||||
for _, parameter := range item.Parameters {
|
||||
if err := tx.Create(&menuParameterPO{MenuID: po.ID, Type: parameter.Type, Key: parameter.Key, Value: parameter.Value}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
for _, item := range b.Dictionaries {
|
||||
var count int64
|
||||
if err := tx.Model(&dictionaryPO{}).Where("type = ?", item.Type).Count(&count).Error; err != nil {
|
||||
for _, button := range item.Buttons {
|
||||
if err := tx.Create(&menuButtonPO{Name: button.Name, Description: button.Description, MenuID: po.ID}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if count > 0 {
|
||||
continue
|
||||
}
|
||||
po := dictionaryPO{Name: item.Name, Type: item.Type, Status: item.Status, Desc: item.Desc}
|
||||
if err := tx.Create(&po).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
for _, detail := range item.Details {
|
||||
d := dictionaryDetailPO{Label: detail.Label, Value: detail.Value, Extend: detail.Extend, Status: detail.Status, Sort: detail.Sort, DictionaryID: po.ID}
|
||||
if err := tx.Create(&d).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err := importVersionMenus(tx, item.Children, po.ID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func importVersionAPIs(tx *gorm.DB, items []*biz.API) error {
|
||||
for _, item := range items {
|
||||
var existing apiPO
|
||||
if err := tx.Where("path = ? AND method = ?", item.Path, item.Method).First(&existing).Error; err == nil {
|
||||
continue
|
||||
}
|
||||
if err := tx.Create(&apiPO{Path: item.Path, Description: item.Description, APIGroup: item.APIGroup, Method: item.Method}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func importVersionDictionaries(tx *gorm.DB, items []*biz.Dictionary) error {
|
||||
for _, item := range items {
|
||||
var existing dictionaryPO
|
||||
if err := tx.Where("type = ?", item.Type).First(&existing).Error; err == nil {
|
||||
continue
|
||||
}
|
||||
po := dictionaryPO{Name: item.Name, Type: item.Type, Status: item.Status, Desc: item.Desc}
|
||||
if err := tx.Create(&po).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
for _, detail := range item.Details {
|
||||
value := dictionaryDetailPO{Label: detail.Label, Value: detail.Value, Extend: detail.Extend, Status: detail.Status, Sort: detail.Sort, DictionaryID: po.ID}
|
||||
if err := tx.Create(&value).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user