mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
Implement function to check whether filter rules are valid or not
This commit is contained in:
committed by
Dan Christian Bogos
parent
1ab927e2fa
commit
5df20653f5
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user