Skip to content
This repository was archived by the owner on Oct 8, 2024. It is now read-only.

Commit d8101d1

Browse files
authored
Merge pull request #106 from bancodobrasil/develop
Versão 2.2.0
2 parents 690fe8f + 545948a commit d8101d1

File tree

20 files changed

+529
-368
lines changed

20 files changed

+529
-368
lines changed

.env.sample

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,9 @@ FEATWS_RULLER_PORT=8000
22
FEATWS_RULLER_RESOURCE_LOADER_URL=https://myrepo.com/{knowledgeBase}/{version}/rules.grl
33
FEATWS_RULLER_RESOURCE_LOADER_HEADERS=PRIVATE-TOKEN:123123d12d12d1
44
TELEMETRY_EXPORTER_URL=http://jaeger:YOURPORT
5-
FEATWS_RULLER_API_KEY=abc123
5+
FEATWS_RULLER_API_KEY=abc123
6+
7+
FEATWS_RULLER_KNOWLEDGE_BASE_VERSION_TTL=5
8+
9+
GOAUTH_HANDLERS=api_key
10+
GOAUTH_API_KEY_LIST=abc123

.github/workflows/go.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66
branches: [ develop, master ]
77

88
env:
9-
LATEST_GO_VERSION: "1.19"
9+
LATEST_GO_VERSION: "1.22"
1010
GO111MODULE: "on"
1111

1212
jobs:
@@ -16,7 +16,7 @@ jobs:
1616
runs-on: ${{ matrix.os }}
1717
strategy:
1818
matrix:
19-
go_version: ['1.19','1.20']
19+
go_version: ['1.21','1.22']
2020
os: [ubuntu-latest, windows-latest, macOS-latest]
2121
steps:
2222
- uses: actions/checkout@v2

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@ example.json
77
*.env
88
*.out
99
vendor
10-
api.http
10+
test.json
11+
__debug_bin*
12+
.vscode/

Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM golang:1.19-alpine AS BUILD
1+
FROM golang:1.22-alpine AS BUILD
22

33
WORKDIR /app
44

@@ -12,7 +12,7 @@ COPY . /app
1212

1313
RUN go build -o ruller
1414

15-
FROM alpine:3.15
15+
FROM alpine:3.19
1616

1717
COPY --from=BUILD /app/ruller /bin/
1818

api.http

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#POST http://localhost:8000/api/v1/eval/mobilepf/latest
2+
POST http://localhost:8000/api/v1/eval/jamie-menu-64623317-d00c-4508-8db3-613d1ed24638/
3+
Content-Type: application/json
4+
X-API-Key: abc123
5+
6+
{
7+
"idade":13
8+
}

config/config.go

