package routebuildermdl import ( "strings" "time" "corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/cachemdl" "corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/errormdl" "corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/loggermdl" "corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/servicebuildermdl" "github.com/tidwall/gjson" "github.com/zhouzhuojie/conditions" ) var formConditions cachemdl.FastCacheHelper func init() { formConditions.Setup(1000, time.Hour*24, time.Hour*24) } func dynamicFormEvalution(ab *servicebuildermdl.AbstractBusinessLogicHolder, rs gjson.Result) (interface{}, error) { if ab == nil { return nil, nil } eval := ab.GetDynamicEvalData() if eval == nil { return nil, nil } configs := rs.Get("conditions").Array() if rs.String() == "" || len(configs) == 0 { return nil, nil } currentPage := rs.Get("currentPage").String() if currentPage == "" { loggermdl.LogError("No current page found") return nil, errormdl.Wrap("No current page found") } nextNoConditionPage := gjson.Result{} currentPageIsNoCondition := false for _, obj := range configs { condition := obj.Get("condition").String() pageID := obj.Get("pageID").String() noCondition := obj.Get("noCondition").Bool() if noCondition { if currentPageIsNoCondition { nextNoConditionPage = obj currentPageIsNoCondition = false } if pageID == currentPage { currentPageIsNoCondition = true } continue } var expr conditions.Expr var err error if val, ok := formConditions.Get(condition); ok { expr, ok = val.(conditions.Expr) if !ok { parse := conditions.NewParser(strings.NewReader(condition)) expr, err = parse.Parse() if errormdl.CheckErr(err) != nil { ab.SetErrorCode(errormdl.CONDITIONPARSEERROR) loggermdl.LogError(err) return nil, errormdl.CheckErr(err) } formConditions.SetNoExpiration(condition, expr) } } else { parse := conditions.NewParser(strings.NewReader(condition)) expr, err = parse.Parse() if errormdl.CheckErr(err) != nil { ab.SetErrorCode(errormdl.CONDITIONEVALERROR) loggermdl.LogError(err) return nil, errormdl.CheckErr(err) } formConditions.SetNoExpiration(condition, expr) } result, evalErr := conditions.Evaluate(expr, eval) if errormdl.CheckErr(evalErr) != nil { continue } if result { return obj.Value(), nil } } if nextNoConditionPage.String() != "" { return nextNoConditionPage.Value(), nil } ab.SetErrorCode(errormdl.NEXTFORMEVALERROR) return nil, errormdl.Wrap("NO CONDITION MATCHED") }