dynamicFormResponseEval.go 2.54 KiB
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))
717273747576777879808182838485868788899091929394
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") }