Implement function to check whether filter rules are valid or not

This commit is contained in:
ionutboangiu
2022-03-15 18:28:05 +02:00
committed by Dan Christian Bogos
parent 1ab927e2fa
commit 5df20653f5
2 changed files with 42 additions and 7 deletions

View File

@@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package apis
import (
"fmt"
"time"
"github.com/cgrates/birpc/context"
@@ -26,11 +27,26 @@ import (
"github.com/cgrates/cgrates/utils"
)
func validateFilterRules(rules []*engine.FilterRule) error {
for _, rule := range rules {
if !rule.IsValid() {
return fmt.Errorf("there exists at least one filter rule that is not valid")
}
}
return nil
}
//SetFilter add a new Filter
func (adms *AdminSv1) SetFilter(ctx *context.Context, arg *engine.FilterWithAPIOpts, reply *string) (err error) {
if missing := utils.MissingStructFields(arg.Filter, []string{utils.ID}); len(missing) != 0 {
return utils.NewErrMandatoryIeMissing(missing...)
}
if len(arg.Rules) == 0 {
return utils.NewErrMandatoryIeMissing("Filter Rules")
}
if err = validateFilterRules(arg.Rules); err != nil {
return utils.APIErrorHandler(err)
}
if arg.Tenant == utils.EmptyString {
arg.Tenant = adms.cfg.GeneralCfg().DefaultTenant
}
@@ -62,7 +78,7 @@ func (adms *AdminSv1) SetFilter(ctx *context.Context, arg *engine.FilterWithAPIO
return utils.APIErrorHandler(err)
}
*reply = utils.OK
return nil
return
}
//GetFilter returns a Filter

View File

@@ -218,19 +218,19 @@ func (fltr *Filter) Compile() (err error) {
var supportedFiltersType utils.StringSet = utils.NewStringSet([]string{
utils.MetaString, utils.MetaPrefix, utils.MetaSuffix,
utils.MetaCronExp, utils.MetaRSR,
utils.MetaEmpty, utils.MetaExists, utils.MetaLessThan, utils.MetaLessOrEqual,
utils.MetaCronExp, utils.MetaRSR, utils.MetaEmpty,
utils.MetaExists, utils.MetaLessThan, utils.MetaLessOrEqual,
utils.MetaGreaterThan, utils.MetaGreaterOrEqual, utils.MetaEqual,
utils.MetaIPNet, utils.MetaAPIBan, utils.MetaActivationInterval,
utils.MetaRegex, utils.MetaNever, utils.MetaCronExp})
utils.MetaRegex, utils.MetaNever})
var needsFieldName utils.StringSet = utils.NewStringSet([]string{
utils.MetaString, utils.MetaPrefix, utils.MetaSuffix,
utils.MetaCronExp, utils.MetaRSR, utils.MetaLessThan,
utils.MetaEmpty, utils.MetaExists, utils.MetaLessOrEqual, utils.MetaGreaterThan,
utils.MetaGreaterOrEqual, utils.MetaEqual, utils.MetaIPNet, utils.MetaAPIBan,
utils.MetaActivationInterval, utils.MetaRegex})
var needsValues utils.StringSet = utils.NewStringSet([]string{utils.MetaString, utils.MetaPrefix,
utils.MetaSuffix, utils.MetaCronExp, utils.MetaRSR,
var needsValues utils.StringSet = utils.NewStringSet([]string{
utils.MetaString, utils.MetaPrefix, utils.MetaSuffix, utils.MetaCronExp, utils.MetaRSR,
utils.MetaLessThan, utils.MetaLessOrEqual, utils.MetaGreaterThan, utils.MetaGreaterOrEqual,
utils.MetaEqual, utils.MetaIPNet, utils.MetaAPIBan, utils.MetaActivationInterval,
utils.MetaRegex})
@@ -277,6 +277,23 @@ type FilterRule struct {
negative *bool
}
// IsValid checks whether a filter rule is valid or not
func (fltr *FilterRule) IsValid() bool {
// Type must be specified
if fltr.Type == utils.EmptyString {
return false
}
// Element must be specified only when the type is different from *never
if fltr.Element == utils.EmptyString && fltr.Type != utils.MetaNever {
return fltr.Type == utils.MetaNever
}
if len(fltr.Values) == 0 && !utils.IsSliceMember([]string{utils.MetaExists, utils.MetaNotExists,
utils.MetaEmpty, utils.MetaNotEmpty}, fltr.Type) {
return false
}
return true
}
// CompileValues compiles RSR fields
func (fltr *FilterRule) CompileValues() (err error) {
switch fltr.Type {
@@ -291,7 +308,7 @@ func (fltr *FilterRule) CompileValues() (err error) {
if fltr.rsrFilters, err = utils.ParseRSRFiltersFromSlice(fltr.Values); err != nil {
return
}
case utils.MetaExists, utils.MetaNotExists, utils.MetaEmpty, utils.MetaNotEmpty: // only the element is builded
case utils.MetaExists, utils.MetaNotExists, utils.MetaEmpty, utils.MetaNotEmpty: // only the element is built
case utils.MetaActivationInterval, utils.MetaNotActivationInterval:
fltr.rsrValues = make(config.RSRParsers, len(fltr.Values))
for i, strVal := range fltr.Values {
@@ -299,6 +316,8 @@ func (fltr *FilterRule) CompileValues() (err error) {
return
}
}
case utils.MetaNever: //return since there is not need for the values to be compiled in this case
return
default:
if fltr.rsrValues, err = config.NewRSRParsersFromSlice(fltr.Values); err != nil {
return