Lines changed: 68 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,11 @@ import (
2626
// - ResolverBridgeHeaders: This field will be used to store HTTP headers that will be sent along with requests to the resolver bridge URL. The `http.Header` type is a map of strings to slices of strings, representing the headers and their values.
2727
// - ResolverBridgeHeadersStr: This property is a string representation of the HTTP headers that will be sent to the resolver bridge. It is used in conjunction with the ResolverBridgeHeaders property to set the headers for requests made to the resolver bridge. The headers can be specified as a JSON object in string format.
2828
// - ExternalHost: This property represents the external host name or IP address of the server where the application is running. It is used to construct URLs for external resources and APIs.
29-
// - AuthAPIKey: This property is used to store the API key for authentication purposes. It is used to authenticate requests made to the Ruller API.
29+
// - KnowledgeBaseVersionTTL: This property is used to define the TTL of a KnowledgeBase Version when it's used a tag name version.
3030
type Config struct {
31-
ResourceLoaderType string `mapstructure:"FEATWS_RULLER_RESOURCE_LOADER_TYPE"`
32-
ResourceLoaderURL string `mapstructure:"FEATWS_RULLER_RESOURCE_LOADER_URL"`
33-
ResourceLoaderHeaders http.Header
34-
ResourceLoaderHeadersStr string `mapstructure:"FEATWS_RULLER_RESOURCE_LOADER_HEADERS"`
31+
ResourceLoader *ResourceLoader
32+
33+
LogLevel string `mapstructure:"FEATWS_RULLER_LOG_LEVEL"`
3534

3635
Port string `mapstructure:"PORT"`
3736
DefaultRules string `mapstructure:"FEATWS_RULLER_DEFAULT_RULES"`
@@ -43,10 +42,41 @@ type Config struct {
4342

4443
ExternalHost string `mapstructure:"EXTERNAL_HOST"`
4544

46-
AuthAPIKey string `mapstructure:"FEATWS_RULLER_API_KEY"`
45+
KnowledgeBaseVersionTTL int64 `mapstructure:"FEATWS_RULLER_KNOWLEDGE_BASE_VERSION_TTL"`
46+
47+
GoroutineThreshold int64 `mapstructure:"FEATWS_RULLER_GOROUTINE_THRESHOLD"`
48+
}
49+
50+
// ResourceLoader represents a generic resource loader that can be either HTTP or Minio type.
51+
type ResourceLoader struct {
52+
Type string `mapstructure:"FEATWS_RULLER_RESOURCE_LOADER_TYPE"` // Type of resource loader.
53+
HTTP *ResourceLoaderHTTP // Specific configurations for HTTP resource loader.
54+
Minio *ResourceLoaderMinio // Specific configurations for Minio resource loader.
4755
}
4856

49-
var config = &Config{}
57+
// ResourceLoaderHTTP represents specific configurations for an HTTP resource loader.
58+
type ResourceLoaderHTTP struct {
59+
URL string `mapstructure:"FEATWS_RULLER_RESOURCE_LOADER_HTTP_URL"` // URL of the HTTP resource loader.
60+
Headers http.Header // HTTP Headers to be sent in the requests.
61+
HeadersStr string `mapstructure:"FEATWS_RULLER_RESOURCE_LOADER_HTTP_HEADERS"` // String representation of the HTTP headers.
62+
}
63+
64+
// ResourceLoaderMinio represents specific configurations for a Minio resource loader.
65+
type ResourceLoaderMinio struct {
66+
Bucket string `mapstructure:"FEATWS_RULLER_RESOURCE_LOADER_MINIO_BUCKET"` // Minio Bucket for loading resources.
67+
Endpoint string `mapstructure:"FEATWS_RULLER_RESOURCE_LOADER_MINIO_ENDPOINT"` // Minio server Endpoint.
68+
AccessKey string `mapstructure:"FEATWS_RULLER_RESOURCE_LOADER_MINIO_ACCESS_KEY"` // Minio Access Key.
69+
SecretKey string `mapstructure:"FEATWS_RULLER_RESOURCE_LOADER_MINIO_SECRET_KEY"` // Minio Secret Key.
70+
UseSSL bool `mapstructure:"FEATWS_RULLER_RESOURCE_LOADER_MINIO_USE_SSL"` // Indicates whether SSL should be used in the connection.
71+
PathTemplate string `mapstructure:"FEATWS_RULLER_RESOURCE_LOADER_MINIO_PATH_TEMPLATE"` // Path template for resources in Minio.
72+
}
73+
74+
var config = &Config{
75+
ResourceLoader: &ResourceLoader{
76+
HTTP: &ResourceLoaderHTTP{},
77+
Minio: &ResourceLoaderMinio{},
78+
},
79+
}
5080

5181
var loaded = false
5282

@@ -58,34 +88,60 @@ func LoadConfig() (err error) {
5888

5989
viper.AutomaticEnv()
6090

91+
viper.SetDefault("FEATWS_RULLER_LOG_LEVEL", "INFO")
6192
viper.SetDefault("FEATWS_RULLER_RESOURCE_LOADER_TYPE", "http")
62-
viper.SetDefault("FEATWS_RULLER_RESOURCE_LOADER_URL", "")
6393
viper.SetDefault("FEATWS_RULLER_RESOURCE_LOADER_HEADERS", "")
94+
viper.SetDefault("FEATWS_RULLER_RESOURCE_LOADER_MINIO_BUCKET", "")
95+
viper.SetDefault("FEATWS_RULLER_RESOURCE_LOADER_MINIO_ENDPOINT", "")
96+
viper.SetDefault("FEATWS_RULLER_RESOURCE_LOADER_MINIO_ACCESS_KEY", "")
97+
viper.SetDefault("FEATWS_RULLER_RESOURCE_LOADER_MINIO_SECRET_KEY", "")
98+
viper.SetDefault("FEATWS_RULLER_RESOURCE_LOADER_MINIO_USE_SSL", "true")
99+
viper.SetDefault("FEATWS_RULLER_RESOURCE_LOADER_MINIO_PATH_TEMPLATE", "{knowledgeBase}/{version}.grl")
64100
viper.SetDefault("FEATWS_RULLER_RESOLVER_BRIDGE_URL", "")
65101
viper.SetDefault("FEATWS_RULLER_RESOLVER_BRIDGE_HEADERS", "")
66102
viper.SetDefault("FEATWS_RULLER_DEFAULT_RULES", "")
67103
viper.SetDefault("PORT", "8000")
68104
viper.SetDefault("FEATWS_DISABLE_SSL_VERIFY", false)
69105
viper.SetDefault("EXTERNAL_HOST", "localhost:8000")
70-
viper.SetDefault("FEATWS_RULLER_API_KEY", "")
106+
viper.SetDefault("FEATWS_RULLER_KNOWLEDGE_BASE_VERSION_TTL", "300")
107+
viper.SetDefault("FEATWS_RULLER_GOROUTINE_THRESHOLD", "200")
71108

72109
err = viper.ReadInConfig()
73110
if err != nil {
74111
if err2, ok := err.(*os.PathError); !ok {
75112
err = err2
76113
log.Errorf("Error on Load Config: %v", err)
114+
77115
return
78116
}
79117
}
80118

81119
err = viper.Unmarshal(config)
120+
if err != nil {
121+
panic(fmt.Sprintf("load config error: %s", err))
122+
}
123+
124+
err = viper.Unmarshal(config.ResourceLoader)
125+
if err != nil {
126+
panic(fmt.Sprintf("load config http error: %s", err))
127+
}
82128

83-
config.ResourceLoaderHeaders = make(http.Header)
84-
resourceLoaderHeaders := strings.Split(config.ResourceLoaderHeadersStr, ",")
129+
err = viper.Unmarshal(config.ResourceLoader.HTTP)
130+
if err != nil {
131+
panic(fmt.Sprintf("load config http error: %s", err))
132+
}
133+
134+
err = viper.Unmarshal(config.ResourceLoader.Minio)
135+
if err != nil {
136+
panic(fmt.Sprintf("load config minio error: %s", err))
137+
}
138+
139+
config.ResourceLoader.HTTP.Headers = make(http.Header)
140+
resourceLoaderHeaders := strings.Split(config.ResourceLoader.HTTP.HeadersStr, ",")
85141
for _, value := range resourceLoaderHeaders {
86142
entries := strings.Split(value, ":")
87143
if len(entries) == 2 {
88-
config.ResourceLoaderHeaders.Set(entries[0], entries[1])
144+
config.ResourceLoader.HTTP.Headers.Set(entries[0], entries[1])
89145
}
90146
}
91147

@@ -97,7 +153,6 @@ func LoadConfig() (err error) {
97153
config.ResolverBridgeHeaders.Set(entries[0], entries[1])
98154
}
99155
}
100-
101156
return
102157
}
103158

controllers/health.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ var health = healthcheck.NewHandler()
3535
// configuration.
3636
func newHandler() healthcheck.Handler {
3737
cfg := config.GetConfig()
38-
health.AddLivenessCheck("goroutine-threshold", goroutine.Count(100))
38+
health.AddLivenessCheck("goroutine-threshold", goroutine.Count(int(cfg.GoroutineThreshold)))
3939

40-
if cfg.ResourceLoaderURL != "" {
41-
rawResourceLoaderURL := cfg.ResourceLoaderURL
40+
if cfg.ResourceLoader.Type == "http" && cfg.ResourceLoader.HTTP.URL != "" {
41+
rawResourceLoaderURL := cfg.ResourceLoader.HTTP.URL
4242
resourceLoader, _ := url.Parse(rawResourceLoaderURL)
4343

4444
if resourceLoader.Scheme == "" {

controllers/v1/evalHandler.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ func EvalHandler() gin.HandlerFunc {
133133

134134
log.Debugf("Eval with %s %s\n", knowledgeBaseName, version)
135135

136-
knowledgeBase, requestError := services.EvalService.GetKnowledgeBase(knowledgeBaseName, version)
136+
knowledgeBase, requestError := services.EvalService.GetKnowledgeBase(c, knowledgeBaseName, version)
137137
if requestError != nil {
138138
c.String(requestError.StatusCode, requestError.Message)
139139
return
@@ -148,7 +148,7 @@ func EvalHandler() gin.HandlerFunc {
148148
fmt.Fprint(c.Writer, "Error on json decode")
149149
return
150150
}
151-
log.Debugln(t)
151+
log.Traceln(t)
152152

153153
ctx := types.NewContextFromMap(t)
154154
ctx.RawContext = c.Request.Context()
@@ -162,8 +162,8 @@ func EvalHandler() gin.HandlerFunc {
162162
return
163163
}
164164

165-
log.Debug("Context:\n\t", ctx.GetEntries(), "\n\n")
166-
log.Debug("Features:\n\t", result.GetFeatures(), "\n\n")
165+
log.Trace("Context:\n\t", ctx.GetEntries(), "\n\n")
166+
log.Trace("Features:\n\t", result.GetFeatures(), "\n\n")
167167

168168
responseCode := http.StatusOK
169169

controllers/v1/evalHandler_test.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package v1
22

33
import (
4+
"context"
45
"fmt"
56
"io"
67
"net/http"
@@ -49,7 +50,7 @@ type EvalServiceTestEvalHandlerWithoutKnowledgeBaseAndVersion struct {
4950
// testing purposes. It checks if the `knowledgeBaseName` and `version` parameters passed to the method
5051
// are equal to the default values defined in the `services` package. If they are not equal, it logs an
5152
// error using the `testing.T` object and returns `nil`. If they are equal, it simply returns `nil`.
52-
func (s EvalServiceTestEvalHandlerWithoutKnowledgeBaseAndVersion) LoadRemoteGRL(knowledgeBaseName string, version string) error {
53+
func (s EvalServiceTestEvalHandlerWithoutKnowledgeBaseAndVersion) LoadRemoteGRL(ctx context.Context, knowledgeBaseName string, version string) error {
5354
if knowledgeBaseName != services.DefaultKnowledgeBaseName || version != services.DefaultKnowledgeBaseVersion {
5455
s.t.Error("Did not load the default")
5556
}
@@ -66,7 +67,7 @@ func (s EvalServiceTestEvalHandlerWithoutKnowledgeBaseAndVersion) GetKnowledgeLi
6667
return ast.NewKnowledgeLibrary()
6768
}
6869

69-
func (s EvalServiceTestEvalHandlerWithoutKnowledgeBaseAndVersion) GetKnowledgeBase(knowledgeBaseName string, version string) (*ast.KnowledgeBase, *errors.RequestError) {
70+
func (s EvalServiceTestEvalHandlerWithoutKnowledgeBaseAndVersion) GetKnowledgeBase(ctx context.Context, knowledgeBaseName string, version string) (*ast.KnowledgeBase, *errors.RequestError) {
7071
return nil, &errors.RequestError{Message: "KnowledgeBase or version not found", StatusCode: 404}
7172
}
7273

@@ -111,7 +112,7 @@ type EvalServiceTestEvalHandlerLoadError struct {
111112
// that might occur when loading a knowledge base or version. This function is used in the test case
112113
// `TestEvalHandlerLoadError` to create a mock implementation of the `services.IEval` interface that
113114
// returns an error when the `EvalHandler` function is called.
114-
func (s EvalServiceTestEvalHandlerLoadError) LoadRemoteGRL(knowledgeBaseName string, version string) error {
115+
func (s EvalServiceTestEvalHandlerLoadError) LoadRemoteGRL(ctx context.Context, knowledgeBaseName string, version string) error {
115116
return fmt.Errorf("mock load error")
116117
}
117118

@@ -124,7 +125,7 @@ func (s EvalServiceTestEvalHandlerLoadError) GetKnowledgeLibrary() *ast.Knowledg
124125
return ast.NewKnowledgeLibrary()
125126
}
126127

127-
func (s EvalServiceTestEvalHandlerLoadError) GetKnowledgeBase(knowledgeBaseName string, version string) (*ast.KnowledgeBase, *errors.RequestError) {
128+
func (s EvalServiceTestEvalHandlerLoadError) GetKnowledgeBase(ctx context.Context, knowledgeBaseName string, version string) (*ast.KnowledgeBase, *errors.RequestError) {
128129
return nil, &errors.RequestError{Message: "Error on load knowledgeBase and/or version", StatusCode: 500}
129130
}
130131

@@ -168,7 +169,7 @@ type EvalServiceTestEvalHandlerWithDefaultKnowledgeBase struct {
168169

169170
// This method takes two parameters, `knowledgeBaseName` and `version`, but it does not perform any action and
170171
// always returns `nil`.
171-
func (s EvalServiceTestEvalHandlerWithDefaultKnowledgeBase) LoadRemoteGRL(knowledgeBaseName string, version string) error {
172+
func (s EvalServiceTestEvalHandlerWithDefaultKnowledgeBase) LoadRemoteGRL(ctx context.Context, knowledgeBaseName string, version string) error {
172173
return nil
173174
}
174175

@@ -187,7 +188,7 @@ func (s EvalServiceTestEvalHandlerWithDefaultKnowledgeBase) Eval(ctx *types.Cont
187188
}
188189

189190
// Thiss a test function for the EvalHandler function with a default knowledge base.
190-
func (s EvalServiceTestEvalHandlerWithDefaultKnowledgeBase) GetKnowledgeBase(knowledgeBaseName string, version string) (*ast.KnowledgeBase, *errors.RequestError) {
191+
func (s EvalServiceTestEvalHandlerWithDefaultKnowledgeBase) GetKnowledgeBase(ctx context.Context, knowledgeBaseName string, version string) (*ast.KnowledgeBase, *errors.RequestError) {
191192
return s.kl.GetKnowledgeBase(knowledgeBaseName, version), nil
192193
}
193194

@@ -249,7 +250,7 @@ type EvalServiceTestEvalHandlerWithDefaultKnowledgeBaseAndWrongJSON struct {
249250
// This method takes in two parameters `knowledgeBaseName` and `version` of type string and returns an
250251
// error. In this implementation, the method does not perform any action and simply returns a nil
251252
// error.
252-
func (s EvalServiceTestEvalHandlerWithDefaultKnowledgeBaseAndWrongJSON) LoadRemoteGRL(knowledgeBaseName string, version string) error {
253+
func (s EvalServiceTestEvalHandlerWithDefaultKnowledgeBaseAndWrongJSON) LoadRemoteGRL(ctx context.Context, knowledgeBaseName string, version string) error {
253254
return nil
254255
}
255256

@@ -265,7 +266,7 @@ func (s EvalServiceTestEvalHandlerWithDefaultKnowledgeBaseAndWrongJSON) Eval(ctx
265266
}
266267

267268
// This is a test that tests the EvalHandler function with a default knowledge base and wrong JSON input.
268-
func (s EvalServiceTestEvalHandlerWithDefaultKnowledgeBaseAndWrongJSON) GetKnowledgeBase(knowledgeBaseName string, version string) (*ast.KnowledgeBase, *errors.RequestError) {
269+
func (s EvalServiceTestEvalHandlerWithDefaultKnowledgeBaseAndWrongJSON) GetKnowledgeBase(ctx context.Context, knowledgeBaseName string, version string) (*ast.KnowledgeBase, *errors.RequestError) {
269270
return s.kl.GetKnowledgeBase(knowledgeBaseName, version), nil
270271
}
271272

@@ -327,7 +328,7 @@ type EvalServiceTestEvalHandlerWithDefaultKnowledgeBaseEvalError struct {
327328
// method takes in two parameters `knowledgeBaseName` and `version` of type string and returns an
328329
// error. In this implementation, the method always returns `nil`, indicating that there was no error
329330
// in loading the remote knowledge base.
330-
func (s EvalServiceTestEvalHandlerWithDefaultKnowledgeBaseEvalError) LoadRemoteGRL(knowledgeBaseName string, version string) error {
331+
func (s EvalServiceTestEvalHandlerWithDefaultKnowledgeBaseEvalError) LoadRemoteGRL(ctx context.Context, knowledgeBaseName string, version string) error {
331332
return nil
332333
}
333334

@@ -349,7 +350,7 @@ func (s EvalServiceTestEvalHandlerWithDefaultKnowledgeBaseEvalError) Eval(ctx *t
349350

350351
// This is a test that tests the EvalHandler function with a default knowledge base and
351352
// an evaluation error.
352-
func (s EvalServiceTestEvalHandlerWithDefaultKnowledgeBaseEvalError) GetKnowledgeBase(knowledgeBaseName string, version string) (*ast.KnowledgeBase, *errors.RequestError) {
353+
func (s EvalServiceTestEvalHandlerWithDefaultKnowledgeBaseEvalError) GetKnowledgeBase(ctx context.Context, knowledgeBaseName string, version string) (*ast.KnowledgeBase, *errors.RequestError) {
353354
return s.kl.GetKnowledgeBase(knowledgeBaseName, version), nil
354355
}
355356
func TestEvalHandlerWithDefaultKnowledgeBaseEvalError(t *testing.T) {

docs/docs.go

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
// Code generated by swaggo/swag. DO NOT EDIT.
2-
1+
// Package docs Code generated by swaggo/swag. DO NOT EDIT
32
package docs
43

54
import "github.com/swaggo/swag"
@@ -44,18 +43,6 @@ const docTemplate = `{
4443
],
4544
"summary": "Evaluate the rulesheet / Avaliação da folha de Regra",
4645
"parameters": [
47-
{
48-
"type": "string",
49-
"description": "knowledgeBase",
50-
"name": "knowledgeBase",
51-
"in": "path"
52-
},
53-
{
54-
"type": "string",
55-
"description": "version",
56-
"name": "version",
57-
"in": "path"
58-
},
5946
{
6047
"description": "Parameters",
6148
"name": "parameters",
@@ -125,12 +112,6 @@ const docTemplate = `{
125112
"name": "knowledgeBase",
126113
"in": "path"
127114
},
128-
{
129-
"type": "string",
130-
"description": "version",
131-
"name": "version",
132-
"in": "path"
133-
},
134115
{
135116
"description": "Parameters",
136117
"name": "parameters",
@@ -279,6 +260,8 @@ var SwaggerInfo = &swag.Spec{
279260
Description: "O projeto Ruler é uma implementação do motor de regras [grule-rule-engine](https://github.com/hyperjumptech/grule-rule-engine), que é utilizado para avaliar regras no formato .grl . O Ruler permite que as regras definidas em arquivos .grl sejam avaliadas de maneira automática e eficiente, ajudando a automatizar as decisões tomadas pelo FeatWS. Isso possibilita que o sistema possa analisar e classificar grandes quantidades de informações de maneira rápida e precisa.\n\nAo utilizar as regras fornecidas pelo projeto Ruler, o FeatWS é capaz de realizar análises de regras em larga escala e fornecer resultados precisos e relevantes para seus usuários. Isso é especialmente importante em áreas como análise de sentimentos em mídias sociais, detecção de fraudes financeiras e análise de dados em geral.\n\nAntes de realizar os testes no Swagger, é necessário autorizar o acesso clicando no botão **Authorize**, ao lado, e inserindo a senha correspondente. Após inserir o campo **value** e clicar no botão **Authorize**, o Swagger estará disponível para ser utilizado.\n\nA seguir é explicado com mais detalhes sobre os endpoints:\n- **/Eval**: Esse endpoint é utilizado apenas para aplicações que possuem uma única folha de regra padrão.\n- **/Eval/{knowledgeBase}**: Nesse endpoint, é necessário informar o parâmetro com o nome da folha de regra desejada e, como resultado, será retornado a última versão da folha de regra correspondente.\n- **/Eval/{knowledgeBase}/{version}**: Nesse endpoint é necessário colocar o parâmetro do nome da folha de regra como também o número da versão da folha de regra que você deseja testar a regra.\n\n**Parameters / Parâmetros**\nNo **knowledgeBase**, você pode especificar o nome da folha de regras que deseja utilizar. Já o **version** você coloca a versão que você deseja avaliar. Em **Paramenter**, é possível enviar os parametros que você deseja testar na folha de regra.",
280261
InfoInstanceName: "swagger",
281262
SwaggerTemplate: docTemplate,
263+
LeftDelim: "{{",
264+
RightDelim: "}}",
282265
}
283266

284267
func init() {

0 commit comments

Comments
 (0)