Enshi/enshi_back/ABAC/rules/CheckRule.go
2024-11-16 12:51:17 +03:00

73 lines
1.2 KiB
Go

package rules
import (
"fmt"
"strconv"
"github.com/gin-gonic/gin"
)
type RuleFunction func(*gin.Context) (bool, []error)
const (
ALL_RULES_MUST_BE_COMPLETED = iota
)
func CheckRule(
c *gin.Context,
ruleChecker RuleFunction,
) (bool, []error) {
IsAllowed, err := ruleChecker(c)
if err != nil {
return false, err
}
return IsAllowed, nil
}
func CheckRules(
c *gin.Context,
rules []RuleFunction,
completedRulesCount int,
) (bool, []error) {
var allowancesIndexes []int
var errors []error
if len(rules) < completedRulesCount {
return false, []error{fmt.Errorf("there is less rules, that should be completed")}
}
for i, rule := range rules {
if isAllowed, err := CheckRule(c, rule); err != nil {
errors = append(
errors,
err...,
)
} else if !isAllowed {
errors = append(
errors,
fmt.Errorf("rule "+
strconv.Itoa(i)+
" was rejected"),
)
} else {
allowancesIndexes = append(allowancesIndexes, i)
}
}
switch completedRulesCount {
case ALL_RULES_MUST_BE_COMPLETED:
if len(allowancesIndexes) == len(rules) {
return true, nil
} else {
return false, errors
}
default:
if len(allowancesIndexes) >= completedRulesCount {
return true, nil
} else {
return false, errors
}
}
}