mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-06-22 05:32:44 +08:00
69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
package db
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"yunion.io/x/onecloud/pkg/cloudcommon/consts"
|
|
"yunion.io/x/onecloud/pkg/httperrors"
|
|
"yunion.io/x/pkg/util/stringutils"
|
|
)
|
|
|
|
func isNameUnique(manager IModelManager, owner string, name string) bool {
|
|
q := manager.Query()
|
|
q = manager.FilterByName(q, name)
|
|
if !consts.IsGlobalVirtualResourceNamespace() {
|
|
q = manager.FilterByOwner(q, owner)
|
|
}
|
|
return q.Count() == 0
|
|
}
|
|
|
|
func NewNameValidator(manager IModelManager, ownerProjId string, name string) error {
|
|
err := manager.ValidateName(name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !isNameUnique(manager, ownerProjId, name) {
|
|
return httperrors.NewDuplicateNameError("name", name)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func isAlterNameUnique(model IModel, name string) bool {
|
|
manager := model.GetModelManager()
|
|
q := manager.Query()
|
|
q = manager.FilterByName(q, name)
|
|
if !consts.IsGlobalVirtualResourceNamespace() {
|
|
q = manager.FilterByOwner(q, model.GetOwnerProjectId())
|
|
}
|
|
q = manager.FilterByNotId(q, model.GetId())
|
|
return q.Count() == 0
|
|
}
|
|
|
|
func alterNameValidator(model IModel, name string) error {
|
|
err := model.GetModelManager().ValidateName(name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !isAlterNameUnique(model, name) {
|
|
return httperrors.NewDuplicateNameError("name", name)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func GenerateName(manager IModelManager, ownerProjId string, hint string) string {
|
|
_, pattern, patternLen := stringutils.ParseNamePattern(hint)
|
|
var name string
|
|
idx := 1
|
|
if patternLen == 0 {
|
|
name = hint
|
|
} else {
|
|
name = fmt.Sprintf(pattern, idx)
|
|
idx += 1
|
|
}
|
|
for !isNameUnique(manager, ownerProjId, name) {
|
|
name = fmt.Sprintf(pattern, idx)
|
|
idx += 1
|
|
}
|
|
return name
|
|
}
|