dynamicFormResponseEval.go 2.73 KiB
Newer Older
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
	isEndPage := false
	endPageObj := gjson.Result{}
	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
				isEndPage = obj.Get("isEndPage").Bool()
				if isEndPage {
					endPageObj = obj
				}
		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 {
Roshan Patil's avatar
Roshan Patil committed
			continue
		}
		if result {
			return obj.Value(), nil
		}
	}

	if isEndPage {
		return endPageObj.Value(), nil
	}
	if nextNoConditionPage.String() != "" {
		return nextNoConditionPage.Value(), nil
	}

	ab.SetErrorCode(errormdl.NEXTFORMEVALERROR)
	return nil, errormdl.Wrap("NO CONDITION MATCHED")
}