3
0

Add a nicer error when trying to delete in use sens. levels

This commit is contained in:
Tomaž Jerman
2023-01-04 12:41:15 +01:00
parent cc24e622a3
commit b3a2937e88
6 changed files with 91 additions and 0 deletions
@@ -6,3 +6,4 @@ errors:
invalidID: invalid ID
notAllowedToManage: not allowed to manage sensitivity level
notFound: sensitivity level not found
deleteInUse: cannot delete in use sensitivity levels
+10
View File
@@ -16,6 +16,12 @@ type (
byHandle map[string]int
byID map[uint64]int
}
SensitivityLevelUsage struct {
connections []map[string]any
modules []map[string]any
fields []map[string]any
}
)
func SensitivityLevelIndex(levels ...SensitivityLevel) *sensitivityLevelIndex {
@@ -97,3 +103,7 @@ func (sli sensitivityLevelIndex) isSubset(a, b uint64) (ok bool) {
func (a SensitivityLevelSet) Len() int { return len(a) }
func (a SensitivityLevelSet) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a SensitivityLevelSet) Less(i, j int) bool { return a[i].Level < a[j].Level }
func (u SensitivityLevelUsage) Empty() bool {
return len(u.connections)+len(u.fields)+len(u.modules) == 0
}
+38
View File
@@ -227,6 +227,44 @@ func (svc *service) RemoveSensitivityLevel(levelIDs ...uint64) (err error) {
return
}
// InUseSensitivityLevel checks if and where the sensitivity level is being used
func (svc *service) InUseSensitivityLevel(levelID uint64) (usage SensitivityLevelUsage) {
usage = SensitivityLevelUsage{}
// - connections
for _, c := range svc.connections {
if levelID == c.Config.SensitivityLevelID {
usage.connections = append(usage.connections, map[string]any{
// @todo add when needed
"ident": c.Config.Label,
})
}
}
// - models
for _, mm := range svc.models {
for _, m := range mm {
if levelID == m.SensitivityLevelID {
usage.modules = append(usage.modules, map[string]any{
// @todo add when needed
"ident": m.Ident,
})
}
for _, attr := range m.Attributes {
if levelID == attr.SensitivityLevelID {
usage.fields = append(usage.fields, map[string]any{
// @todo add when needed
"ident": attr.Ident,
})
}
}
}
}
return
}
// // // // // // // // // // // // // // // // // // // // // // // // //
// // // // // // // // // // // // // // // // // // // // // // // // //
@@ -28,6 +28,7 @@ type (
dalSensitivityLevelManager interface {
ReplaceSensitivityLevel(levels ...dal.SensitivityLevel) (err error)
RemoveSensitivityLevel(levels ...uint64) (err error)
InUseSensitivityLevel(levelID uint64) (usage dal.SensitivityLevelUsage)
}
)
@@ -154,6 +155,10 @@ func (svc *dalSensitivityLevel) DeleteByID(ctx context.Context, ID uint64) (err
return DalSensitivityLevelErrNotAllowedToManage(qProps)
}
if !svc.dal.InUseSensitivityLevel(ID).Empty() {
return DalSensitivityLevelErrDeleteInUse()
}
qProps.setSensitivityLevel(q)
q.DeletedAt = now()
@@ -530,6 +530,40 @@ func DalSensitivityLevelErrAlreadyExists(mm ...*dalSensitivityLevelActionProps)
return e
}
// DalSensitivityLevelErrDeleteInUse returns "system:dal-sensitivity-level.deleteInUse" as *errors.Error
//
//
// This function is auto-generated.
//
func DalSensitivityLevelErrDeleteInUse(mm ...*dalSensitivityLevelActionProps) *errors.Error {
var p = &dalSensitivityLevelActionProps{}
if len(mm) > 0 {
p = mm[0]
}
var e = errors.New(
errors.KindInternal,
p.Format("failed to delete sensitivity level {{sensitivityLevel}} because it is in use by other resources", nil),
errors.Meta("type", "deleteInUse"),
errors.Meta("resource", "system:dal-sensitivity-level"),
errors.Meta(dalSensitivityLevelPropsMetaKey{}, p),
// translation namespace & key
errors.Meta(locale.ErrorMetaNamespace{}, "system"),
errors.Meta(locale.ErrorMetaKey{}, "dal-sensitivity-level.errors.deleteInUse"),
errors.StackSkip(1),
)
if len(mm) > 0 {
}
return e
}
// DalSensitivityLevelErrNotAllowedToManage returns "system:dal-sensitivity-level.notAllowedToManage" as *errors.Error
//
// This function is auto-generated.
@@ -68,6 +68,9 @@ errors:
message: "sensitivityLevel by that DSN already exists"
severity: warning
- error: deleteInUse
message: "failed to delete sensitivity level {{sensitivityLevel}} because it is in use by other resources"
- error: notAllowedToManage
message: "not allowed to Manage a sensitivityLevel"
log: "failed to Manage a sensitivityLevel; insufficient permissions"