From 8575cf8d819eabc843f7f81b5a3b65801ef78588 Mon Sep 17 00:00:00 2001 From: Atomys Date: Sat, 4 Jun 2022 12:45:01 +0200 Subject: [PATCH 01/23] chore: Harmonize the specs field of storages --- pkg/storage/postgres/postgres.go | 7 +++---- pkg/storage/rabbitmq/rabbitmq.go | 21 +++++++++++---------- pkg/storage/redis/redis.go | 12 ++++++------ 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/pkg/storage/postgres/postgres.go b/pkg/storage/postgres/postgres.go index 1bea955..741270a 100644 --- a/pkg/storage/postgres/postgres.go +++ b/pkg/storage/postgres/postgres.go @@ -4,7 +4,6 @@ import ( "database/sql" "fmt" - // Import postgres driver _ "github.com/lib/pq" "atomys.codes/webhooked/internal/valuable" @@ -20,9 +19,9 @@ type storage struct { // config is the struct contains config for connect client // Run is made from internal caller type config struct { - DatabaseURL valuable.Valuable - TableName string - DataField string + DatabaseURL valuable.Valuable `json:"databaseURL"` + TableName string `json:"tableName"` + DataField string `json:"dataField"` } // NewStorage is the function for create new Postgres client storage diff --git a/pkg/storage/rabbitmq/rabbitmq.go b/pkg/storage/rabbitmq/rabbitmq.go index 7dca262..0255158 100644 --- a/pkg/storage/rabbitmq/rabbitmq.go +++ b/pkg/storage/rabbitmq/rabbitmq.go @@ -4,8 +4,9 @@ import ( "bytes" "encoding/gob" - "atomys.codes/webhooked/internal/valuable" "github.com/streadway/amqp" + + "atomys.codes/webhooked/internal/valuable" ) // storage is the struct contains client and config @@ -20,15 +21,15 @@ type storage struct { // config is the struct contains config for connect client // Run is made from internal caller type config struct { - DatabaseURL valuable.Valuable - QueueName string - Durable bool - DeleteWhenUnused bool - Exclusive bool - NoWait bool - Mandatory bool - Immediate bool - Exchange string + DatabaseURL valuable.Valuable `json:"databaseURL"` + QueueName string `json:"queueName"` + Durable bool `json:"durable"` + DeleteWhenUnused bool `json:"deleteWhenUnused"` + Exclusive bool `json:"exclusive"` + NoWait bool `json:"noWait"` + Mandatory bool `json:"mandatory"` + Immediate bool `json:"immediate"` + Exchange string `json:"exchange"` } // NewStorage is the function for create new RabbitMQ client storage diff --git a/pkg/storage/redis/redis.go b/pkg/storage/redis/redis.go index df36afa..b51db90 100644 --- a/pkg/storage/redis/redis.go +++ b/pkg/storage/redis/redis.go @@ -16,12 +16,12 @@ type storage struct { } type config struct { - Host string - Port string - Database int - Username valuable.Valuable - Password valuable.Valuable - Key string + Host string `json:"host"` + Port string `json:"port"` + Database int `json:"database"` + Username valuable.Valuable `json:"username"` + Password valuable.Valuable `json:"password"` + Key string `json:"key"` } // NewStorage is the function for create new Redis storage client From 61a18bc7193557e118bd30ed4bdeaa6de707aeae Mon Sep 17 00:00:00 2001 From: Atomys Date: Sat, 4 Jun 2022 12:46:24 +0200 Subject: [PATCH 02/23] docs: Use template correctly on configuration example --- config/webhooks.example.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/webhooks.example.yml b/config/webhooks.example.yml index 65806a4..650232c 100644 --- a/config/webhooks.example.yml +++ b/config/webhooks.example.yml @@ -12,7 +12,7 @@ specs: - compare: inputs: - name: first - value: '{{ Outputs.header.value }}' + value: '{{ .Outputs.header.value }}' - name: second valueFrom: envRef: SECRET_TOKEN From 0d954e8eb12e4d55e0658bcfd303b53e77488765 Mon Sep 17 00:00:00 2001 From: Atomys Date: Sat, 4 Jun 2022 19:58:14 +0200 Subject: [PATCH 03/23] feat: Implement the last big brick of Webhooked: Formating module --- internal/config/configuration.go | 50 +++++++++++++ internal/config/configuration_test.go | 1 + internal/config/specification.go | 10 +++ internal/config/specification_test.go | 20 +++++ internal/config/structs.go | 51 ++++++++++--- internal/server/v1alpha1/handlers.go | 17 ++++- pkg/formating/format.go | 70 ++++++++++++++++++ pkg/formating/functions.go | 102 ++++++++++++++++++++++++++ tests/webhooks.tests.yml | 2 + 9 files changed, 309 insertions(+), 14 deletions(-) create mode 100644 pkg/formating/format.go create mode 100644 pkg/formating/functions.go diff --git a/internal/config/configuration.go b/internal/config/configuration.go index 8ba1a53..588e830 100644 --- a/internal/config/configuration.go +++ b/internal/config/configuration.go @@ -1,8 +1,11 @@ package config import ( + "bytes" "errors" "fmt" + "io" + "os" "github.com/rs/zerolog/log" "github.com/spf13/viper" @@ -30,6 +33,10 @@ func Load() error { return err } + if spec.Formating, err = loadTemplate(spec.Formating, nil); err != nil { + return fmt.Errorf("configured storage for %s received an error: %s", spec.Name, err.Error()) + } + if err = loadStorage(spec); err != nil { return fmt.Errorf("configured storage for %s received an error: %s", spec.Name, err.Error()) } @@ -95,12 +102,55 @@ func loadStorage(spec *WebhookSpec) (err error) { if err != nil { return fmt.Errorf("storage %s cannot be loaded properly: %s", s.Type, err.Error()) } + + if s.Formating, err = loadTemplate(s.Formating, spec.Formating); err != nil { + return fmt.Errorf("storage %s cannot be loaded properly: %s", s.Type, err.Error()) + } } log.Debug().Msgf("%d storages loaded for spec %s", len(spec.Storage), spec.Name) return } +// loadTemplate loads the template for the given `spec`. When no spec is defined +// we try to load the template from the parentSpec and fallback to the default +// template if parentSpec is not given. +func loadTemplate(spec, parentSpec *FormatingSpec) (*FormatingSpec, error) { + if spec == nil { + spec = &FormatingSpec{} + } + + if spec.TemplateString != "" { + spec.Template = spec.TemplateString + return spec, nil + } + + if spec.TemplatePath != "" { + file, err := os.OpenFile(spec.TemplatePath, os.O_RDONLY, 0666) + if err != nil { + return spec, err + } + defer file.Close() + + var buffer bytes.Buffer + _, err = io.Copy(&buffer, file) + if err != nil { + return spec, err + } + + spec.Template = buffer.String() + return spec, nil + } + + if parentSpec != nil { + spec.Template = parentSpec.Template + } else { + spec.Template = "{{ .Request.Body }}" + } + + return spec, nil +} + // Current returns the aftual configuration func Current() *Configuration { return currentConfig diff --git a/internal/config/configuration_test.go b/internal/config/configuration_test.go index a924cdf..595f0a8 100644 --- a/internal/config/configuration_test.go +++ b/internal/config/configuration_test.go @@ -201,6 +201,7 @@ func TestLoadStorage(t *testing.T) { "host": "localhost", "port": 0, }, + Formating: &FormatingSpec{TemplateString: "null"}, }, }, }, diff --git a/internal/config/specification.go b/internal/config/specification.go index 82cb48b..472b981 100644 --- a/internal/config/specification.go +++ b/internal/config/specification.go @@ -4,3 +4,13 @@ package config func (s WebhookSpec) HasSecurity() bool { return s.SecurityPipeline != nil && s.SecurityPipeline.HasFactories() } + +// HasGlobalFormating returns true if the spec has a global formating +func (s WebhookSpec) HasGlobalFormating() bool { + return s.Formating.TemplatePath != "" || s.Formating.TemplateString != "" +} + +// HasFormating returns true if the storage spec has a formating +func (s StorageSpec) HasFormating() bool { + return s.Formating != nil && (s.Formating.TemplatePath != "" || s.Formating.TemplateString != "") +} diff --git a/internal/config/specification_test.go b/internal/config/specification_test.go index 0d1f3bf..0529153 100644 --- a/internal/config/specification_test.go +++ b/internal/config/specification_test.go @@ -12,3 +12,23 @@ func TestWebhookSpec_HasSecurity(t *testing.T) { // assert.True(t, WebhookSpec{SecurityFactories: make([]*factory.Factory, 1)}.HasSecurity()) // assert.True(t, WebhookSpec{SecurityFactories: make([]*factory.Factory, 2)}.HasSecurity()) } + +func TestWebhookSpec_HasGlobalFormating(t *testing.T) { + assert.False(t, WebhookSpec{Formating: nil}.HasGlobalFormating()) + assert.False(t, WebhookSpec{Formating: &FormatingSpec{}}.HasGlobalFormating()) + assert.False(t, WebhookSpec{Formating: &FormatingSpec{TemplatePath: ""}}.HasGlobalFormating()) + assert.False(t, WebhookSpec{Formating: &FormatingSpec{TemplateString: ""}}.HasGlobalFormating()) + assert.False(t, WebhookSpec{Formating: &FormatingSpec{TemplatePath: "", TemplateString: ""}}.HasGlobalFormating()) + assert.True(t, WebhookSpec{Formating: &FormatingSpec{TemplatePath: "/_tmp/invalid_path", TemplateString: ""}}.HasGlobalFormating()) + assert.True(t, WebhookSpec{Formating: &FormatingSpec{TemplatePath: "/_tmp/invalid_path", TemplateString: "{{}}"}}.HasGlobalFormating()) +} + +func TestWebhookSpec_HasFormating(t *testing.T) { + assert.False(t, StorageSpec{Formating: nil}.HasFormating()) + assert.False(t, StorageSpec{Formating: &FormatingSpec{}}.HasFormating()) + assert.False(t, StorageSpec{Formating: &FormatingSpec{TemplatePath: ""}}.HasFormating()) + assert.False(t, StorageSpec{Formating: &FormatingSpec{TemplateString: ""}}.HasFormating()) + assert.False(t, StorageSpec{Formating: &FormatingSpec{TemplatePath: "", TemplateString: ""}}.HasFormating()) + assert.True(t, StorageSpec{Formating: &FormatingSpec{TemplatePath: "/_tmp/invalid_path", TemplateString: ""}}.HasFormating()) + assert.True(t, StorageSpec{Formating: &FormatingSpec{TemplatePath: "/_tmp/invalid_path", TemplateString: "{{}}"}}.HasFormating()) +} diff --git a/internal/config/structs.go b/internal/config/structs.go index a2c3ca8..4f7aa33 100644 --- a/internal/config/structs.go +++ b/internal/config/structs.go @@ -9,11 +9,11 @@ import ( // defined in the webhooks yaml file type Configuration struct { // APIVerion is the version of the API that will be used - APIVersion string `mapstructure:"apiVersion"` + APIVersion string `mapstructure:"apiVersion" json:"apiVersion"` // Observability is the configuration for observability - Observability Observability `mapstructure:"observability"` + Observability Observability `mapstructure:"observability" json:"observability"` // Specs is the configuration for the webhooks specs - Specs []*WebhookSpec `mapstructure:"specs"` + Specs []*WebhookSpec `mapstructure:"specs" json:"specs"` } // Observability is the struct contains the configuration for observability @@ -21,7 +21,7 @@ type Configuration struct { type Observability struct { // MetricsEnabled is the flag to enable or disable the prometheus metrics // endpoint and expose the metrics - MetricsEnabled bool `mapstructure:"metricsEnabled"` + MetricsEnabled bool `mapstructure:"metricsEnabled" json:"metricsEnabled"` } // WebhookSpec is the struct contains the configuration for a webhook spec @@ -30,22 +30,28 @@ type WebhookSpec struct { // Name is the name of the webhook spec. It must be unique in the configuration // file. It is used to identify the webhook spec in the configuration file // and is defined by the user - Name string `mapstructure:"name"` + Name string `mapstructure:"name" json:"name"` // EntrypointURL is the URL of the entrypoint of the webhook spec. It must // be unique in the configuration file. It is defined by the user // It is used to identify the webhook spec when receiving a request - EntrypointURL string `mapstructure:"entrypointUrl"` + EntrypointURL string `mapstructure:"entrypointUrl" json:"entrypointUrl"` // Security is the configuration for the security of the webhook spec // It is defined by the user and can be empty. See HasSecurity() method // to know if the webhook spec has security - Security []map[string]Security `mapstructure:"security"` + Security []map[string]Security `mapstructure:"security" json:"-"` + // Format is used to define the payload format sent by the webhook spec + // to all storages. Each storage can have its own format. When this + // configuration is empty, the default formating setting is used (body as JSON) + // It is defined by the user and can be empty. See HasGlobalFormating() method + // to know if the webhook spec has format + Formating *FormatingSpec `mapstructure:"formating" json:"-"` // SecurityPipeline is the security pipeline of the webhook spec // It is defined by the configuration loader. This field is not defined // by the user and cannot be overridden - SecurityPipeline *factory.Pipeline `mapstructure:"-"` + SecurityPipeline *factory.Pipeline `mapstructure:"-" json:"-"` // Storage is the configuration for the storage of the webhook spec // It is defined by the user and can be empty. - Storage []*StorageSpec `mapstructure:"storage"` + Storage []*StorageSpec `mapstructure:"storage" json:"-"` } // Security is the struct contains the configuration for a security @@ -70,11 +76,32 @@ type Security struct { type StorageSpec struct { // Type is the type of the storage. It must be a valid storage type // defined in the storage package. - Type string `mapstructure:"type"` + Type string `mapstructure:"type" json:"type"` // Specs is the configuration for the storage. It is defined by the user // following the storage type specification - Specs map[string]interface{} `mapstructure:"specs"` + // NOTE: this field is hidden for json to prevent mistake of the user + // when he use the custom formating option and leak credentials + Specs map[string]interface{} `mapstructure:"specs" json:"-"` + // Format is used to define the payload format sent by the webhook spec + // to this storage. If not defined, the format of the webhook spec is + // used. + // It is defined by the user and can be empty. See HasFormating() method + // to know if the webhook spec has format + Formating *FormatingSpec `mapstructure:"formating" json:"-"` // Client is the storage client. It is defined by the configuration loader // and cannot be overridden - Client storage.Pusher `mapstructure:"-"` + Client storage.Pusher `mapstructure:"-" json:"-"` +} + +// FormatingSpec is the struct contains the configuration to formating the +// payload of the webhook spec. The field TempalteString is prioritized +// over the field TemplatePath when both are defined. +type FormatingSpec struct { + // TemplatePath is the path to the template used to formating the payload + TemplatePath string `mapstructure:"templatePath"` + // TemplateString is a plaintext template used to formating the payload + TemplateString string `mapstructure:"templateString"` + // ResolvedTemplate is the template after resolving the template variables + // It is defined by the configuration loader and cannot be overridden + Template string `mapstructure:"-"` } diff --git a/internal/server/v1alpha1/handlers.go b/internal/server/v1alpha1/handlers.go index cd97544..6a87857 100644 --- a/internal/server/v1alpha1/handlers.go +++ b/internal/server/v1alpha1/handlers.go @@ -11,6 +11,7 @@ import ( "github.com/rs/zerolog/log" "atomys.codes/webhooked/internal/config" + "atomys.codes/webhooked/pkg/formating" ) // Server is the server instance for the v1alpha1 version @@ -101,9 +102,21 @@ func webhookService(s *Server, spec *config.WebhookSpec, r *http.Request) (err e } } - log.Debug().Msgf("store following data: %+v", string(data)) for _, storage := range spec.Storage { - if err := storage.Client.Push(string(data)); err != nil { + str, err := formating. + NewTemplateData(storage.Formating.Template). + WithRequest(r). + WithPayload(data). + WithSpec(spec). + WithStorage(storage). + WithConfig(). + Render() + if err != nil { + return err + } + + log.Debug().Msgf("store following data: %+v", str) + if err := storage.Client.Push(str); err != nil { return err } log.Debug().Str("storage", storage.Client.Name()).Msgf("stored successfully") diff --git a/pkg/formating/format.go b/pkg/formating/format.go new file mode 100644 index 0000000..2acabf8 --- /dev/null +++ b/pkg/formating/format.go @@ -0,0 +1,70 @@ +package formating + +import ( + "bytes" + "net/http" + "text/template" + + "github.com/rs/zerolog/log" + + "atomys.codes/webhooked/internal/config" +) + +type TemplateData struct { + tmplString string + data map[string]interface{} +} + +func NewTemplateData(tmplString string) *TemplateData { + return &TemplateData{ + tmplString: tmplString, + data: make(map[string]interface{}), + } +} + +func (d *TemplateData) WithData(name string, data interface{}) *TemplateData { + d.data[name] = data + return d +} + +func (d *TemplateData) WithRequest(r *http.Request) *TemplateData { + d.WithData("Request", r) + return d +} + +func (d *TemplateData) WithPayload(payload []byte) *TemplateData { + d.WithData("Payload", string(payload)) + return d +} + +func (d *TemplateData) WithSpec(spec *config.WebhookSpec) *TemplateData { + d.WithData("Spec", spec) + return d +} + +func (d *TemplateData) WithStorage(spec *config.StorageSpec) *TemplateData { + d.WithData("Storage", spec) + return d +} + +func (d *TemplateData) WithConfig() *TemplateData { + d.WithData("Config", config.Current()) + return d +} + +func (d *TemplateData) Render() (string, error) { + log.Debug().Msgf("rendering template: %s", d.tmplString) + + t := template.New("formatingTmpl").Funcs(funcMap()) + t, err := t.Parse(d.tmplString) + if err != nil { + return "", err + } + + buf := new(bytes.Buffer) + if err := t.Execute(buf, d.data); err != nil { + return "", err + } + + return buf.String(), nil +} diff --git a/pkg/formating/functions.go b/pkg/formating/functions.go new file mode 100644 index 0000000..7c2db18 --- /dev/null +++ b/pkg/formating/functions.go @@ -0,0 +1,102 @@ +package formating + +import ( + "encoding/json" + "net/http" + "reflect" + "text/template" + + "github.com/rs/zerolog/log" +) + +func funcMap() template.FuncMap { + return template.FuncMap{ + // Core functions + "default": dft, + "empty": empty, + "coalesce": coalesce, + "toJson": toJson, + "toPrettyJson": toPrettyJson, + "ternary": ternary, + + // Headers manipulation functions + "getHeader": getHeader, + } +} + +func dft(dft interface{}, given ...interface{}) interface{} { + + if empty(given) || empty(given[0]) { + return dft + } + return given[0] +} + +// empty returns true if the given value has the zero value for its type. +func empty(given interface{}) bool { + g := reflect.ValueOf(given) + if !g.IsValid() { + return true + } + + // Basically adapted from text/template.isTrue + switch g.Kind() { + default: + return g.IsNil() + case reflect.Array, reflect.Slice, reflect.Map, reflect.String: + return g.Len() == 0 + case reflect.Bool: + return !g.Bool() + case reflect.Complex64, reflect.Complex128: + return g.Complex() == 0 + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return g.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return g.Uint() == 0 + case reflect.Float32, reflect.Float64: + return g.Float() == 0 + case reflect.Struct: + return false + } +} + +// coalesce returns the first non-empty value. +func coalesce(v ...interface{}) interface{} { + for _, val := range v { + if !empty(val) { + return val + } + } + return nil +} + +// toJson encodes an item into a JSON string +func toJson(v interface{}) string { + output, err := json.Marshal(v) + if err != nil { + log.Error().Err(err).Msg("Failed to marshal to JSON") + } + return string(output) +} + +// toPrettyJson encodes an item into a pretty (indented) JSON string +func toPrettyJson(v interface{}) string { + output, err := json.MarshalIndent(v, "", " ") + if err != nil { + log.Error().Err(err).Msg("Failed to marshal to JSON") + } + return string(output) +} + +// ternary returns the first value if the last value is true, otherwise returns the second value. +func ternary(vt interface{}, vf interface{}, v bool) interface{} { + if v { + return vt + } + + return vf +} + +func getHeader(name string, headers *http.Header) string { + return headers.Get(name) +} diff --git a/tests/webhooks.tests.yml b/tests/webhooks.tests.yml index 2629e65..2a72da8 100644 --- a/tests/webhooks.tests.yml +++ b/tests/webhooks.tests.yml @@ -4,6 +4,8 @@ observability: specs: - name: exampleHook entrypointUrl: /webhooks/example + formating: + templateString: "{{ .Request.Body }}" security: - header: inputs: From 38b87859d43b436c84f9306608509d4b22a9c84b Mon Sep 17 00:00:00 2001 From: Atomys Date: Sat, 4 Jun 2022 20:09:31 +0200 Subject: [PATCH 04/23] fix: Prevent segfault when no global is defined --- internal/config/specification.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/config/specification.go b/internal/config/specification.go index 472b981..f805db6 100644 --- a/internal/config/specification.go +++ b/internal/config/specification.go @@ -7,7 +7,7 @@ func (s WebhookSpec) HasSecurity() bool { // HasGlobalFormating returns true if the spec has a global formating func (s WebhookSpec) HasGlobalFormating() bool { - return s.Formating.TemplatePath != "" || s.Formating.TemplateString != "" + return s.Formating != nil && (s.Formating.TemplatePath != "" || s.Formating.TemplateString != "") } // HasFormating returns true if the storage spec has a formating From 4aae1a013e49e37ab6dc43dfbe80797bb679bda6 Mon Sep 17 00:00:00 2001 From: Atomys Date: Sun, 5 Jun 2022 16:46:28 +0200 Subject: [PATCH 05/23] test: Implement test suite for formatter --- config/template.tpl | 10 ++ pkg/formating/format.go | 5 +- pkg/formating/format_test.go | 176 ++++++++++++++++++++++++++++++++ pkg/formating/functions.go | 12 ++- pkg/formating/functions_test.go | 109 ++++++++++++++++++++ 5 files changed, 306 insertions(+), 6 deletions(-) create mode 100644 config/template.tpl create mode 100644 pkg/formating/format_test.go create mode 100644 pkg/formating/functions_test.go diff --git a/config/template.tpl b/config/template.tpl new file mode 100644 index 0000000..2e26a84 --- /dev/null +++ b/config/template.tpl @@ -0,0 +1,10 @@ +{ + "config": "{{ toJson .Config }}", + "storage": {{ toJson .Storage }}, + "metadata": { + "model": "{{ .Request.Header | getHeader "X-Model" }}", + "event": "{{ .Request.Header | getHeader "X-Event" }}", + "deliveryID": "{{ .Request.Header | getHeader "X-Delivery" | default "unknown" }}" + }, + "payload": {{ .Payload }} +} \ No newline at end of file diff --git a/pkg/formating/format.go b/pkg/formating/format.go index 2acabf8..8098350 100644 --- a/pkg/formating/format.go +++ b/pkg/formating/format.go @@ -2,6 +2,7 @@ package formating import ( "bytes" + "fmt" "net/http" "text/template" @@ -58,12 +59,12 @@ func (d *TemplateData) Render() (string, error) { t := template.New("formatingTmpl").Funcs(funcMap()) t, err := t.Parse(d.tmplString) if err != nil { - return "", err + return "", fmt.Errorf("error in your template: %s", err.Error()) } buf := new(bytes.Buffer) if err := t.Execute(buf, d.data); err != nil { - return "", err + return "", fmt.Errorf("error while filling your template: %s", err.Error()) } return buf.String(), nil diff --git a/pkg/formating/format_test.go b/pkg/formating/format_test.go new file mode 100644 index 0000000..a9002cf --- /dev/null +++ b/pkg/formating/format_test.go @@ -0,0 +1,176 @@ +package formating + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" + + "atomys.codes/webhooked/internal/config" +) + +func TestNewTemplateData(t *testing.T) { + assert := assert.New(t) + + tmpl := NewTemplateData("") + assert.NotNil(tmpl) + assert.Equal("", tmpl.tmplString) + assert.Equal(0, len(tmpl.data)) + + tmpl = NewTemplateData("{{ .Payload }}") + assert.NotNil(tmpl) + assert.Equal("{{ .Payload }}", tmpl.tmplString) + assert.Equal(0, len(tmpl.data)) +} + +func Test_WithData(t *testing.T) { + assert := assert.New(t) + + tmpl := NewTemplateData("").WithData("test", true) + assert.NotNil(tmpl) + assert.Equal("", tmpl.tmplString) + assert.Equal(1, len(tmpl.data)) + assert.Equal(true, tmpl.data["test"]) +} + +func Test_WithRequest(t *testing.T) { + assert := assert.New(t) + + tmpl := NewTemplateData("").WithRequest(httptest.NewRequest("GET", "/", nil)) + assert.NotNil(tmpl) + assert.Equal("", tmpl.tmplString) + assert.Equal(1, len(tmpl.data)) + assert.Nil(tmpl.data["request"]) + assert.NotNil(tmpl.data["Request"]) + assert.Equal("GET", tmpl.data["Request"].(*http.Request).Method) +} + +func Test_WithPayload(t *testing.T) { + assert := assert.New(t) + + data, err := json.Marshal(map[string]interface{}{"test": "test"}) + assert.Nil(err) + + tmpl := NewTemplateData("").WithPayload(data) + assert.NotNil(tmpl) + assert.Equal("", tmpl.tmplString) + assert.Equal(1, len(tmpl.data)) + assert.JSONEq(`{"test":"test"}`, tmpl.data["Payload"].(string)) +} + +func Test_WithSpec(t *testing.T) { + assert := assert.New(t) + + tmpl := NewTemplateData("").WithSpec(&config.WebhookSpec{Name: "test", Formating: &config.FormatingSpec{}}) + assert.NotNil(tmpl) + assert.Equal("", tmpl.tmplString) + assert.Equal(1, len(tmpl.data)) + assert.Equal("test", tmpl.data["Spec"].(*config.WebhookSpec).Name) +} + +func Test_WithStorage(t *testing.T) { + assert := assert.New(t) + + tmpl := NewTemplateData("").WithStorage(&config.StorageSpec{Type: "testing"}) + assert.NotNil(tmpl) + assert.Equal("", tmpl.tmplString) + assert.Equal(1, len(tmpl.data)) + assert.Equal("testing", tmpl.data["Storage"].(*config.StorageSpec).Type) +} + +func Test_WithConfig(t *testing.T) { + assert := assert.New(t) + + tmpl := NewTemplateData("").WithConfig() + assert.NotNil(tmpl) + assert.Equal("", tmpl.tmplString) + assert.Equal(1, len(tmpl.data)) + assert.NotNil(tmpl.data["Config"]) +} + +func Test_Render(t *testing.T) { + assert := assert.New(t) + + // Test with basic template + tmpl := NewTemplateData("{{ .Payload }}").WithPayload([]byte(`{"test": "test"}`)) + assert.NotNil(tmpl) + assert.Equal("{{ .Payload }}", tmpl.tmplString) + assert.Equal(1, len(tmpl.data)) + assert.JSONEq(`{"test":"test"}`, tmpl.data["Payload"].(string)) + + str, err := tmpl.Render() + assert.Nil(err) + assert.JSONEq("{\"test\":\"test\"}", str) + + // Test with template with multiple data sources + // and complex template + req := httptest.NewRequest("GET", "/", nil) + req.Header.Set("X-Test", "test") + + tmpl = NewTemplateData(` + { + "config": {{ toJson .Config }}, + "spec": {{ toJson .Spec }}, + "storage": {{ toJson .Storage }}, + "metadata": { + "testID": "{{ .Request.Header | getHeader "X-Test" }}", + "deliveryID": "{{ .Request.Header | getHeader "X-Delivery" | default "unknown" }}" + }, + "payload": {{ .Payload }} + } + `). + WithPayload([]byte(`{"test": "test"}`)). + WithRequest(req). + WithSpec(&config.WebhookSpec{Name: "test", EntrypointURL: "/webhooks/test", Formating: &config.FormatingSpec{}}). + WithStorage(&config.StorageSpec{Type: "testing", Specs: map[string]interface{}{}}). + WithConfig() + assert.NotNil(tmpl) + + str, err = tmpl.Render() + assert.Nil(err) + assert.JSONEq(`{ + "config": { + "apiVersion":"", + "observability":{ + "metricsEnabled":false + }, + "specs": null + }, + "spec": { + "name":"test", + "entrypointUrl": "/webhooks/test" + }, + "storage": { + "type": "testing" + }, + "metadata": { + "testID": "test", + "deliveryID": "unknown" + }, + "payload": { + "test": "test" + } + }`, str) + + // Test with template with template error + tmpl = NewTemplateData("{{ .Payload }") + assert.NotNil(tmpl) + assert.Equal("{{ .Payload }", tmpl.tmplString) + + str, err = tmpl.Render() + assert.Error(err) + assert.Contains(err.Error(), "error in your template: ") + assert.Equal("", str) + + // Test with template with data error + tmpl = NewTemplateData("{{ .Request.Method }}").WithRequest(nil) + assert.NotNil(tmpl) + assert.Equal("{{ .Request.Method }}", tmpl.tmplString) + + str, err = tmpl.Render() + assert.Error(err) + assert.Contains(err.Error(), "error while filling your template: ") + assert.Equal("", str) +} diff --git a/pkg/formating/functions.go b/pkg/formating/functions.go index 7c2db18..01db707 100644 --- a/pkg/formating/functions.go +++ b/pkg/formating/functions.go @@ -89,14 +89,18 @@ func toPrettyJson(v interface{}) string { } // ternary returns the first value if the last value is true, otherwise returns the second value. -func ternary(vt interface{}, vf interface{}, v bool) interface{} { - if v { - return vt +func ternary(isTrue interface{}, isFalse interface{}, confition bool) interface{} { + if confition { + return isTrue } - return vf + return isFalse } func getHeader(name string, headers *http.Header) string { + if headers == nil { + log.Error().Msg("headers are nil. Returning empty string") + return "" + } return headers.Get(name) } diff --git a/pkg/formating/functions_test.go b/pkg/formating/functions_test.go new file mode 100644 index 0000000..27d64b6 --- /dev/null +++ b/pkg/formating/functions_test.go @@ -0,0 +1,109 @@ +package formating + +import ( + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_funcMap(t *testing.T) { + assert := assert.New(t) + + funcMap := funcMap() + assert.Contains(funcMap, "default") + assert.NotContains(funcMap, "dft") + assert.Contains(funcMap, "empty") + assert.Contains(funcMap, "coalesce") + assert.Contains(funcMap, "toJson") + assert.Contains(funcMap, "toPrettyJson") + assert.Contains(funcMap, "ternary") + assert.Contains(funcMap, "getHeader") +} + +func Test_dft(t *testing.T) { + assert := assert.New(t) + + assert.Equal("test", dft("default", "test")) + assert.Equal("default", dft("default", nil)) + assert.Equal("default", dft("default", "")) +} + +func Test_empty(t *testing.T) { + assert := assert.New(t) + + assert.True(empty("")) + assert.True(empty(nil)) + assert.False(empty("test")) + assert.False(empty(true)) + assert.True(empty(false)) + assert.True(empty(0 + 0i)) + assert.False(empty(2 + 4i)) + assert.True(empty([]int{})) + assert.False(empty([]int{1})) + assert.True(empty(map[string]string{})) + assert.False(empty(map[string]string{"test": "test"})) + assert.True(empty(map[string]interface{}{})) + assert.False(empty(map[string]interface{}{"test": "test"})) + assert.True(empty(0)) + assert.False(empty(-1)) + assert.False(empty(1)) + assert.True(empty(uint32(0))) + assert.False(empty(uint32(1))) + assert.True(empty(float64(0.0))) + assert.False(empty(float64(1.0))) + assert.False(empty(struct{}{})) + assert.False(empty(struct{ Test string }{Test: "test"})) + + ptr := &struct{ Test string }{Test: "test"} + assert.False(empty(ptr)) +} + +func Test_coalesce(t *testing.T) { + assert := assert.New(t) + + assert.Equal("test", coalesce("test", "default")) + assert.Equal("default", coalesce("", "default")) + assert.Equal("default", coalesce(nil, "default")) + assert.Equal(nil, coalesce(nil, nil)) +} + +func Test_toJson(t *testing.T) { + assert := assert.New(t) + + assert.Equal("{\"test\":\"test\"}", toJson(map[string]string{"test": "test"})) + assert.Equal("{\"test\":\"test\"}", toJson(map[string]interface{}{"test": "test"})) + assert.Equal("null", toJson(nil)) + assert.Equal("", toJson(map[string]interface{}{"test": func() {}})) +} + +func Test_toPrettyJson(t *testing.T) { + assert := assert.New(t) + + assert.Equal("{\n \"test\": \"test\"\n}", toPrettyJson(map[string]string{"test": "test"})) + assert.Equal("{\n \"test\": \"test\"\n}", toPrettyJson(map[string]interface{}{"test": "test"})) + assert.Equal("null", toPrettyJson(nil)) + assert.Equal("", toPrettyJson(map[string]interface{}{"test": func() {}})) +} + +func Test_ternary(t *testing.T) { + assert := assert.New(t) + + header := httptest.NewRecorder().Header() + + header.Set("X-Test", "test") + assert.Equal("test", getHeader("X-Test", &header)) + assert.Equal("", getHeader("X-Undefined", &header)) + assert.Equal("", getHeader("", &header)) + assert.Equal("", getHeader("", nil)) +} + +func Test_getHeader(t *testing.T) { + assert := assert.New(t) + + assert.Equal(true, ternary(true, false, true)) + assert.Equal(false, ternary(true, false, false)) + assert.Equal("true string", ternary("true string", "false string", true)) + assert.Equal("false string", ternary("true string", "false string", false)) + assert.Equal(nil, ternary(nil, nil, false)) +} From d91ce516ff42900984c2828039fd125429045ec1 Mon Sep 17 00:00:00 2001 From: Atomys Date: Sun, 5 Jun 2022 16:47:12 +0200 Subject: [PATCH 06/23] chore(github/actions): Add golang 1.18 to test suite --- .github/workflows/tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 66a52d0..7d8c565 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -16,7 +16,7 @@ jobs: strategy: fail-fast: true matrix: - goVersion: [ '1.16', '1.17' ] + goVersion: [ '1.16', '1.17', '1.18' ] steps: - name: Checkout project uses: actions/checkout@v3 From 19ef550cb2eadf65e01225f12c50ac4257255476 Mon Sep 17 00:00:00 2001 From: Atomys Date: Sun, 5 Jun 2022 16:48:17 +0200 Subject: [PATCH 07/23] clean: Remove template file from source code and move it to documentation --- config/template.tpl | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 config/template.tpl diff --git a/config/template.tpl b/config/template.tpl deleted file mode 100644 index 2e26a84..0000000 --- a/config/template.tpl +++ /dev/null @@ -1,10 +0,0 @@ -{ - "config": "{{ toJson .Config }}", - "storage": {{ toJson .Storage }}, - "metadata": { - "model": "{{ .Request.Header | getHeader "X-Model" }}", - "event": "{{ .Request.Header | getHeader "X-Event" }}", - "deliveryID": "{{ .Request.Header | getHeader "X-Delivery" | default "unknown" }}" - }, - "payload": {{ .Payload }} -} \ No newline at end of file From 73b791bd4bff6beeeb96557af39df8b551b93f66 Mon Sep 17 00:00:00 2001 From: Atomys Date: Sun, 5 Jun 2022 16:51:10 +0200 Subject: [PATCH 08/23] chore: Use same naming for all url fields --- pkg/storage/postgres/postgres.go | 2 +- pkg/storage/postgres/postgres_test.go | 8 ++++---- pkg/storage/rabbitmq/rabbitmq.go | 2 +- pkg/storage/rabbitmq/rabbitmq_test.go | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pkg/storage/postgres/postgres.go b/pkg/storage/postgres/postgres.go index 741270a..f134209 100644 --- a/pkg/storage/postgres/postgres.go +++ b/pkg/storage/postgres/postgres.go @@ -19,7 +19,7 @@ type storage struct { // config is the struct contains config for connect client // Run is made from internal caller type config struct { - DatabaseURL valuable.Valuable `json:"databaseURL"` + DatabaseURL valuable.Valuable `json:"databaseUrl"` TableName string `json:"tableName"` DataField string `json:"dataField"` } diff --git a/pkg/storage/postgres/postgres_test.go b/pkg/storage/postgres/postgres_test.go index b6269ee..a8ec62d 100644 --- a/pkg/storage/postgres/postgres_test.go +++ b/pkg/storage/postgres/postgres_test.go @@ -38,12 +38,12 @@ func (suite *PostgresSetupTestSuite) TestPostgresName() { func (suite *PostgresSetupTestSuite) TestPostgresNewStorage() { _, err := NewStorage(map[string]interface{}{ - "databaseURL": []int{1}, + "databaseUrl": []int{1}, }) assert.Error(suite.T(), err) _, err = NewStorage(map[string]interface{}{ - "databaseURL": "postgresql://webhook:test@127.0.0.1:5432/webhook_db?sslmode=disable", + "databaseUrl": "postgresql://webhook:test@127.0.0.1:5432/webhook_db?sslmode=disable", "tableName": "test", "dataField": "test_field", }) @@ -52,7 +52,7 @@ func (suite *PostgresSetupTestSuite) TestPostgresNewStorage() { func (suite *PostgresSetupTestSuite) TestPostgresPush() { newClient, _ := NewStorage(map[string]interface{}{ - "databaseURL": "postgresql://webhook:test@127.0.0.1:5432/webhook_db?sslmode=disable", + "databaseUrl": "postgresql://webhook:test@127.0.0.1:5432/webhook_db?sslmode=disable", "tableName": "Not Exist", "dataField": "Not exist", }) @@ -60,7 +60,7 @@ func (suite *PostgresSetupTestSuite) TestPostgresPush() { assert.Error(suite.T(), err) newClient, err = NewStorage(map[string]interface{}{ - "databaseURL": "postgresql://webhook:test@127.0.0.1:5432/webhook_db?sslmode=disable", + "databaseUrl": "postgresql://webhook:test@127.0.0.1:5432/webhook_db?sslmode=disable", "tableName": "test", "dataField": "test_field", }) diff --git a/pkg/storage/rabbitmq/rabbitmq.go b/pkg/storage/rabbitmq/rabbitmq.go index 0255158..0d6de4e 100644 --- a/pkg/storage/rabbitmq/rabbitmq.go +++ b/pkg/storage/rabbitmq/rabbitmq.go @@ -21,7 +21,7 @@ type storage struct { // config is the struct contains config for connect client // Run is made from internal caller type config struct { - DatabaseURL valuable.Valuable `json:"databaseURL"` + DatabaseURL valuable.Valuable `json:"databaseUrl"` QueueName string `json:"queueName"` Durable bool `json:"durable"` DeleteWhenUnused bool `json:"deleteWhenUnused"` diff --git a/pkg/storage/rabbitmq/rabbitmq_test.go b/pkg/storage/rabbitmq/rabbitmq_test.go index 878232e..ccc21c0 100644 --- a/pkg/storage/rabbitmq/rabbitmq_test.go +++ b/pkg/storage/rabbitmq/rabbitmq_test.go @@ -18,12 +18,12 @@ func (suite *RabbitMQSetupTestSuite) TestRabbitMQName() { func (suite *RabbitMQSetupTestSuite) TestRabbitMQNewStorage() { _, err := NewStorage(map[string]interface{}{ - "databaseURL": []int{1}, + "databaseUrl": []int{1}, }) assert.Error(suite.T(), err) _, err = NewStorage(map[string]interface{}{ - "databaseURL": "amqp://user:password@127.0.0.1:5672", + "databaseUrl": "amqp://user:password@127.0.0.1:5672", "queueName": "hello", "durable": false, "deleteWhenUnused": false, @@ -37,7 +37,7 @@ func (suite *RabbitMQSetupTestSuite) TestRabbitMQNewStorage() { func (suite *RabbitMQSetupTestSuite) TestRabbitMQPush() { newClient, _ := NewStorage(map[string]interface{}{ - "databaseURL": "amqp://user:password@127.0.0.1:5672", + "databaseUrl": "amqp://user:password@127.0.0.1:5672", "queueName": "hello", "durable": false, "deleteWhenUnused": false, @@ -50,7 +50,7 @@ func (suite *RabbitMQSetupTestSuite) TestRabbitMQPush() { assert.Error(suite.T(), err) newClient, err = NewStorage(map[string]interface{}{ - "databaseURL": "amqp://user:password@127.0.0.1:5672", + "databaseUrl": "amqp://user:password@127.0.0.1:5672", "queueName": "hello", "durable": false, "deleteWhenUnused": false, From 55b3070fdacd8e75986fa187b9e06b3e3f7ff5c8 Mon Sep 17 00:00:00 2001 From: Atomys Date: Sun, 5 Jun 2022 16:51:59 +0200 Subject: [PATCH 09/23] test: Update test file to follow the new Payload variable --- tests/webhooks.tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/webhooks.tests.yml b/tests/webhooks.tests.yml index 2a72da8..7f021a1 100644 --- a/tests/webhooks.tests.yml +++ b/tests/webhooks.tests.yml @@ -5,7 +5,7 @@ specs: - name: exampleHook entrypointUrl: /webhooks/example formating: - templateString: "{{ .Request.Body }}" + templateString: "{{ .Payload }}" security: - header: inputs: From 7e2bb0b65f85f3803eb40c15b5521ce811e6be6a Mon Sep 17 00:00:00 2001 From: Atomys Date: Sun, 5 Jun 2022 16:52:48 +0200 Subject: [PATCH 10/23] fix: Use Payload instead of RequestBody --- internal/config/configuration.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/config/configuration.go b/internal/config/configuration.go index 588e830..70c405a 100644 --- a/internal/config/configuration.go +++ b/internal/config/configuration.go @@ -145,7 +145,7 @@ func loadTemplate(spec, parentSpec *FormatingSpec) (*FormatingSpec, error) { if parentSpec != nil { spec.Template = parentSpec.Template } else { - spec.Template = "{{ .Request.Body }}" + spec.Template = "{{ .Payload }}" } return spec, nil From 40f97b4cac140a2b55cc977cb6b03fa99b0ac10a Mon Sep 17 00:00:00 2001 From: Atomys Date: Sun, 5 Jun 2022 17:12:22 +0200 Subject: [PATCH 11/23] test: Add tests for configuration loader --- internal/config/configuration.go | 12 +++- internal/config/configuration_test.go | 96 ++++++++++++++++++++++++--- tests/simple_template.tpl | 1 + tests/template.tpl | 10 +++ 4 files changed, 107 insertions(+), 12 deletions(-) create mode 100644 tests/simple_template.tpl create mode 100644 tests/template.tpl diff --git a/internal/config/configuration.go b/internal/config/configuration.go index 70c405a..c847b6e 100644 --- a/internal/config/configuration.go +++ b/internal/config/configuration.go @@ -18,6 +18,9 @@ var ( currentConfig = &Configuration{} // ErrSpecNotFound is returned when the spec is not found ErrSpecNotFound = errors.New("spec not found") + // defaultTemplate is the default template for the payload + // when no template is defined + defaultTemplate = `{{ .Payload }}` ) // Load loads the configuration from the viper configuration file @@ -143,9 +146,16 @@ func loadTemplate(spec, parentSpec *FormatingSpec) (*FormatingSpec, error) { } if parentSpec != nil { + if parentSpec.Template == "" { + var err error + parentSpec, err = loadTemplate(parentSpec, nil) + if err != nil { + return spec, err + } + } spec.Template = parentSpec.Template } else { - spec.Template = "{{ .Payload }}" + spec.Template = defaultTemplate } return spec, nil diff --git a/internal/config/configuration_test.go b/internal/config/configuration_test.go index 595f0a8..d01b4e8 100644 --- a/internal/config/configuration_test.go +++ b/internal/config/configuration_test.go @@ -170,11 +170,11 @@ func TestLoadSecurityFactory(t *testing.T) { for _, test := range tests { err := loadSecurityFactory(test.input) if test.wantErr { - assert.Error(err) + assert.Error(err, test.name) } else { - assert.NoError(err) + assert.NoError(err, test.name) } - assert.Equal(test.input.SecurityPipeline.FactoryCount(), test.wantLen) + assert.Equal(test.input.SecurityPipeline.FactoryCount(), test.wantLen, test.name) } } @@ -183,15 +183,13 @@ func TestLoadStorage(t *testing.T) { tests := []struct { name string - storageName string input *WebhookSpec wantErr bool wantStorage bool }{ - {"no spec", "", &WebhookSpec{Name: "test"}, false, false}, + {"no spec", &WebhookSpec{Name: "test"}, false, false}, { "full valid storage", - "connection invalid must return an error", &WebhookSpec{ Name: "test", Storage: []*StorageSpec{ @@ -210,7 +208,6 @@ func TestLoadStorage(t *testing.T) { }, { "empty storage configuration", - "", &WebhookSpec{ Name: "test", Storage: []*StorageSpec{}, @@ -220,7 +217,6 @@ func TestLoadStorage(t *testing.T) { }, { "invalid storage name in configuration", - "", &WebhookSpec{ Name: "test", Storage: []*StorageSpec{ @@ -235,14 +231,92 @@ func TestLoadStorage(t *testing.T) { for _, test := range tests { err := loadStorage(test.input) if test.wantErr { - assert.Error(err) + assert.Error(err, test.name) } else { - assert.NoError(err) + assert.NoError(err, test.name) } if test.wantStorage && assert.Len(test.input.Storage, 1, "no storage is loaded for test %s", test.name) { s := test.input.Storage[0] - assert.NotNil(s) + assert.NotNil(s, test.name) + } + } +} + +func Test_loadTemplate(t *testing.T) { + tests := []struct { + name string + input *FormatingSpec + parentSpec *FormatingSpec + wantErr bool + wantTemplate string + }{ + { + "no template", + nil, + nil, + false, + defaultTemplate, + }, + { + "template string", + &FormatingSpec{TemplateString: "{{ .Request.Method }}"}, + nil, + false, + "{{ .Request.Method }}", + }, + { + "template file", + &FormatingSpec{TemplatePath: "../../tests/simple_template.tpl"}, + nil, + false, + "{{ .Request.Method }}", + }, + { + "template file with template string", + &FormatingSpec{TemplatePath: "../../tests/simple_template.tpl", TemplateString: "{{ .Request.Path }}"}, + nil, + false, + "{{ .Request.Path }}", + }, + { + "no template with not loaded parent", + nil, + &FormatingSpec{TemplateString: "{{ .Request.Method }}"}, + false, + "{{ .Request.Method }}", + }, + { + "no template with loaded parent", + nil, + &FormatingSpec{Template: "{{ .Request.Method }}", TemplateString: "{{ .Request.Path }}"}, + false, + "{{ .Request.Method }}", + }, + { + "no template with unloaded parent and error", + nil, + &FormatingSpec{TemplatePath: "//invalid//path//"}, + true, + "", + }, + { + "template file not found", + &FormatingSpec{TemplatePath: "//invalid//path//"}, + nil, + true, + "", + }, + } + + for _, test := range tests { + tmpl, err := loadTemplate(test.input, test.parentSpec) + if test.wantErr { + assert.Error(t, err, test.name) + } else { + assert.NoError(t, err, test.name) } + assert.NotNil(t, tmpl, test.name) + assert.Equal(t, test.wantTemplate, tmpl.Template, test.name) } } diff --git a/tests/simple_template.tpl b/tests/simple_template.tpl new file mode 100644 index 0000000..c2347a6 --- /dev/null +++ b/tests/simple_template.tpl @@ -0,0 +1 @@ +{{ .Request.Method }} \ No newline at end of file diff --git a/tests/template.tpl b/tests/template.tpl new file mode 100644 index 0000000..2e26a84 --- /dev/null +++ b/tests/template.tpl @@ -0,0 +1,10 @@ +{ + "config": "{{ toJson .Config }}", + "storage": {{ toJson .Storage }}, + "metadata": { + "model": "{{ .Request.Header | getHeader "X-Model" }}", + "event": "{{ .Request.Header | getHeader "X-Event" }}", + "deliveryID": "{{ .Request.Header | getHeader "X-Delivery" | default "unknown" }}" + }, + "payload": {{ .Payload }} +} \ No newline at end of file From eaff86874a586c75101b3061a8d40f7df6150283 Mon Sep 17 00:00:00 2001 From: Atomys Date: Sun, 5 Jun 2022 17:26:58 +0200 Subject: [PATCH 12/23] chore: Fix misspell --- internal/valuable/valuable.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/valuable/valuable.go b/internal/valuable/valuable.go index 4f3854f..75a5bb4 100644 --- a/internal/valuable/valuable.go +++ b/internal/valuable/valuable.go @@ -40,7 +40,7 @@ type ValueFromSource struct { func (v *Valuable) Validate() error { if v.ValueFrom != nil && v.ValueFrom.EnvRef != nil { if _, ok := os.LookupEnv(*v.ValueFrom.EnvRef); !ok { - return fmt.Errorf("enviroment variable %s not found", *v.ValueFrom.EnvRef) + return fmt.Errorf("environment variable %s not found", *v.ValueFrom.EnvRef) } } From cad3ba50890efd773a8e8e8df8cb6fa9f3d71a1e Mon Sep 17 00:00:00 2001 From: Atomys Date: Sun, 5 Jun 2022 17:27:16 +0200 Subject: [PATCH 13/23] chore(githun/actions): Add Codecov to pipeline --- .github/workflows/tests.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 7d8c565..46f7d6d 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -66,6 +66,7 @@ jobs: echo "Failed" exit 1 fi + - uses: codecov/codecov-action@v2 - name: Run Go Build run: | go build -o /tmp/applications-test-units \ No newline at end of file From fa268e2c24d75e5f9ae736ba7835d38a44d6ad69 Mon Sep 17 00:00:00 2001 From: Atomys Date: Sun, 5 Jun 2022 17:32:17 +0200 Subject: [PATCH 14/23] docs: Add coverage badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index cf4d409..71c9c4b 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@

Release 🎉 + GitHub release (latest by date) GitHub contributors GitHub Repo stars From ec9b43617f59995e8d9cd5fa7b1f0f57411ef038 Mon Sep 17 00:00:00 2001 From: Gregory DALMAR Date: Sun, 5 Jun 2022 23:59:15 +0200 Subject: [PATCH 15/23] docs: Add badges --- README.md | 3 ++- go.mod | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 71c9c4b..5e1dc63 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@

Release 🎉 - +Code Climate maintainability +Codecov GitHub release (latest by date) GitHub contributors GitHub Repo stars diff --git a/go.mod b/go.mod index a74dd7d..9169610 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module atomys.codes/webhooked -go 1.17 +go 1.18 require ( github.com/go-redis/redis/v8 v8.11.5 From fcd112c09b1722692784d18738b37a3aa84dcb09 Mon Sep 17 00:00:00 2001 From: Gregory DALMAR Date: Mon, 6 Jun 2022 01:00:37 +0200 Subject: [PATCH 16/23] docs: Update pictures on README.md --- .github/profile/roadmap.png | Bin 29038 -> 60998 bytes .github/profile/webhooked.png | Bin 35638 -> 91882 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/.github/profile/roadmap.png b/.github/profile/roadmap.png index 78ba0cc8babc515d4db1b01905e39022321be044..9754fbae92ee389e1d15e98d846b1c81e0791830 100644 GIT binary patch literal 60998 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≻(ZR@xm~N;YblXg~D-z@nx-O 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 diff --git a/.github/profile/webhooked.png b/.github/profile/webhooked.png index e31c3f6913dc0f35c6322c278026aa6d2e57cf06..8f7889854bec78d125c400c120dc5b25d08081e0 100644 GIT binary patch literal 91882 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

3j}r>~h%b&E2mPm6>a;l1lho@0RWu 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�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 literal 35638 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 From 4c1a66d734202fbed79981edcf7b9f6f0d8fba6f Mon Sep 17 00:00:00 2001 From: Gregory DALMAR Date: Mon, 6 Jun 2022 01:05:43 +0200 Subject: [PATCH 17/23] chore: Fix misspelling about formatting --- internal/config/configuration.go | 8 +++---- internal/config/configuration_test.go | 20 ++++++++--------- internal/config/specification.go | 12 +++++----- internal/config/specification_test.go | 32 +++++++++++++-------------- internal/config/structs.go | 20 ++++++++--------- internal/server/v1alpha1/handlers.go | 6 ++--- pkg/formating/format.go | 4 ++-- pkg/formating/format_test.go | 6 ++--- pkg/formating/functions.go | 2 +- pkg/formating/functions_test.go | 2 +- tests/webhooks.tests.yml | 2 +- 11 files changed, 57 insertions(+), 57 deletions(-) diff --git a/internal/config/configuration.go b/internal/config/configuration.go index c847b6e..eafb2f0 100644 --- a/internal/config/configuration.go +++ b/internal/config/configuration.go @@ -36,7 +36,7 @@ func Load() error { return err } - if spec.Formating, err = loadTemplate(spec.Formating, nil); err != nil { + if spec.Formatting, err = loadTemplate(spec.Formatting, nil); err != nil { return fmt.Errorf("configured storage for %s received an error: %s", spec.Name, err.Error()) } @@ -106,7 +106,7 @@ func loadStorage(spec *WebhookSpec) (err error) { return fmt.Errorf("storage %s cannot be loaded properly: %s", s.Type, err.Error()) } - if s.Formating, err = loadTemplate(s.Formating, spec.Formating); err != nil { + if s.Formatting, err = loadTemplate(s.Formatting, spec.Formatting); err != nil { return fmt.Errorf("storage %s cannot be loaded properly: %s", s.Type, err.Error()) } } @@ -118,9 +118,9 @@ func loadStorage(spec *WebhookSpec) (err error) { // loadTemplate loads the template for the given `spec`. When no spec is defined // we try to load the template from the parentSpec and fallback to the default // template if parentSpec is not given. -func loadTemplate(spec, parentSpec *FormatingSpec) (*FormatingSpec, error) { +func loadTemplate(spec, parentSpec *FormattingSpec) (*FormattingSpec, error) { if spec == nil { - spec = &FormatingSpec{} + spec = &FormattingSpec{} } if spec.TemplateString != "" { diff --git a/internal/config/configuration_test.go b/internal/config/configuration_test.go index d01b4e8..07a1f1f 100644 --- a/internal/config/configuration_test.go +++ b/internal/config/configuration_test.go @@ -199,7 +199,7 @@ func TestLoadStorage(t *testing.T) { "host": "localhost", "port": 0, }, - Formating: &FormatingSpec{TemplateString: "null"}, + Formatting: &FormattingSpec{TemplateString: "null"}, }, }, }, @@ -246,8 +246,8 @@ func TestLoadStorage(t *testing.T) { func Test_loadTemplate(t *testing.T) { tests := []struct { name string - input *FormatingSpec - parentSpec *FormatingSpec + input *FormattingSpec + parentSpec *FormattingSpec wantErr bool wantTemplate string }{ @@ -260,21 +260,21 @@ func Test_loadTemplate(t *testing.T) { }, { "template string", - &FormatingSpec{TemplateString: "{{ .Request.Method }}"}, + &FormattingSpec{TemplateString: "{{ .Request.Method }}"}, nil, false, "{{ .Request.Method }}", }, { "template file", - &FormatingSpec{TemplatePath: "../../tests/simple_template.tpl"}, + &FormattingSpec{TemplatePath: "../../tests/simple_template.tpl"}, nil, false, "{{ .Request.Method }}", }, { "template file with template string", - &FormatingSpec{TemplatePath: "../../tests/simple_template.tpl", TemplateString: "{{ .Request.Path }}"}, + &FormattingSpec{TemplatePath: "../../tests/simple_template.tpl", TemplateString: "{{ .Request.Path }}"}, nil, false, "{{ .Request.Path }}", @@ -282,27 +282,27 @@ func Test_loadTemplate(t *testing.T) { { "no template with not loaded parent", nil, - &FormatingSpec{TemplateString: "{{ .Request.Method }}"}, + &FormattingSpec{TemplateString: "{{ .Request.Method }}"}, false, "{{ .Request.Method }}", }, { "no template with loaded parent", nil, - &FormatingSpec{Template: "{{ .Request.Method }}", TemplateString: "{{ .Request.Path }}"}, + &FormattingSpec{Template: "{{ .Request.Method }}", TemplateString: "{{ .Request.Path }}"}, false, "{{ .Request.Method }}", }, { "no template with unloaded parent and error", nil, - &FormatingSpec{TemplatePath: "//invalid//path//"}, + &FormattingSpec{TemplatePath: "//invalid//path//"}, true, "", }, { "template file not found", - &FormatingSpec{TemplatePath: "//invalid//path//"}, + &FormattingSpec{TemplatePath: "//invalid//path//"}, nil, true, "", diff --git a/internal/config/specification.go b/internal/config/specification.go index f805db6..75990bf 100644 --- a/internal/config/specification.go +++ b/internal/config/specification.go @@ -5,12 +5,12 @@ func (s WebhookSpec) HasSecurity() bool { return s.SecurityPipeline != nil && s.SecurityPipeline.HasFactories() } -// HasGlobalFormating returns true if the spec has a global formating -func (s WebhookSpec) HasGlobalFormating() bool { - return s.Formating != nil && (s.Formating.TemplatePath != "" || s.Formating.TemplateString != "") +// HasGlobalFormatting returns true if the spec has a global formatting +func (s WebhookSpec) HasGlobalFormatting() bool { + return s.Formatting != nil && (s.Formatting.TemplatePath != "" || s.Formatting.TemplateString != "") } -// HasFormating returns true if the storage spec has a formating -func (s StorageSpec) HasFormating() bool { - return s.Formating != nil && (s.Formating.TemplatePath != "" || s.Formating.TemplateString != "") +// HasFormatting returns true if the storage spec has a formatting +func (s StorageSpec) HasFormatting() bool { + return s.Formatting != nil && (s.Formatting.TemplatePath != "" || s.Formatting.TemplateString != "") } diff --git a/internal/config/specification_test.go b/internal/config/specification_test.go index 0529153..2690ef1 100644 --- a/internal/config/specification_test.go +++ b/internal/config/specification_test.go @@ -13,22 +13,22 @@ func TestWebhookSpec_HasSecurity(t *testing.T) { // assert.True(t, WebhookSpec{SecurityFactories: make([]*factory.Factory, 2)}.HasSecurity()) } -func TestWebhookSpec_HasGlobalFormating(t *testing.T) { - assert.False(t, WebhookSpec{Formating: nil}.HasGlobalFormating()) - assert.False(t, WebhookSpec{Formating: &FormatingSpec{}}.HasGlobalFormating()) - assert.False(t, WebhookSpec{Formating: &FormatingSpec{TemplatePath: ""}}.HasGlobalFormating()) - assert.False(t, WebhookSpec{Formating: &FormatingSpec{TemplateString: ""}}.HasGlobalFormating()) - assert.False(t, WebhookSpec{Formating: &FormatingSpec{TemplatePath: "", TemplateString: ""}}.HasGlobalFormating()) - assert.True(t, WebhookSpec{Formating: &FormatingSpec{TemplatePath: "/_tmp/invalid_path", TemplateString: ""}}.HasGlobalFormating()) - assert.True(t, WebhookSpec{Formating: &FormatingSpec{TemplatePath: "/_tmp/invalid_path", TemplateString: "{{}}"}}.HasGlobalFormating()) +func TestWebhookSpec_HasGlobalFormatting(t *testing.T) { + assert.False(t, WebhookSpec{Formatting: nil}.HasGlobalFormatting()) + assert.False(t, WebhookSpec{Formatting: &FormattingSpec{}}.HasGlobalFormatting()) + assert.False(t, WebhookSpec{Formatting: &FormattingSpec{TemplatePath: ""}}.HasGlobalFormatting()) + assert.False(t, WebhookSpec{Formatting: &FormattingSpec{TemplateString: ""}}.HasGlobalFormatting()) + assert.False(t, WebhookSpec{Formatting: &FormattingSpec{TemplatePath: "", TemplateString: ""}}.HasGlobalFormatting()) + assert.True(t, WebhookSpec{Formatting: &FormattingSpec{TemplatePath: "/_tmp/invalid_path", TemplateString: ""}}.HasGlobalFormatting()) + assert.True(t, WebhookSpec{Formatting: &FormattingSpec{TemplatePath: "/_tmp/invalid_path", TemplateString: "{{}}"}}.HasGlobalFormatting()) } -func TestWebhookSpec_HasFormating(t *testing.T) { - assert.False(t, StorageSpec{Formating: nil}.HasFormating()) - assert.False(t, StorageSpec{Formating: &FormatingSpec{}}.HasFormating()) - assert.False(t, StorageSpec{Formating: &FormatingSpec{TemplatePath: ""}}.HasFormating()) - assert.False(t, StorageSpec{Formating: &FormatingSpec{TemplateString: ""}}.HasFormating()) - assert.False(t, StorageSpec{Formating: &FormatingSpec{TemplatePath: "", TemplateString: ""}}.HasFormating()) - assert.True(t, StorageSpec{Formating: &FormatingSpec{TemplatePath: "/_tmp/invalid_path", TemplateString: ""}}.HasFormating()) - assert.True(t, StorageSpec{Formating: &FormatingSpec{TemplatePath: "/_tmp/invalid_path", TemplateString: "{{}}"}}.HasFormating()) +func TestWebhookSpec_HasFormatting(t *testing.T) { + assert.False(t, StorageSpec{Formatting: nil}.HasFormatting()) + assert.False(t, StorageSpec{Formatting: &FormattingSpec{}}.HasFormatting()) + assert.False(t, StorageSpec{Formatting: &FormattingSpec{TemplatePath: ""}}.HasFormatting()) + assert.False(t, StorageSpec{Formatting: &FormattingSpec{TemplateString: ""}}.HasFormatting()) + assert.False(t, StorageSpec{Formatting: &FormattingSpec{TemplatePath: "", TemplateString: ""}}.HasFormatting()) + assert.True(t, StorageSpec{Formatting: &FormattingSpec{TemplatePath: "/_tmp/invalid_path", TemplateString: ""}}.HasFormatting()) + assert.True(t, StorageSpec{Formatting: &FormattingSpec{TemplatePath: "/_tmp/invalid_path", TemplateString: "{{}}"}}.HasFormatting()) } diff --git a/internal/config/structs.go b/internal/config/structs.go index 4f7aa33..369d041 100644 --- a/internal/config/structs.go +++ b/internal/config/structs.go @@ -41,10 +41,10 @@ type WebhookSpec struct { Security []map[string]Security `mapstructure:"security" json:"-"` // Format is used to define the payload format sent by the webhook spec // to all storages. Each storage can have its own format. When this - // configuration is empty, the default formating setting is used (body as JSON) - // It is defined by the user and can be empty. See HasGlobalFormating() method + // configuration is empty, the default formatting setting is used (body as JSON) + // It is defined by the user and can be empty. See HasGlobalFormatting() method // to know if the webhook spec has format - Formating *FormatingSpec `mapstructure:"formating" json:"-"` + Formatting *FormattingSpec `mapstructure:"formatting" json:"-"` // SecurityPipeline is the security pipeline of the webhook spec // It is defined by the configuration loader. This field is not defined // by the user and cannot be overridden @@ -80,26 +80,26 @@ type StorageSpec struct { // Specs is the configuration for the storage. It is defined by the user // following the storage type specification // NOTE: this field is hidden for json to prevent mistake of the user - // when he use the custom formating option and leak credentials + // when he use the custom formatting option and leak credentials Specs map[string]interface{} `mapstructure:"specs" json:"-"` // Format is used to define the payload format sent by the webhook spec // to this storage. If not defined, the format of the webhook spec is // used. - // It is defined by the user and can be empty. See HasFormating() method + // It is defined by the user and can be empty. See HasFormatting() method // to know if the webhook spec has format - Formating *FormatingSpec `mapstructure:"formating" json:"-"` + Formatting *FormattingSpec `mapstructure:"formatting" json:"-"` // Client is the storage client. It is defined by the configuration loader // and cannot be overridden Client storage.Pusher `mapstructure:"-" json:"-"` } -// FormatingSpec is the struct contains the configuration to formating the +// FormattingSpec is the struct contains the configuration to formatting the // payload of the webhook spec. The field TempalteString is prioritized // over the field TemplatePath when both are defined. -type FormatingSpec struct { - // TemplatePath is the path to the template used to formating the payload +type FormattingSpec struct { + // TemplatePath is the path to the template used to formatting the payload TemplatePath string `mapstructure:"templatePath"` - // TemplateString is a plaintext template used to formating the payload + // TemplateString is a plaintext template used to formatting the payload TemplateString string `mapstructure:"templateString"` // ResolvedTemplate is the template after resolving the template variables // It is defined by the configuration loader and cannot be overridden diff --git a/internal/server/v1alpha1/handlers.go b/internal/server/v1alpha1/handlers.go index 6a87857..f398d82 100644 --- a/internal/server/v1alpha1/handlers.go +++ b/internal/server/v1alpha1/handlers.go @@ -11,7 +11,7 @@ import ( "github.com/rs/zerolog/log" "atomys.codes/webhooked/internal/config" - "atomys.codes/webhooked/pkg/formating" + "atomys.codes/webhooked/pkg/formatting" ) // Server is the server instance for the v1alpha1 version @@ -103,8 +103,8 @@ func webhookService(s *Server, spec *config.WebhookSpec, r *http.Request) (err e } for _, storage := range spec.Storage { - str, err := formating. - NewTemplateData(storage.Formating.Template). + str, err := formatting. + NewTemplateData(storage.Formatting.Template). WithRequest(r). WithPayload(data). WithSpec(spec). diff --git a/pkg/formating/format.go b/pkg/formating/format.go index 8098350..aa3ed3b 100644 --- a/pkg/formating/format.go +++ b/pkg/formating/format.go @@ -1,4 +1,4 @@ -package formating +package formatting import ( "bytes" @@ -56,7 +56,7 @@ func (d *TemplateData) WithConfig() *TemplateData { func (d *TemplateData) Render() (string, error) { log.Debug().Msgf("rendering template: %s", d.tmplString) - t := template.New("formatingTmpl").Funcs(funcMap()) + t := template.New("formattingTmpl").Funcs(funcMap()) t, err := t.Parse(d.tmplString) if err != nil { return "", fmt.Errorf("error in your template: %s", err.Error()) diff --git a/pkg/formating/format_test.go b/pkg/formating/format_test.go index a9002cf..8b42d80 100644 --- a/pkg/formating/format_test.go +++ b/pkg/formating/format_test.go @@ -1,4 +1,4 @@ -package formating +package formatting import ( "encoding/json" @@ -63,7 +63,7 @@ func Test_WithPayload(t *testing.T) { func Test_WithSpec(t *testing.T) { assert := assert.New(t) - tmpl := NewTemplateData("").WithSpec(&config.WebhookSpec{Name: "test", Formating: &config.FormatingSpec{}}) + tmpl := NewTemplateData("").WithSpec(&config.WebhookSpec{Name: "test", Formatting: &config.FormattingSpec{}}) assert.NotNil(tmpl) assert.Equal("", tmpl.tmplString) assert.Equal(1, len(tmpl.data)) @@ -123,7 +123,7 @@ func Test_Render(t *testing.T) { `). WithPayload([]byte(`{"test": "test"}`)). WithRequest(req). - WithSpec(&config.WebhookSpec{Name: "test", EntrypointURL: "/webhooks/test", Formating: &config.FormatingSpec{}}). + WithSpec(&config.WebhookSpec{Name: "test", EntrypointURL: "/webhooks/test", Formatting: &config.FormattingSpec{}}). WithStorage(&config.StorageSpec{Type: "testing", Specs: map[string]interface{}{}}). WithConfig() assert.NotNil(tmpl) diff --git a/pkg/formating/functions.go b/pkg/formating/functions.go index 01db707..50e53f1 100644 --- a/pkg/formating/functions.go +++ b/pkg/formating/functions.go @@ -1,4 +1,4 @@ -package formating +package formatting import ( "encoding/json" diff --git a/pkg/formating/functions_test.go b/pkg/formating/functions_test.go index 27d64b6..db28313 100644 --- a/pkg/formating/functions_test.go +++ b/pkg/formating/functions_test.go @@ -1,4 +1,4 @@ -package formating +package formatting import ( "net/http/httptest" diff --git a/tests/webhooks.tests.yml b/tests/webhooks.tests.yml index 7f021a1..7befa11 100644 --- a/tests/webhooks.tests.yml +++ b/tests/webhooks.tests.yml @@ -4,7 +4,7 @@ observability: specs: - name: exampleHook entrypointUrl: /webhooks/example - formating: + formatting: templateString: "{{ .Payload }}" security: - header: From efac54f9a3de75702ea1ab8a15dac6c04ace17ee Mon Sep 17 00:00:00 2001 From: Gregory DALMAR Date: Mon, 6 Jun 2022 01:13:46 +0200 Subject: [PATCH 18/23] docs: Add formatting feature to the README --- README.md | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5e1dc63..387e66e 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ This is exactly what `Webhooked` does ! ## Roadmap -I am actively working on this project to release a stable version by the **end of March 2022** +I am actively working on this project in order to release a stable version for **mid-2022** ![Roadmap](/.github/profile/roadmap.png) @@ -62,6 +62,28 @@ specs: values: ['foo', 'bar'] valueFrom: envRef: SECRET_TOKEN + + # Formatting allows you to apply a custom format to the payload received + # before send it to the storage. You can use built-in helper function to + # format it as you want. (Optional) + # + # Per default the format applied is: "{{ .Payload }}" + # + # THIS IS AN ADVANCED FEATURE : + # Be careful when using this feature, the slightest error in format can + # result in DEFFINITIVE loss of the collected data. Make sure your template is + # correct before applying it in production. + formatting: + templateString: | + { + "config": "{{ toJson .Config }}", + "metadata": { + "specName": "{{ .Spec.Name }}", + "deliveryID": "{{ .Request.Header | getHeader "X-Delivery" | default "unknown" }}" + }, + "payload": {{ .Payload }} + } + # Storage allows you to list where you want to store the raw payloads # received by webhooked. You can add an unlimited number of storages, webhooked # will store in **ALL** the listed storages @@ -70,6 +92,9 @@ specs: # on the `example-webhook` Redis Key on the Database 0 storage: - type: redis + # You can apply a specific formatting per storage (Optional) + formatting: {} + # Storage specification specs: host: redis.default.svc.cluster.local port: 6379 From 856d04c846027a63a04e67f2d19f4d12584734f5 Mon Sep 17 00:00:00 2001 From: Gregory DALMAR Date: Mon, 6 Jun 2022 01:14:55 +0200 Subject: [PATCH 19/23] docs: Add Formatting wiki Link to README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 387e66e..b8ecbe6 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,8 @@ More informations about security pipeline available on wiki : [Configuration/Sec More informations about storages available on wiki : [Configuration/Storages](https://github.com/42Atomys/webhooked/wiki/Configuration-Storages) +More informations about formatting available on wiki : [Configuration/Formatting](https://github.com/42Atomys/webhooked/wiki/Configuration-Formatting) + ### Step 2 : Launch it 🚀 ### With Kubernetes From b0ed12321ad4ac9faaa975627c48eec5cb07f071 Mon Sep 17 00:00:00 2001 From: Gregory DALMAR Date: Mon, 6 Jun 2022 01:16:06 +0200 Subject: [PATCH 20/23] docs: Update links in README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b8ecbe6..b788981 100644 --- a/README.md +++ b/README.md @@ -104,9 +104,9 @@ specs: More informations about security pipeline available on wiki : [Configuration/Security](https://github.com/42Atomys/webhooked/wiki/Security) -More informations about storages available on wiki : [Configuration/Storages](https://github.com/42Atomys/webhooked/wiki/Configuration-Storages) +More informations about storages available on wiki : [Configuration/Storages](https://github.com/42Atomys/webhooked/wiki/Storages) -More informations about formatting available on wiki : [Configuration/Formatting](https://github.com/42Atomys/webhooked/wiki/Configuration-Formatting) +More informations about formatting available on wiki : [Configuration/Formatting](https://github.com/42Atomys/webhooked/wiki/Formatting) ### Step 2 : Launch it 🚀 ### With Kubernetes From 192d464be7bd5eb222f088aa69296ee7a6ab9671 Mon Sep 17 00:00:00 2001 From: Gregory DALMAR Date: Mon, 6 Jun 2022 01:18:42 +0200 Subject: [PATCH 21/23] chore: Rename formatting package --- pkg/{formating => formatting}/format.go | 0 pkg/{formating => formatting}/format_test.go | 0 pkg/{formating => formatting}/functions.go | 0 pkg/{formating => formatting}/functions_test.go | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename pkg/{formating => formatting}/format.go (100%) rename pkg/{formating => formatting}/format_test.go (100%) rename pkg/{formating => formatting}/functions.go (100%) rename pkg/{formating => formatting}/functions_test.go (100%) diff --git a/pkg/formating/format.go b/pkg/formatting/format.go similarity index 100% rename from pkg/formating/format.go rename to pkg/formatting/format.go diff --git a/pkg/formating/format_test.go b/pkg/formatting/format_test.go similarity index 100% rename from pkg/formating/format_test.go rename to pkg/formatting/format_test.go diff --git a/pkg/formating/functions.go b/pkg/formatting/functions.go similarity index 100% rename from pkg/formating/functions.go rename to pkg/formatting/functions.go diff --git a/pkg/formating/functions_test.go b/pkg/formatting/functions_test.go similarity index 100% rename from pkg/formating/functions_test.go rename to pkg/formatting/functions_test.go From 6eb988cfa226850eb497c58b247519f0b0dcf54e Mon Sep 17 00:00:00 2001 From: Gregory DALMAR Date: Mon, 6 Jun 2022 01:25:40 +0200 Subject: [PATCH 22/23] docs: Add formatting docs --- pkg/formatting/format.go | 19 +++++++++++++++++++ pkg/formatting/functions.go | 22 ++++++++++++++++------ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/pkg/formatting/format.go b/pkg/formatting/format.go index aa3ed3b..234db81 100644 --- a/pkg/formatting/format.go +++ b/pkg/formatting/format.go @@ -16,6 +16,10 @@ type TemplateData struct { data map[string]interface{} } +// NewTemplateData returns a new TemplateData instance. It takes the template +// string as a parameter. The template string is the string that will be used +// to render the template. The data is the map of data that will be used to +// render the template. func NewTemplateData(tmplString string) *TemplateData { return &TemplateData{ tmplString: tmplString, @@ -23,36 +27,51 @@ func NewTemplateData(tmplString string) *TemplateData { } } +// WithData adds a key-value pair to the data map. The key is the name of the +// variable and the value is the value of the variable. func (d *TemplateData) WithData(name string, data interface{}) *TemplateData { d.data[name] = data return d } +// WithRequest adds a http.Request object to the data map. The key of request is +// "Request". func (d *TemplateData) WithRequest(r *http.Request) *TemplateData { d.WithData("Request", r) return d } +// WithPayload adds a payload to the data map. The key of payload is "Payload". +// The payload is basically the body of the request. func (d *TemplateData) WithPayload(payload []byte) *TemplateData { d.WithData("Payload", string(payload)) return d } +// WithSpec adds a webhookspec to the data map. The key of spec is "Spec". func (d *TemplateData) WithSpec(spec *config.WebhookSpec) *TemplateData { d.WithData("Spec", spec) return d } +// WithStorage adds a storage spec to the data map. +// The key of storage is "Storage". func (d *TemplateData) WithStorage(spec *config.StorageSpec) *TemplateData { d.WithData("Storage", spec) return d } +// WithConfig adds the current config to the data map. +// The key of config is "Config". func (d *TemplateData) WithConfig() *TemplateData { d.WithData("Config", config.Current()) return d } +// Render returns the rendered template string. It takes the template string +// from the TemplateData instance and the data stored in the TemplateData +// instance. It returns an error if the template string is invalid or when +// rendering the template fails. func (d *TemplateData) Render() (string, error) { log.Debug().Msgf("rendering template: %s", d.tmplString) diff --git a/pkg/formatting/functions.go b/pkg/formatting/functions.go index 50e53f1..b606eb7 100644 --- a/pkg/formatting/functions.go +++ b/pkg/formatting/functions.go @@ -9,6 +9,9 @@ import ( "github.com/rs/zerolog/log" ) +// funcMap is the map of functions that can be used in templates. +// The key is the name of the function and the value is the function itself. +// This is required for the template.New() function to parse the function. func funcMap() template.FuncMap { return template.FuncMap{ // Core functions @@ -24,6 +27,8 @@ func funcMap() template.FuncMap { } } +// dft returns the default value if the given value is empty. +// If the given value is not empty, it is returned as is. func dft(dft interface{}, given ...interface{}) interface{} { if empty(given) || empty(given[0]) { @@ -32,14 +37,14 @@ func dft(dft interface{}, given ...interface{}) interface{} { return given[0] } -// empty returns true if the given value has the zero value for its type. +// empty returns true if the given value is empty. +// It supports any type. func empty(given interface{}) bool { g := reflect.ValueOf(given) if !g.IsValid() { return true } - // Basically adapted from text/template.isTrue switch g.Kind() { default: return g.IsNil() @@ -60,7 +65,8 @@ func empty(given interface{}) bool { } } -// coalesce returns the first non-empty value. +// coalesce returns the first value not empty in the given list. +// If all values are empty, it returns nil. func coalesce(v ...interface{}) interface{} { for _, val := range v { if !empty(val) { @@ -70,7 +76,8 @@ func coalesce(v ...interface{}) interface{} { return nil } -// toJson encodes an item into a JSON string +// toJson returns the given value as a JSON string. +// If the given value is nil, it returns an empty string. func toJson(v interface{}) string { output, err := json.Marshal(v) if err != nil { @@ -79,7 +86,8 @@ func toJson(v interface{}) string { return string(output) } -// toPrettyJson encodes an item into a pretty (indented) JSON string +// toPrettyJson returns the given value as a pretty JSON string indented with +// 2 spaces. If the given value is nil, it returns an empty string. func toPrettyJson(v interface{}) string { output, err := json.MarshalIndent(v, "", " ") if err != nil { @@ -88,7 +96,7 @@ func toPrettyJson(v interface{}) string { return string(output) } -// ternary returns the first value if the last value is true, otherwise returns the second value. +// ternary returns `isTrue` if `condition` is true, otherwise returns `isFalse`. func ternary(isTrue interface{}, isFalse interface{}, confition bool) interface{} { if confition { return isTrue @@ -97,6 +105,8 @@ func ternary(isTrue interface{}, isFalse interface{}, confition bool) interface{ return isFalse } +// getHeader returns the value of the given header. If the header is not found, +// it returns an empty string. func getHeader(name string, headers *http.Header) string { if headers == nil { log.Error().Msg("headers are nil. Returning empty string") From 37948cd4f73150eeb1e6f78ae34eedf500e1708a Mon Sep 17 00:00:00 2001 From: Gregory DALMAR Date: Mon, 6 Jun 2022 01:26:32 +0200 Subject: [PATCH 23/23] docs: Update kubernetes example for 0.6 --- examples/kubernetes/deployment.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/kubernetes/deployment.yaml b/examples/kubernetes/deployment.yaml index 594b3c5..f6cef68 100644 --- a/examples/kubernetes/deployment.yaml +++ b/examples/kubernetes/deployment.yaml @@ -22,7 +22,7 @@ data: - compare: inputs: - name: first - value: '{{ Outputs.header.value }}' + value: '{{ .Outputs.header.value }}' - name: second valueFrom: envRef: SECRET_TOKEN @@ -40,7 +40,7 @@ metadata: name: webhooked labels: app.kubernetes.io/name: webhooked - app.kubernetes.io/version: '0.4' + app.kubernetes.io/version: '0.6' spec: selector: matchLabels: @@ -52,7 +52,7 @@ spec: spec: containers: - name: webhooked - image: atomys/webhooked:0.4 + image: atomys/webhooked:0.6 imagePullPolicy: IfNotPresent env: - name: SECRET_TOKEN