From 7f9b1edfa17b3ae7cfb7bc7719d9875019fd53a7 Mon Sep 17 00:00:00 2001 From: abdegenius Date: Sun, 27 Oct 2024 22:11:46 +0100 Subject: [PATCH 01/21] Updates --- cmd/relayproxy/config/notifier.go | 7 +- cmd/relayproxy/service/gofeatureflag.go | 3 + cmd/relayproxy/service/gofeatureflag_test.go | 6 + notifier/microsoftteamsnotifier/notifier.go | 190 ++++++++++++++++ .../microsoftteamsnotifier/notifier_test.go | 214 ++++++++++++++++++ ...d_call_webhook_and_have_valid_results.json | 78 +++++++ 6 files changed, 497 insertions(+), 1 deletion(-) create mode 100644 notifier/microsoftteamsnotifier/notifier.go create mode 100644 notifier/microsoftteamsnotifier/notifier_test.go create mode 100644 notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json diff --git a/cmd/relayproxy/config/notifier.go b/cmd/relayproxy/config/notifier.go index 584d8a6dda9..c456ff2dfa7 100644 --- a/cmd/relayproxy/config/notifier.go +++ b/cmd/relayproxy/config/notifier.go @@ -5,6 +5,7 @@ import "fmt" type NotifierConf struct { Kind NotifierKind `mapstructure:"kind" koanf:"kind"` SlackWebhookURL string `mapstructure:"slackWebhookUrl" koanf:"slackWebhookUrl"` + MicrosoftTeamsWebhookURL string `mapstructure:"microsoftteamsWebhookUrl" koanf:"microsoftteamsWebhookUrl"` EndpointURL string `mapstructure:"endpointUrl" koanf:"endpointUrl"` Secret string `mapstructure:"secret" koanf:"secret"` Meta map[string]string `mapstructure:"meta" koanf:"meta"` @@ -18,6 +19,9 @@ func (c *NotifierConf) IsValid() error { if c.Kind == SlackNotifier && c.SlackWebhookURL == "" { return fmt.Errorf("invalid notifier: no \"slackWebhookUrl\" property found for kind \"%s\"", c.Kind) } + if c.Kind == MicrosoftTeamsNotifier && c.MicrosoftTeamsWebhookURL == "" { + return fmt.Errorf("invalid notifier: no \"microsoftteamsWebhookUrl\" property found for kind \"%s\"", c.Kind) + } if c.Kind == WebhookNotifier && c.EndpointURL == "" { return fmt.Errorf("invalid notifier: no \"endpointUrl\" property found for kind \"%s\"", c.Kind) } @@ -28,13 +32,14 @@ type NotifierKind string const ( SlackNotifier NotifierKind = "slack" + MicrosoftTeamsNotifier NotifierKind = "microsoftteams" WebhookNotifier NotifierKind = "webhook" ) // IsValid is checking if the value is part of the enum func (r NotifierKind) IsValid() error { switch r { - case SlackNotifier, WebhookNotifier: + case SlackNotifier, MicrosoftTeamsNotifier, WebhookNotifier: return nil } return fmt.Errorf("invalid notifier: kind \"%s\" is not supported", r) diff --git a/cmd/relayproxy/service/gofeatureflag.go b/cmd/relayproxy/service/gofeatureflag.go index f8bd96d8218..0006ab5246a 100644 --- a/cmd/relayproxy/service/gofeatureflag.go +++ b/cmd/relayproxy/service/gofeatureflag.go @@ -20,6 +20,7 @@ import ( "github.com/thomaspoignant/go-feature-flag/exporter/webhookexporter" "github.com/thomaspoignant/go-feature-flag/notifier" "github.com/thomaspoignant/go-feature-flag/notifier/slacknotifier" + "github.com/thomaspoignant/go-feature-flag/notifier/microsoftteamsnotifier" "github.com/thomaspoignant/go-feature-flag/notifier/webhooknotifier" "github.com/thomaspoignant/go-feature-flag/retriever" "github.com/thomaspoignant/go-feature-flag/retriever/fileretriever" @@ -304,6 +305,8 @@ func initNotifier(c []config.NotifierConf) ([]notifier.Notifier, error) { switch cNotif.Kind { case config.SlackNotifier: notifiers = append(notifiers, &slacknotifier.Notifier{SlackWebhookURL: cNotif.SlackWebhookURL}) + case config.MicrosoftTeamsNotifier: + notifiers = append(notifiers, µsoftteamsnotifier.Notifier{MicrosoftTeamsWebhookURL: cNotif.MicrosoftTeamsWebhookURL}) case config.WebhookNotifier: notifiers = append(notifiers, diff --git a/cmd/relayproxy/service/gofeatureflag_test.go b/cmd/relayproxy/service/gofeatureflag_test.go index 597080ff042..ce499bd5f94 100644 --- a/cmd/relayproxy/service/gofeatureflag_test.go +++ b/cmd/relayproxy/service/gofeatureflag_test.go @@ -20,6 +20,7 @@ import ( "github.com/thomaspoignant/go-feature-flag/exporter/webhookexporter" "github.com/thomaspoignant/go-feature-flag/notifier" "github.com/thomaspoignant/go-feature-flag/notifier/slacknotifier" + "github.com/thomaspoignant/go-feature-flag/notifier/microsoftteamsnotifier" "github.com/thomaspoignant/go-feature-flag/notifier/webhooknotifier" "github.com/thomaspoignant/go-feature-flag/retriever" "github.com/thomaspoignant/go-feature-flag/retriever/fileretriever" @@ -403,6 +404,10 @@ func Test_initNotifier(t *testing.T) { Kind: config.SlackNotifier, SlackWebhookURL: "http:xxxx.xxx", }, + { + Kind: config.MicrosoftTeamsNotifier, + MicrosoftTeamsWebhookURL: "http:zzzz.zzz", + }, { Kind: config.WebhookNotifier, EndpointURL: "http:yyyy.yyy", @@ -411,6 +416,7 @@ func Test_initNotifier(t *testing.T) { }, want: []notifier.Notifier{ &slacknotifier.Notifier{SlackWebhookURL: "http:xxxx.xxx"}, + µsoftteamsnotifier.Notifier{MicrosoftTeamsWebhookURL: "http:zzzz.zzz"}, &webhooknotifier.Notifier{EndpointURL: "http:yyyy.yyy"}, }, wantErr: assert.NoError, diff --git a/notifier/microsoftteamsnotifier/notifier.go b/notifier/microsoftteamsnotifier/notifier.go new file mode 100644 index 00000000000..48f3a45a5f4 --- /dev/null +++ b/notifier/microsoftteamsnotifier/notifier.go @@ -0,0 +1,190 @@ +package microsoftteamsnotifier + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "os" + "sort" + "strings" + "sync" + "time" + + "github.com/luci/go-render/render" + "github.com/r3labs/diff/v3" + "github.com/thomaspoignant/go-feature-flag/internal" + "github.com/thomaspoignant/go-feature-flag/notifier" +) + +const ( + goFFLogo = "https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/logo_128.png" + microsoftteamsFooter = "go-feature-flag" + colorDeleted = "#FF0000" + colorUpdated = "#FFA500" + colorAdded = "#008000" + longMicrosoftTeamsAttachment = 35 +) + +type Notifier struct { + MicrosoftTeamsWebhookURL string + + httpClient internal.HTTPClient + init sync.Once +} + +func (c *Notifier) Notify(diff notifier.DiffCache) error { + if c.MicrosoftTeamsWebhookURL == "" { + return fmt.Errorf("error: (Microsoft Teams Notifier) invalid notifier configuration, no " + + "MicrosoftTeamsWebhookURL provided for the microsoft teams notifier") + } + + // init the notifier + c.init.Do(func() { + if c.httpClient == nil { + c.httpClient = internal.DefaultHTTPClient() + } + }) + + microsoftteamsURL, err := url.Parse(c.MicrosoftTeamsWebhookURL) + if err != nil { + return fmt.Errorf("error: (Microsoft Teams Notifier) invalid MicrosoftTeamsWebhookURL: %v", c.MicrosoftTeamsWebhookURL) + } + + reqBody := convertToMicrosoftTeamsMessage(diff) + payload, err := json.Marshal(reqBody) + if err != nil { + return fmt.Errorf("error: (Microsoft Teams Notifier) impossible to read differences; %v", err) + } + request := http.Request{ + Method: http.MethodPost, + URL: microsoftteamsURL, + Body: io.NopCloser(bytes.NewReader(payload)), + Header: map[string][]string{"Content-type": {"application/json"}}, + } + response, err := c.httpClient.Do(&request) + if err != nil { + return fmt.Errorf("error: (Microsoft Teams Notifier) error: while calling webhook: %v", err) + } + + defer func() { _ = response.Body.Close() }() + if response.StatusCode > 399 { + return fmt.Errorf("error: (Microsoft Teams Notifier) while calling microsoft teams webhook, statusCode = %d", + response.StatusCode) + } + + return nil +} + +func convertToMicrosoftTeamsMessage(diffCache notifier.DiffCache) microsoftteamsMessage { + hostname, _ := os.Hostname() + attachments := convertDeletedFlagsToMicrosoftTeamsMessage(diffCache) + attachments = append(attachments, convertUpdatedFlagsToMicrosoftTeamsMessage(diffCache)...) + attachments = append(attachments, convertAddedFlagsToMicrosoftTeamsMessage(diffCache)...) + currentDate := time.Now().Format("YYYY-MM-DD") + res := []map[string]interface{}{ + "@type": "MessageCard", + "@context": "https://schema.org/extensions", + "summary": "Changes detected in your feature flag", + "sections": []map[string]interface{}{ + { + "activityTitle": "Changes detected in your feature flag", + "activitySubtitle": fmt.Sprintf("On flag file: *%s*", hostname), + "activityImage": goFFLogo, + "text": fmt.Sprintf("Changes detected in your feature flag file on: *%s*", hostname), + "facts": []map[string]string{ + {"name": "Date", "value": currentDate}, + }, + }, + }, + "attachments": []Attachment{attachments}, + // "attachments": attachments, + } + return res +} + +func convertDeletedFlagsToMicrosoftTeamsMessage(diffCache notifier.DiffCache) []attachment { + attachments := make([]attachment, 0) + for key := range diffCache.Deleted { + attachment := attachment{ + Title: fmt.Sprintf("❌ Flag \"%s\" deleted", key), + Color: colorDeleted, + FooterIcon: goFFLogo, + Footer: microsoftteamsFooter, + } + attachments = append(attachments, attachment) + } + return attachments +} + +func convertUpdatedFlagsToMicrosoftTeamsMessage(diffCache notifier.DiffCache) []attachment { + attachments := make([]attachment, 0) + for key, value := range diffCache.Updated { + attachment := attachment{ + Title: fmt.Sprintf("✏️ Flag \"%s\" updated", key), + Color: colorUpdated, + FooterIcon: goFFLogo, + Footer: microsoftteamsFooter, + Fields: []Field{}, + } + + changelog, _ := diff.Diff(value.Before, value.After, diff.AllowTypeMismatch(true)) + for _, change := range changelog { + if change.Type == "update" { + value := fmt.Sprintf("%s => %s", render.Render(change.From), render.Render(change.To)) + short := len(value) < longMicrosoftTeamsAttachment + attachment.Fields = append( + attachment.Fields, + Field{Title: strings.Join(change.Path, "."), Short: short, Value: value}, + ) + } + } + + sort.Sort(ByTitle(attachment.Fields)) + + attachments = append(attachments, attachment) + } + return attachments +} + +func convertAddedFlagsToMicrosoftTeamsMessage(diff notifier.DiffCache) []attachment { + attachments := make([]attachment, 0) + for key := range diff.Added { + attachment := attachment{ + Title: fmt.Sprintf("🆕 Flag \"%s\" created", key), + Color: colorAdded, + FooterIcon: goFFLogo, + Footer: microsoftteamsFooter, + } + attachments = append(attachments, attachment) + } + return attachments +} + +type microsoftteamsMessage struct { + IconURL string `json:"icon_url"` + Text string `json:"text"` + Attachments []attachment `json:"attachments"` +} + +type attachment struct { + Color string `json:"color"` + Title string `json:"title"` + Fields []Field `json:"fields"` + FooterIcon string `json:"footer_icon,omitempty"` + Footer string `json:"footer,omitempty"` +} + +type Field struct { + Title string `json:"title"` + Value string `json:"value"` + Short bool `json:"short"` +} + +type ByTitle []Field + +func (a ByTitle) Len() int { return len(a) } +func (a ByTitle) Less(i, j int) bool { return a[i].Title < a[j].Title } +func (a ByTitle) Swap(i, j int) { a[i], a[j] = a[j], a[i] } diff --git a/notifier/microsoftteamsnotifier/notifier_test.go b/notifier/microsoftteamsnotifier/notifier_test.go new file mode 100644 index 00000000000..f0687c4b4c4 --- /dev/null +++ b/notifier/microsoftteamsnotifier/notifier_test.go @@ -0,0 +1,214 @@ +package microsoftteamsnotifier + +import ( + "net/http" + "os" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/thomaspoignant/go-feature-flag/internal/flag" + "github.com/thomaspoignant/go-feature-flag/notifier" + "github.com/thomaspoignant/go-feature-flag/testutils" + "github.com/thomaspoignant/go-feature-flag/testutils/testconvert" +) + +func TestMicrosoftTeamsNotifier_Notify(t *testing.T) { + type args struct { + diff notifier.DiffCache + statusCode int + forceError bool + url string + } + type expected struct { + err bool + errMsg string + bodyPath string + signature string + } + tests := []struct { + name string + args args + expected expected + }{ + { + name: "should call webhook and have valid results", + expected: expected{ + bodyPath: "./testdata/should_call_webhook_and_have_valid_results.json", + }, + args: args{ + url: "https://outlook.office.com/webhook/ZZZZ", + statusCode: http.StatusOK, + diff: notifier.DiffCache{ + Added: map[string]flag.Flag{ + "test-flag3": &flag.InternalFlag{ + Rules: &[]flag.Rule{ + { + Name: testconvert.String("rule1"), + Query: testconvert.String("key eq \"random-key\""), + Percentages: &map[string]float64{ + "False": 95, + "True": 5, + }, + }, + }, + Variations: &map[string]*interface{}{ + "Default": testconvert.Interface("default"), + "False": testconvert.Interface("false"), + "True": testconvert.Interface("test"), + }, + DefaultRule: &flag.Rule{ + Name: testconvert.String("defaultRule"), + VariationResult: testconvert.String("Default"), + }, + TrackEvents: testconvert.Bool(true), + Disable: testconvert.Bool(false), + Version: testconvert.String("1.1"), + }, + }, + Deleted: map[string]flag.Flag{ + "test-flag": &flag.InternalFlag{ + Rules: &[]flag.Rule{ + { + Name: testconvert.String("rule1"), + Query: testconvert.String("key eq \"random-key\""), + Percentages: &map[string]float64{ + "False": 0, + "True": 100, + }, + }, + }, + Variations: &map[string]*interface{}{ + "Default": testconvert.Interface(false), + "False": testconvert.Interface(false), + "True": testconvert.Interface(true), + }, + DefaultRule: &flag.Rule{ + Name: testconvert.String("defaultRule"), + VariationResult: testconvert.String("Default"), + }, + }, + }, + Updated: map[string]notifier.DiffUpdated{ + "test-flag2": { + Before: &flag.InternalFlag{ + Variations: &map[string]*interface{}{ + "Default": testconvert.Interface(false), + "False": testconvert.Interface(false), + "True": testconvert.Interface(true), + }, + DefaultRule: &flag.Rule{ + Name: testconvert.String("defaultRule"), + Percentages: &map[string]float64{ + "False": 0, + "True": 100, + }, + }, + Experimentation: &flag.ExperimentationRollout{ + Start: testconvert.Time(time.Unix(1095379400, 0)), + End: testconvert.Time(time.Unix(1095371000, 0)), + }, + }, + After: &flag.InternalFlag{ + Variations: &map[string]*interface{}{ + "Default": testconvert.Interface("strDefault"), + "False": testconvert.Interface("strFalse"), + "True": testconvert.Interface("strTrue"), + }, + Rules: &[]flag.Rule{ + { + Name: testconvert.String("rule1"), + Query: testconvert.String("key eq \"not-a-ke\""), + Percentages: &map[string]float64{ + "False": 20, + "True": 80, + }, + }, + }, + DefaultRule: &flag.Rule{ + Name: testconvert.String("defaultRule"), + VariationResult: testconvert.String("Default"), + }, + Disable: testconvert.Bool(true), + TrackEvents: testconvert.Bool(false), + Version: testconvert.String("1.1"), + }, + }, + }, + }, + }, + }, + { + name: "should err if http code is superior to 399", + expected: expected{ + err: true, + errMsg: "error: (Microsoft Teams Notifier) while calling microsoft teams webhook, statusCode = 400", + }, + args: args{ + url: "https://outlook.office.com/webhook/ZZZZ", + statusCode: http.StatusBadRequest, + diff: notifier.DiffCache{}, + }, + }, + { + name: "should err if error while calling webhook", + expected: expected{ + err: true, + errMsg: "error: (Microsoft Teams Notifier) error: while calling webhook: random error", + }, + args: args{ + url: "https://outlook.office.com/webhook/ZZZZ", + statusCode: http.StatusOK, + diff: notifier.DiffCache{}, + forceError: true, + }, + }, + { + name: "missing microsoft teams url", + expected: expected{ + err: true, + errMsg: "error: (Microsoft Teams Notifier) invalid notifier configuration, no MicrosoftTeamsWebhookURL provided for the microsoft teams notifier", + }, + args: args{ + statusCode: http.StatusOK, + diff: notifier.DiffCache{}, + }, + }, + { + name: "invalid microsoft teams url", + expected: expected{ + err: true, + errMsg: "error: (Microsoft Teams Notifier) invalid MicrosoftTeamsWebhookURL: https://{}outlook.office.com/webhook/ZZZZ", + }, + args: args{ + url: "https://{}outlook.office.com/webhook/ZZZZ", + statusCode: http.StatusOK, + diff: notifier.DiffCache{}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockHTTPClient := &testutils.HTTPClientMock{StatusCode: tt.args.statusCode, ForceError: tt.args.forceError} + + c := Notifier{ + MicrosoftTeamsWebhookURL: tt.args.url, + httpClient: mockHTTPClient, + } + + err := c.Notify(tt.args.diff) + + if tt.expected.err { + assert.ErrorContains(t, err, tt.expected.errMsg) + } else { + assert.NoError(t, err) + hostname, _ := os.Hostname() + content, _ := os.ReadFile(tt.expected.bodyPath) + expectedContent := strings.ReplaceAll(string(content), "{{hostname}}", hostname) + assert.JSONEq(t, expectedContent, mockHTTPClient.Body) + assert.Equal(t, tt.expected.signature, mockHTTPClient.Signature) + } + }) + } +} diff --git a/notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json b/notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json new file mode 100644 index 00000000000..0803b3a8f8f --- /dev/null +++ b/notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json @@ -0,0 +1,78 @@ +{ + "icon_url": "https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/logo_128.png", + "text": "Changes detected in your feature flag file on: *{{hostname}}*", + "attachments": [ + { + "color": "#FF0000", + "title": "❌ Flag \"test-flag\" deleted", + "fields": null, + "footer_icon": "https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/logo_128.png", + "footer": "go-feature-flag" + }, + { + "color": "#FFA500", + "title": "✏️ Flag \"test-flag2\" updated", + "fields": [ + { + "title": "DefaultRule.Percentages", + "value": "(*map[string]float64){\"False\":0, \"True\":100} =\u003e nil", + "short": false + }, + { + "title": "DefaultRule.VariationResult", + "value": "nil =\u003e (*string)(\"Default\")", + "short": true + }, + { + "title": "Disable", + "value": "nil =\u003e (*bool)(true)", + "short": true + }, + { + "title": "Experimentation", + "value": "(*flag.ExperimentationRollout){Start:(*time.Time){wall:0, ext:63230976200, loc:(*time.Location){name:\"\", zone:[]time.zone(nil), tx:[]time.zoneTrans(nil), extend:\"\", cacheStart:0, cacheEnd:0, cacheZone:(*time.zone)(nil)}}, End:(*time.Time){wall:0, ext:63230967800, loc:(*time.Location){name:\"\", zone:[]time.zone(nil), tx:[]time.zoneTrans(nil), extend:\"\", cacheStart:0, cacheEnd:0, cacheZone:(*time.zone)(nil)}}} =\u003e nil", + "short": false + }, + { + "title": "Rules", + "value": "nil =\u003e (*[]flag.Rule){flag.Rule{Name:(*string)(\"rule1\"), Query:(*string)(\"key eq \\\"not-a-ke\\\"\"), VariationResult:(*string)(nil), Percentages:(*map[string]float64){\"False\":20, \"True\":80}, ProgressiveRollout:(*flag.ProgressiveRollout)(nil), Disable:(*bool)(nil)}}", + "short": false + }, + { + "title": "TrackEvents", + "value": "nil =\u003e (*bool)(false)", + "short": true + }, + { + "title": "Variations.Default", + "value": "false =\u003e \"strDefault\"", + "short": true + }, + { + "title": "Variations.False", + "value": "false =\u003e \"strFalse\"", + "short": true + }, + { + "title": "Variations.True", + "value": "true =\u003e \"strTrue\"", + "short": true + }, + { + "title": "Version", + "value": "nil =\u003e (*string)(\"1.1\")", + "short": true + } + ], + "footer_icon": "https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/logo_128.png", + "footer": "go-feature-flag" + }, + { + "color": "#008000", + "title": "🆕 Flag \"test-flag3\" created", + "fields": null, + "footer_icon": "https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/logo_128.png", + "footer": "go-feature-flag" + } + ] +} From 217116f25838f90a999d50b8a96fd8b7f316fa67 Mon Sep 17 00:00:00 2001 From: abdegenius Date: Wed, 30 Oct 2024 08:17:36 +0100 Subject: [PATCH 02/21] Updates --- notifier/microsoftteamsnotifier/notifier.go | 43 ++++++++----------- .../microsoftteamsnotifier/notifier_test.go | 10 ++--- 2 files changed, 23 insertions(+), 30 deletions(-) diff --git a/notifier/microsoftteamsnotifier/notifier.go b/notifier/microsoftteamsnotifier/notifier.go index 48f3a45a5f4..e3bce961307 100644 --- a/notifier/microsoftteamsnotifier/notifier.go +++ b/notifier/microsoftteamsnotifier/notifier.go @@ -58,11 +58,15 @@ func (c *Notifier) Notify(diff notifier.DiffCache) error { if err != nil { return fmt.Errorf("error: (Microsoft Teams Notifier) impossible to read differences; %v", err) } + microsoftTeamAccessToken := os.Getenv("MICROSOFT_TEAMS_ACCESS_TOKEN") request := http.Request{ Method: http.MethodPost, URL: microsoftteamsURL, Body: io.NopCloser(bytes.NewReader(payload)), - Header: map[string][]string{"Content-type": {"application/json"}}, + Header: map[string][]string{ + "Content-Type": {"application/json"}, + "Authorization": {"Bearer " + microsoftTeamAccessToken}, + }, } response, err := c.httpClient.Do(&request) if err != nil { @@ -83,26 +87,13 @@ func convertToMicrosoftTeamsMessage(diffCache notifier.DiffCache) microsoftteams attachments := convertDeletedFlagsToMicrosoftTeamsMessage(diffCache) attachments = append(attachments, convertUpdatedFlagsToMicrosoftTeamsMessage(diffCache)...) attachments = append(attachments, convertAddedFlagsToMicrosoftTeamsMessage(diffCache)...) - currentDate := time.Now().Format("YYYY-MM-DD") - res := []map[string]interface{}{ - "@type": "MessageCard", - "@context": "https://schema.org/extensions", - "summary": "Changes detected in your feature flag", - "sections": []map[string]interface{}{ - { - "activityTitle": "Changes detected in your feature flag", - "activitySubtitle": fmt.Sprintf("On flag file: *%s*", hostname), - "activityImage": goFFLogo, - "text": fmt.Sprintf("Changes detected in your feature flag file on: *%s*", hostname), - "facts": []map[string]string{ - {"name": "Date", "value": currentDate}, - }, - }, - }, - "attachments": []Attachment{attachments}, - // "attachments": attachments, + res := microsoftteamsMessage{ + IconURL: goFFLogo, + Body: MessageBody{Content: fmt.Sprintf("Changes detected in your feature flag file on: *%s*", hostname)}, + Attachments: attachments } return res + } func convertDeletedFlagsToMicrosoftTeamsMessage(diffCache notifier.DiffCache) []attachment { @@ -163,12 +154,6 @@ func convertAddedFlagsToMicrosoftTeamsMessage(diff notifier.DiffCache) []attachm return attachments } -type microsoftteamsMessage struct { - IconURL string `json:"icon_url"` - Text string `json:"text"` - Attachments []attachment `json:"attachments"` -} - type attachment struct { Color string `json:"color"` Title string `json:"title"` @@ -182,6 +167,14 @@ type Field struct { Value string `json:"value"` Short bool `json:"short"` } +type MessageBody struct { + Content string `json:"content"` +} +type microsoftteamsMessage struct { + IconURL string `json:"icon_url"` + Body MessageBody `json:"body"` + Attachments []attachment `json:"attachments"` +} type ByTitle []Field diff --git a/notifier/microsoftteamsnotifier/notifier_test.go b/notifier/microsoftteamsnotifier/notifier_test.go index f0687c4b4c4..d1982c98089 100644 --- a/notifier/microsoftteamsnotifier/notifier_test.go +++ b/notifier/microsoftteamsnotifier/notifier_test.go @@ -38,7 +38,7 @@ func TestMicrosoftTeamsNotifier_Notify(t *testing.T) { bodyPath: "./testdata/should_call_webhook_and_have_valid_results.json", }, args: args{ - url: "https://outlook.office.com/webhook/ZZZZ", + url: "https://graph.microsoft.com/teams/XXXXXX/channels/YYYYYY/messages", statusCode: http.StatusOK, diff: notifier.DiffCache{ Added: map[string]flag.Flag{ @@ -146,7 +146,7 @@ func TestMicrosoftTeamsNotifier_Notify(t *testing.T) { errMsg: "error: (Microsoft Teams Notifier) while calling microsoft teams webhook, statusCode = 400", }, args: args{ - url: "https://outlook.office.com/webhook/ZZZZ", + url: "https://graph.microsoft.com/teams/XXXXXX/channels/YYYYYY/messages", statusCode: http.StatusBadRequest, diff: notifier.DiffCache{}, }, @@ -158,7 +158,7 @@ func TestMicrosoftTeamsNotifier_Notify(t *testing.T) { errMsg: "error: (Microsoft Teams Notifier) error: while calling webhook: random error", }, args: args{ - url: "https://outlook.office.com/webhook/ZZZZ", + url: "https://graph.microsoft.com/teams/XXXXXX/channels/YYYYYY/messages", statusCode: http.StatusOK, diff: notifier.DiffCache{}, forceError: true, @@ -179,10 +179,10 @@ func TestMicrosoftTeamsNotifier_Notify(t *testing.T) { name: "invalid microsoft teams url", expected: expected{ err: true, - errMsg: "error: (Microsoft Teams Notifier) invalid MicrosoftTeamsWebhookURL: https://{}outlook.office.com/webhook/ZZZZ", + errMsg: "error: (Microsoft Teams Notifier) invalid MicrosoftTeamsWebhookURL: https://{}graph.microsoft.com/teams/XXXXXX/channels/YYYYYY/messages", }, args: args{ - url: "https://{}outlook.office.com/webhook/ZZZZ", + url: "https://{}graph.microsoft.com/teams/XXXXXX/channels/YYYYYY/messages", statusCode: http.StatusOK, diff: notifier.DiffCache{}, }, From 8f68cddc4ca104dc0ab91900cc493716cd2cf0a0 Mon Sep 17 00:00:00 2001 From: abdegenius Date: Tue, 5 Nov 2024 22:49:19 +0100 Subject: [PATCH 03/21] Updates --- notifier/microsoftteamsnotifier/notifier.go | 5 ++--- .../should_call_webhook_and_have_valid_results.json | 6 ++++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/notifier/microsoftteamsnotifier/notifier.go b/notifier/microsoftteamsnotifier/notifier.go index e3bce961307..72fac1e41cb 100644 --- a/notifier/microsoftteamsnotifier/notifier.go +++ b/notifier/microsoftteamsnotifier/notifier.go @@ -11,8 +11,7 @@ import ( "sort" "strings" "sync" - "time" - + "github.com/luci/go-render/render" "github.com/r3labs/diff/v3" "github.com/thomaspoignant/go-feature-flag/internal" @@ -90,7 +89,7 @@ func convertToMicrosoftTeamsMessage(diffCache notifier.DiffCache) microsoftteams res := microsoftteamsMessage{ IconURL: goFFLogo, Body: MessageBody{Content: fmt.Sprintf("Changes detected in your feature flag file on: *%s*", hostname)}, - Attachments: attachments + Attachments: attachments, } return res diff --git a/notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json b/notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json index 0803b3a8f8f..222b8a1174a 100644 --- a/notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json +++ b/notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json @@ -1,6 +1,8 @@ { "icon_url": "https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/logo_128.png", - "text": "Changes detected in your feature flag file on: *{{hostname}}*", + "body": { + "content": "Changes detected in your feature flag file on: *{{hostname}}*" + }, "attachments": [ { "color": "#FF0000", @@ -75,4 +77,4 @@ "footer": "go-feature-flag" } ] -} +} \ No newline at end of file From 2ed3fb17ee78dd192843216252c12faeb419d0a6 Mon Sep 17 00:00:00 2001 From: abdegenius Date: Tue, 5 Nov 2024 23:26:37 +0100 Subject: [PATCH 04/21] Updates --- README.md | 1 + .../go_module/notifier/microsoft-teams.md | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 website/docs/go_module/notifier/microsoft-teams.md diff --git a/README.md b/README.md index bb2322b3555..0943774f120 100644 --- a/README.md +++ b/README.md @@ -546,6 +546,7 @@ Available notifiers are: - **Slack** - **Webhook** - **Discord** +- **Microsoft Teams** ## Export data **GO Feature Flag** allows you to export data about the usage of your flags. diff --git a/website/docs/go_module/notifier/microsoft-teams.md b/website/docs/go_module/notifier/microsoft-teams.md new file mode 100644 index 00000000000..760130fa395 --- /dev/null +++ b/website/docs/go_module/notifier/microsoft-teams.md @@ -0,0 +1,40 @@ +--- +sidebar_position: 11 +--- + +# Microsoft Teams Notifier + +The microsoft teams notifier allows to get notified on your favorite microsoft teams channel when an instance of `go-feature-flag` is +detecting changes in the configuration of your flags. + +![Microsoft Teams Notification](/docs/notifier/microsoftteams1.png) + +## Configure Microsoft Teams Notifications + +https://learn.microsoft.com/en-us/graph/api/chatmessage-post + +1. First, get your microsoft team access token. + *Need a hand?*[Click here to see how it's done](https://learn.microsoft.com/en-us/graph/auth/auth-concepts?view=graph-rest-1.0#access-tokens) +2. Add the access token in your env file with the key `MICROSOFT_TEAMS_ACCESS_TOKEN` +3. Copy your Team ID (e.g XXXXXX) as well as well as the Channel ID (e.g YYYYYY) +4. Now, generate/copy your webhook URL. + It should look like: `https://graph.microsoft.com/teams/XXXXXX/channels/YYYYYY/messages`. +5. In your init method add a microsoft teams notifier + +```go +err := ffclient.Init(ffclient.Config +{ + // ... + Notifiers: []notifier.Notifier{ + µsoftteamsnotifier.Notifier{ + MicrosoftTeamsWebhookURL: "https://graph.microsoft.com/teams/XXXXXX/channels/YYYYYY/messages", + }, + }, +}) +``` + +## **Configuration fields** + +| **Field** | **Description** | +|---------------------|-------------------------------------------| +| `MicrosoftTeamsWebhookURL` | The complete URL of your microsoft teams webhook. | From 2d74ae7becea068009e1f9b73c5e85b571a1e5d0 Mon Sep 17 00:00:00 2001 From: abdegenius Date: Wed, 6 Nov 2024 07:46:35 +0100 Subject: [PATCH 05/21] Updates --- website/docs/go_module/notifier/microsoft-teams.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/website/docs/go_module/notifier/microsoft-teams.md b/website/docs/go_module/notifier/microsoft-teams.md index 760130fa395..8c70893b437 100644 --- a/website/docs/go_module/notifier/microsoft-teams.md +++ b/website/docs/go_module/notifier/microsoft-teams.md @@ -7,8 +7,6 @@ sidebar_position: 11 The microsoft teams notifier allows to get notified on your favorite microsoft teams channel when an instance of `go-feature-flag` is detecting changes in the configuration of your flags. -![Microsoft Teams Notification](/docs/notifier/microsoftteams1.png) - ## Configure Microsoft Teams Notifications https://learn.microsoft.com/en-us/graph/api/chatmessage-post From 3a5a80da8275e081be5d92c2a7e97dbaf95da296 Mon Sep 17 00:00:00 2001 From: abdegenius Date: Wed, 6 Nov 2024 09:20:34 +0100 Subject: [PATCH 06/21] Updates --- notifier/microsoftteamsnotifier/notifier.go | 76 +++++++++++++------ ...d_call_webhook_and_have_valid_results.json | 27 +++---- 2 files changed, 62 insertions(+), 41 deletions(-) diff --git a/notifier/microsoftteamsnotifier/notifier.go b/notifier/microsoftteamsnotifier/notifier.go index 72fac1e41cb..2602727573e 100644 --- a/notifier/microsoftteamsnotifier/notifier.go +++ b/notifier/microsoftteamsnotifier/notifier.go @@ -19,12 +19,12 @@ import ( ) const ( - goFFLogo = "https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/logo_128.png" - microsoftteamsFooter = "go-feature-flag" - colorDeleted = "#FF0000" - colorUpdated = "#FFA500" - colorAdded = "#008000" - longMicrosoftTeamsAttachment = 35 + colorDeleted = "#FF0000" + colorUpdated = "#FFA500" + colorAdded = "#008000" + goFFLogo = "https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/logo_128.png" + microsoftteamsFooter = "go-feature-flag" + longMicrosoftTeamsAttachment = 100 ) type Notifier struct { @@ -81,15 +81,17 @@ func (c *Notifier) Notify(diff notifier.DiffCache) error { return nil } -func convertToMicrosoftTeamsMessage(diffCache notifier.DiffCache) microsoftteamsMessage { +func convertToMicrosoftTeamsMessage(diffCache notifier.DiffCache) AdaptiveCard { hostname, _ := os.Hostname() attachments := convertDeletedFlagsToMicrosoftTeamsMessage(diffCache) attachments = append(attachments, convertUpdatedFlagsToMicrosoftTeamsMessage(diffCache)...) attachments = append(attachments, convertAddedFlagsToMicrosoftTeamsMessage(diffCache)...) - res := microsoftteamsMessage{ - IconURL: goFFLogo, - Body: MessageBody{Content: fmt.Sprintf("Changes detected in your feature flag file on: *%s*", hostname)}, - Attachments: attachments, + sections := attachmentsToSections(attachments) + res := AdaptiveCard{ + Type: "MessageCard", + Context: "https://schema.org/extensions", + Summary: fmt.Sprintf("Changes detected in your feature flag file on: *%s*", hostname), + Sections: sections, } return res @@ -153,12 +155,48 @@ func convertAddedFlagsToMicrosoftTeamsMessage(diff notifier.DiffCache) []attachm return attachments } +func attachmentsToSections(attachments []attachment) []Section { + sections := make([]Section, len(attachments)) + for i, att := range attachments { + facts := make([]Fact, len(att.Fields)) + for j, field := range att.Fields { + facts[j] = Fact(field) + } + + sections[i] = Section{ + Title: att.Title, + Color: att.Color, + Facts: facts, + } + } + return sections +} + +type AdaptiveCard struct { + Type string `json:"@type"` + Context string `json:"@context"` + Summary string `json:"summary"` + Sections []Section `json:"sections"` +} + +type Section struct { + Title string `json:"title,omitempty"` + Text string `json:"text,omitempty"` + Color string `json:"color,omitempty"` + Facts []Fact `json:"facts,omitempty"` +} + +type Fact struct { + Title string `json:"title"` + Value string `json:"value"` + Short bool `json:"short"` +} type attachment struct { - Color string `json:"color"` Title string `json:"title"` - Fields []Field `json:"fields"` - FooterIcon string `json:"footer_icon,omitempty"` - Footer string `json:"footer,omitempty"` + Color string `json:"color"` + FooterIcon string `json:"footer_icon"` + Footer string `json:"footer"` + Fields []Field `json:"fields,omitempty"` } type Field struct { @@ -166,14 +204,6 @@ type Field struct { Value string `json:"value"` Short bool `json:"short"` } -type MessageBody struct { - Content string `json:"content"` -} -type microsoftteamsMessage struct { - IconURL string `json:"icon_url"` - Body MessageBody `json:"body"` - Attachments []attachment `json:"attachments"` -} type ByTitle []Field diff --git a/notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json b/notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json index 222b8a1174a..8e7ec8c269d 100644 --- a/notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json +++ b/notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json @@ -1,24 +1,20 @@ { - "icon_url": "https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/logo_128.png", - "body": { - "content": "Changes detected in your feature flag file on: *{{hostname}}*" - }, - "attachments": [ + "@context": "https://schema.org/extensions", + "@type": "MessageCard", + "summary": "Changes detected in your feature flag file on: *{{hostname}}*", + "sections": [ { "color": "#FF0000", - "title": "❌ Flag \"test-flag\" deleted", - "fields": null, - "footer_icon": "https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/logo_128.png", - "footer": "go-feature-flag" + "title": "❌ Flag \"test-flag\" deleted" }, { "color": "#FFA500", "title": "✏️ Flag \"test-flag2\" updated", - "fields": [ + "facts": [ { "title": "DefaultRule.Percentages", "value": "(*map[string]float64){\"False\":0, \"True\":100} =\u003e nil", - "short": false + "short": true }, { "title": "DefaultRule.VariationResult", @@ -65,16 +61,11 @@ "value": "nil =\u003e (*string)(\"1.1\")", "short": true } - ], - "footer_icon": "https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/logo_128.png", - "footer": "go-feature-flag" + ] }, { "color": "#008000", - "title": "🆕 Flag \"test-flag3\" created", - "fields": null, - "footer_icon": "https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/logo_128.png", - "footer": "go-feature-flag" + "title": "🆕 Flag \"test-flag3\" created" } ] } \ No newline at end of file From 919ff6783ae4edbc740f623344f6ec6999afffae Mon Sep 17 00:00:00 2001 From: abdegenius Date: Wed, 6 Nov 2024 11:02:24 +0100 Subject: [PATCH 07/21] Updates --- cmd/relayproxy/config/notifier.go | 23 ++++++------- cmd/relayproxy/service/gofeatureflag.go | 9 ++++-- cmd/relayproxy/service/gofeatureflag_test.go | 4 +-- notifier/microsoftteamsnotifier/notifier.go | 32 +++++++++---------- .../microsoftteamsnotifier/notifier_test.go | 2 +- 5 files changed, 38 insertions(+), 32 deletions(-) diff --git a/cmd/relayproxy/config/notifier.go b/cmd/relayproxy/config/notifier.go index 379cd4f37c3..1852760fc64 100644 --- a/cmd/relayproxy/config/notifier.go +++ b/cmd/relayproxy/config/notifier.go @@ -3,14 +3,15 @@ package config import "fmt" type NotifierConf struct { - Kind NotifierKind `mapstructure:"kind" koanf:"kind"` - SlackWebhookURL string `mapstructure:"slackWebhookUrl" koanf:"slackWebhookUrl"` + Kind NotifierKind `mapstructure:"kind" koanf:"kind"` + // Deprecated: Use WebhookURL instead + SlackWebhookURL string `mapstructure:"slackWebhookUrl" koanf:"slackWebhookUrl"` MicrosoftTeamsWebhookURL string `mapstructure:"microsoftteamsWebhookUrl" koanf:"microsoftteamsWebhookUrl"` - EndpointURL string `mapstructure:"endpointUrl" koanf:"endpointUrl"` - Secret string `mapstructure:"secret" koanf:"secret"` - Meta map[string]string `mapstructure:"meta" koanf:"meta"` - Headers map[string][]string `mapstructure:"headers" koanf:"headers"` - WebhookURL string `mapstructure:"webhookUrl" koanf:"webhookurl"` + EndpointURL string `mapstructure:"endpointUrl" koanf:"endpointUrl"` + Secret string `mapstructure:"secret" koanf:"secret"` + Meta map[string]string `mapstructure:"meta" koanf:"meta"` + Headers map[string][]string `mapstructure:"headers" koanf:"headers"` + WebhookURL string `mapstructure:"webhookUrl" koanf:"webhookurl"` } func (c *NotifierConf) IsValid() error { @@ -35,10 +36,10 @@ func (c *NotifierConf) IsValid() error { type NotifierKind string const ( - SlackNotifier NotifierKind = "slack" - MicrosoftTeamsNotifier NotifierKind = "microsoftteams" - WebhookNotifier NotifierKind = "webhook" - DiscordNotifier NotifierKind = "discord" + SlackNotifier NotifierKind = "slack" + MicrosoftTeamsNotifier NotifierKind = "microsoftteams" + WebhookNotifier NotifierKind = "webhook" + DiscordNotifier NotifierKind = "discord" ) // IsValid is checking if the value is part of the enum diff --git a/cmd/relayproxy/service/gofeatureflag.go b/cmd/relayproxy/service/gofeatureflag.go index e03e0215918..dad9ac9721c 100644 --- a/cmd/relayproxy/service/gofeatureflag.go +++ b/cmd/relayproxy/service/gofeatureflag.go @@ -21,8 +21,8 @@ import ( "github.com/thomaspoignant/go-feature-flag/exporter/webhookexporter" "github.com/thomaspoignant/go-feature-flag/notifier" "github.com/thomaspoignant/go-feature-flag/notifier/discordnotifier" - "github.com/thomaspoignant/go-feature-flag/notifier/slacknotifier" "github.com/thomaspoignant/go-feature-flag/notifier/microsoftteamsnotifier" + "github.com/thomaspoignant/go-feature-flag/notifier/slacknotifier" "github.com/thomaspoignant/go-feature-flag/notifier/webhooknotifier" "github.com/thomaspoignant/go-feature-flag/retriever" "github.com/thomaspoignant/go-feature-flag/retriever/fileretriever" @@ -323,7 +323,12 @@ func initNotifier(c []config.NotifierConf) ([]notifier.Notifier, error) { } notifiers = append(notifiers, &slacknotifier.Notifier{SlackWebhookURL: cNotif.WebhookURL}) case config.MicrosoftTeamsNotifier: - notifiers = append(notifiers, µsoftteamsnotifier.Notifier{MicrosoftTeamsWebhookURL: cNotif.MicrosoftTeamsWebhookURL}) + notifiers = append( + notifiers, + µsoftteamsnotifier.Notifier{ + MicrosoftTeamsWebhookURL: cNotif.MicrosoftTeamsWebhookURL, + }, + ) case config.WebhookNotifier: notifiers = append(notifiers, &webhooknotifier.Notifier{ diff --git a/cmd/relayproxy/service/gofeatureflag_test.go b/cmd/relayproxy/service/gofeatureflag_test.go index ea8721a87ee..3edfee28745 100644 --- a/cmd/relayproxy/service/gofeatureflag_test.go +++ b/cmd/relayproxy/service/gofeatureflag_test.go @@ -20,8 +20,8 @@ import ( "github.com/thomaspoignant/go-feature-flag/exporter/sqsexporter" "github.com/thomaspoignant/go-feature-flag/exporter/webhookexporter" "github.com/thomaspoignant/go-feature-flag/notifier" - "github.com/thomaspoignant/go-feature-flag/notifier/slacknotifier" "github.com/thomaspoignant/go-feature-flag/notifier/microsoftteamsnotifier" + "github.com/thomaspoignant/go-feature-flag/notifier/slacknotifier" "github.com/thomaspoignant/go-feature-flag/notifier/webhooknotifier" "github.com/thomaspoignant/go-feature-flag/retriever" "github.com/thomaspoignant/go-feature-flag/retriever/fileretriever" @@ -426,7 +426,7 @@ func Test_initNotifier(t *testing.T) { SlackWebhookURL: "http:xxxx.xxx", }, { - Kind: config.MicrosoftTeamsNotifier, + Kind: config.MicrosoftTeamsNotifier, MicrosoftTeamsWebhookURL: "http:zzzz.zzz", }, { diff --git a/notifier/microsoftteamsnotifier/notifier.go b/notifier/microsoftteamsnotifier/notifier.go index 2602727573e..ca3e268de2f 100644 --- a/notifier/microsoftteamsnotifier/notifier.go +++ b/notifier/microsoftteamsnotifier/notifier.go @@ -11,7 +11,7 @@ import ( "sort" "strings" "sync" - + "github.com/luci/go-render/render" "github.com/r3labs/diff/v3" "github.com/thomaspoignant/go-feature-flag/internal" @@ -19,11 +19,11 @@ import ( ) const ( - colorDeleted = "#FF0000" - colorUpdated = "#FFA500" - colorAdded = "#008000" - goFFLogo = "https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/logo_128.png" - microsoftteamsFooter = "go-feature-flag" + colorDeleted = "#FF0000" + colorUpdated = "#FFA500" + colorAdded = "#008000" + goFFLogo = "https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/logo_128.png" + microsoftteamsFooter = "go-feature-flag" longMicrosoftTeamsAttachment = 100 ) @@ -49,7 +49,8 @@ func (c *Notifier) Notify(diff notifier.DiffCache) error { microsoftteamsURL, err := url.Parse(c.MicrosoftTeamsWebhookURL) if err != nil { - return fmt.Errorf("error: (Microsoft Teams Notifier) invalid MicrosoftTeamsWebhookURL: %v", c.MicrosoftTeamsWebhookURL) + return fmt.Errorf("error: (Microsoft Teams Notifier) invalid MicrosoftTeamsWebhookURL: %v", + c.MicrosoftTeamsWebhookURL) } reqBody := convertToMicrosoftTeamsMessage(diff) @@ -88,13 +89,12 @@ func convertToMicrosoftTeamsMessage(diffCache notifier.DiffCache) AdaptiveCard { attachments = append(attachments, convertAddedFlagsToMicrosoftTeamsMessage(diffCache)...) sections := attachmentsToSections(attachments) res := AdaptiveCard{ - Type: "MessageCard", - Context: "https://schema.org/extensions", - Summary: fmt.Sprintf("Changes detected in your feature flag file on: *%s*", hostname), - Sections: sections, + Type: "MessageCard", + Context: "https://schema.org/extensions", + Summary: fmt.Sprintf("Changes detected in your feature flag file on: *%s*", hostname), + Sections: sections, } return res - } func convertDeletedFlagsToMicrosoftTeamsMessage(diffCache notifier.DiffCache) []attachment { @@ -173,10 +173,10 @@ func attachmentsToSections(attachments []attachment) []Section { } type AdaptiveCard struct { - Type string `json:"@type"` - Context string `json:"@context"` - Summary string `json:"summary"` - Sections []Section `json:"sections"` + Type string `json:"@type"` + Context string `json:"@context"` + Summary string `json:"summary"` + Sections []Section `json:"sections"` } type Section struct { diff --git a/notifier/microsoftteamsnotifier/notifier_test.go b/notifier/microsoftteamsnotifier/notifier_test.go index d1982c98089..5b03d69b758 100644 --- a/notifier/microsoftteamsnotifier/notifier_test.go +++ b/notifier/microsoftteamsnotifier/notifier_test.go @@ -194,7 +194,7 @@ func TestMicrosoftTeamsNotifier_Notify(t *testing.T) { c := Notifier{ MicrosoftTeamsWebhookURL: tt.args.url, - httpClient: mockHTTPClient, + httpClient: mockHTTPClient, } err := c.Notify(tt.args.diff) From 9cc0cdd0b463ee74383b1a2a2754ae409ff58b6c Mon Sep 17 00:00:00 2001 From: abdegenius Date: Wed, 6 Nov 2024 18:33:05 +0100 Subject: [PATCH 08/21] Updates --- cmd/relayproxy/config/notifier.go | 5 ++--- notifier/microsoftteamsnotifier/notifier.go | 10 +++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/cmd/relayproxy/config/notifier.go b/cmd/relayproxy/config/notifier.go index 1852760fc64..7310f18a8eb 100644 --- a/cmd/relayproxy/config/notifier.go +++ b/cmd/relayproxy/config/notifier.go @@ -6,7 +6,6 @@ type NotifierConf struct { Kind NotifierKind `mapstructure:"kind" koanf:"kind"` // Deprecated: Use WebhookURL instead SlackWebhookURL string `mapstructure:"slackWebhookUrl" koanf:"slackWebhookUrl"` - MicrosoftTeamsWebhookURL string `mapstructure:"microsoftteamsWebhookUrl" koanf:"microsoftteamsWebhookUrl"` EndpointURL string `mapstructure:"endpointUrl" koanf:"endpointUrl"` Secret string `mapstructure:"secret" koanf:"secret"` Meta map[string]string `mapstructure:"meta" koanf:"meta"` @@ -21,8 +20,8 @@ func (c *NotifierConf) IsValid() error { if c.Kind == SlackNotifier && c.SlackWebhookURL == "" { return fmt.Errorf("invalid notifier: no \"slackWebhookUrl\" property found for kind \"%s\"", c.Kind) } - if c.Kind == MicrosoftTeamsNotifier && c.MicrosoftTeamsWebhookURL == "" { - return fmt.Errorf("invalid notifier: no \"microsoftteamsWebhookUrl\" property found for kind \"%s\"", c.Kind) + if c.Kind == MicrosoftTeamsNotifier && c.WebhookURL == "" { + return fmt.Errorf("invalid notifier: no \"webhookURL\" property found for kind \"%s\"", c.Kind) } if c.Kind == WebhookNotifier && c.EndpointURL == "" { return fmt.Errorf("invalid notifier: no \"endpointUrl\" property found for kind \"%s\"", c.Kind) diff --git a/notifier/microsoftteamsnotifier/notifier.go b/notifier/microsoftteamsnotifier/notifier.go index ca3e268de2f..96ccccee9cb 100644 --- a/notifier/microsoftteamsnotifier/notifier.go +++ b/notifier/microsoftteamsnotifier/notifier.go @@ -134,7 +134,7 @@ func convertUpdatedFlagsToMicrosoftTeamsMessage(diffCache notifier.DiffCache) [] } } - sort.Sort(ByTitle(attachment.Fields)) + sort.Sort(byTitle(attachment.Fields)) attachments = append(attachments, attachment) } @@ -205,8 +205,8 @@ type Field struct { Short bool `json:"short"` } -type ByTitle []Field +type byTitle []Field -func (a ByTitle) Len() int { return len(a) } -func (a ByTitle) Less(i, j int) bool { return a[i].Title < a[j].Title } -func (a ByTitle) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byTitle) Len() int { return len(a) } +func (a byTitle) Less(i, j int) bool { return a[i].Title < a[j].Title } +func (a byTitle) Swap(i, j int) { a[i], a[j] = a[j], a[i] } From e18915637e5a5755e4281e85708234cb7b600714 Mon Sep 17 00:00:00 2001 From: abdegenius Date: Wed, 6 Nov 2024 20:01:45 +0100 Subject: [PATCH 09/21] Updates --- cmd/relayproxy/service/gofeatureflag.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/relayproxy/service/gofeatureflag.go b/cmd/relayproxy/service/gofeatureflag.go index dad9ac9721c..1d7ec3c2287 100644 --- a/cmd/relayproxy/service/gofeatureflag.go +++ b/cmd/relayproxy/service/gofeatureflag.go @@ -326,7 +326,7 @@ func initNotifier(c []config.NotifierConf) ([]notifier.Notifier, error) { notifiers = append( notifiers, µsoftteamsnotifier.Notifier{ - MicrosoftTeamsWebhookURL: cNotif.MicrosoftTeamsWebhookURL, + MicrosoftTeamsWebhookURL: cNotif.WebhookURL, }, ) case config.WebhookNotifier: From 01bf51848dfc6d5b9bd8cd61ff55507b843ef8db Mon Sep 17 00:00:00 2001 From: martin machiebe Date: Wed, 6 Nov 2024 20:05:20 +0100 Subject: [PATCH 10/21] updates --- CONTRIBUTING.md | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 17c21a3aa20..62a7fbba5a3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,14 +16,15 @@ Please take a moment to review the following guidelines. 6. [Documentation](#-documentation) 7. [License](#-license) - ## 🚓 Code of Conduct + We expect all contributors to abide by our [Code of Conduct](CODE_OF_CONDUCT.md). Please read it thoroughly before contributing. ## 🙇 How Can I Contribute? ### Bug Reports + If you encounter any bugs or issues with the project, please [create a new issue](../../issues/new?assignees=&labels=bug%2Cneeds-triage&projects=&template=bug.yaml&title=%28bug%29+%3Ctitle%3E) and include as many details as possible, such as: - A clear and descriptive title @@ -35,7 +36,7 @@ If you encounter any bugs or issues with the project, please [create a new issue ### Feature Requests -If you have a feature idea that you would like to see implemented, please [create a new issue](../../issues/new?assignees=&labels=enhancement%2Cneeds-triage&projects=&template=feature.yaml&title=(feature)+) with the following information: +If you have a feature idea that you would like to see implemented, please [create a new issue](<../../issues/new?assignees=&labels=enhancement%2Cneeds-triage&projects=&template=feature.yaml&title=(feature)+<title>>) with the following information: - A clear and descriptive title - A detailed description of the feature @@ -43,9 +44,9 @@ If you have a feature idea that you would like to see implemented, please [creat ### Pull Requests -We welcome contributions in the form of pull requests. +We welcome contributions in the form of pull requests. -Before opening a pull request, we kindly request you check if there is an open issue related to your proposed contribution. +Before opening a pull request, we kindly request you check if there is an open issue related to your proposed contributions. By doing so, we can initiate a discussion and provide feedback on your changes before proceeding with the pull request. This approach ensures that your efforts align with the project's goals and enhances the chances of your contribution being successfully integrated. Thank you for your understanding and cooperation! @@ -72,13 +73,15 @@ Please be patient, as it might take some time for us to get back to you Your contributions are highly valued! ## 🧑‍💻 Development Setup + We always strive to keep the project as simple as possible, so you will find everything you need in the `Makefile` at the root of the repository. -To start contributing please set up your GO environment and run: +To start contributing please set up your GO environment and run: ```shell make vendor ``` + It will download the dependencies and your project will be ready to be used. ### Coding standards @@ -86,15 +89,18 @@ It will download the dependencies and your project will be ready to be used. It is easier for contributors to work on the same project if it has a consistent, unified style, approach, and layout. To help with that, we are using [pre-commit](https://pre-commit.com/) to lint before each commit, I would recommend you to install it, and to apply it to the project by running: + ```bash pre-commit install ``` ### Tests + Every feature or bug should come with an associate test to keep the coverage as high as possible. We aim to have 90% of coverage for the project. ## 🤔 Where can I ask questions about the project? + If you want to contribute and you have any questions you can use different ways to contact us. 1. You can create an issue and ask your question - [Create an issue](https://github.com/thomaspoignant/go-feature-flag/issues/new/choose). @@ -102,24 +108,25 @@ If you want to contribute and you have any questions you can use different ways To join: - Request an invitation [here](https://invite.slack.golangbridge.org/) - Join the [`#go-feature-flag`](https://gophers.slack.com/archives/C029TH8KDFG) channel. -4. Send us an email to contact@gofeatureflag.org +3. Send us an email to contact@gofeatureflag.org ## 🎤 Community Meeting + Since everyone's voice is important we want to hear back from the community. For this reason, we are launching a community meeting every 2 weeks and it is the perfect place to discuss the future of GO Feature Flag and help you use it at full potential. -| Name | Meeting Time | Meeting Notes | Discussions | -| ---- | ------------ | ------------- | ----------- | +| Name | Meeting Time | Meeting Notes | Discussions | +| --------------------------------- | ----------------------------------------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | | GO Feature Flag Community Meeting | Every other Thursday at 10:00 am ET / 16:00 CET | [Google Doc](https://docs.google.com/document/d/13hVS1Eoq6iHwegdk4lveTE3jV4mUehVGqUtf5TLH2pY/edit) | [VC Link (meet)](https://meet.google.com/fpg-ckxs-vmr) | - [Calendar](https://bit.ly/gofeatureflag-calendar) - [ICS](https://calendar.google.com/calendar/ical/30ba1a7fbba6dc31596a2686f6ab22e9971e8785289033f8bb32319c93dd3b59%40group.calendar.google.com/public/basic.ics) - [Web](https://calendar.google.com/calendar/embed?src=30ba1a7fbba6dc31596a2686f6ab22e9971e8785289033f8bb32319c93dd3b59%40group.calendar.google.com&ctz=Europe%2FParis) - ## 📚 Documentation We are maintaining 2 documentations: + - [README.md](README.md) which contains everything you need to know to start working with the module. - [go-feature-flag website](https://gofeatureflag.org) which is the full detail website containing the documentation. @@ -134,9 +141,11 @@ You can start locally the website. 1. Open a terminal and go to the root project of this repository. 2. Launch the command below, it will install the dependencies and run the local server for the documentation. + ```shell make watch-doc ``` + 3. You can now access to the documentation directly in your browser: [http://localhost:3000/](http://localhost:3000/). ## 🪪 License @@ -149,4 +158,4 @@ If you want to check the stats of GO Feature Flag you can have a look at https:/ --- -We encourage everyone to participate in this project and make it better for everyone. Happy contributing 🎉 +We encourage everyone to participate in this project and make it better for everyone. Happy contributing 🎉 From 6e7f59ca862351ce3ca614717e9afb6734321c18 Mon Sep 17 00:00:00 2001 From: abdegenius <johnnieabijah2000@gmail.com> Date: Wed, 6 Nov 2024 20:23:36 +0100 Subject: [PATCH 11/21] Updates --- cmd/relayproxy/service/gofeatureflag_test.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/cmd/relayproxy/service/gofeatureflag_test.go b/cmd/relayproxy/service/gofeatureflag_test.go index 3edfee28745..88abc13168c 100644 --- a/cmd/relayproxy/service/gofeatureflag_test.go +++ b/cmd/relayproxy/service/gofeatureflag_test.go @@ -20,7 +20,6 @@ import ( "github.com/thomaspoignant/go-feature-flag/exporter/sqsexporter" "github.com/thomaspoignant/go-feature-flag/exporter/webhookexporter" "github.com/thomaspoignant/go-feature-flag/notifier" - "github.com/thomaspoignant/go-feature-flag/notifier/microsoftteamsnotifier" "github.com/thomaspoignant/go-feature-flag/notifier/slacknotifier" "github.com/thomaspoignant/go-feature-flag/notifier/webhooknotifier" "github.com/thomaspoignant/go-feature-flag/retriever" @@ -425,10 +424,6 @@ func Test_initNotifier(t *testing.T) { Kind: config.SlackNotifier, SlackWebhookURL: "http:xxxx.xxx", }, - { - Kind: config.MicrosoftTeamsNotifier, - MicrosoftTeamsWebhookURL: "http:zzzz.zzz", - }, { Kind: config.WebhookNotifier, EndpointURL: "http:yyyy.yyy", @@ -437,7 +432,6 @@ func Test_initNotifier(t *testing.T) { }, want: []notifier.Notifier{ &slacknotifier.Notifier{SlackWebhookURL: "http:xxxx.xxx"}, - µsoftteamsnotifier.Notifier{MicrosoftTeamsWebhookURL: "http:zzzz.zzz"}, &webhooknotifier.Notifier{EndpointURL: "http:yyyy.yyy"}, }, wantErr: assert.NoError, From 7a59dd19a7243ee4ffad5d080866ba0ac101645a Mon Sep 17 00:00:00 2001 From: martin machiebe <martinmachiebe21@gmail.com> Date: Wed, 6 Nov 2024 20:40:19 +0100 Subject: [PATCH 12/21] updates --- cmd/relayproxy/config/notifier.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/relayproxy/config/notifier.go b/cmd/relayproxy/config/notifier.go index 133a3cbd09f..e4fc7af2a75 100644 --- a/cmd/relayproxy/config/notifier.go +++ b/cmd/relayproxy/config/notifier.go @@ -5,12 +5,12 @@ import "fmt" type NotifierConf struct { Kind NotifierKind `mapstructure:"kind" koanf:"kind"` // Deprecated: Use WebhookURL instead - SlackWebhookURL string `mapstructure:"slackWebhookUrl" koanf:"slackWebhookUrl"` - EndpointURL string `mapstructure:"endpointUrl" koanf:"endpointUrl"` - Secret string `mapstructure:"secret" koanf:"secret"` - Meta map[string]string `mapstructure:"meta" koanf:"meta"` - Headers map[string][]string `mapstructure:"headers" koanf:"headers"` - WebhookURL string `mapstructure:"webhookUrl" koanf:"webhookurl"` + SlackWebhookURL string `mapstructure:"slackWebhookUrl" koanf:"slackWebhookUrl"` + EndpointURL string `mapstructure:"endpointUrl" koanf:"endpointUrl"` + Secret string `mapstructure:"secret" koanf:"secret"` + Meta map[string]string `mapstructure:"meta" koanf:"meta"` + Headers map[string][]string `mapstructure:"headers" koanf:"headers"` + WebhookURL string `mapstructure:"webhookUrl" koanf:"webhookurl"` } func (c *NotifierConf) IsValid() error { From 90db4e03b64d974fee165572542f75ea89adddc8 Mon Sep 17 00:00:00 2001 From: abdegenius <johnnieabijah2000@gmail.com> Date: Wed, 6 Nov 2024 21:14:51 +0100 Subject: [PATCH 13/21] Updates --- CONTRIBUTING.md | 2 +- cmd/relayproxy/config/notifier.go | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 17c21a3aa20..bfd6521bad5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -149,4 +149,4 @@ If you want to check the stats of GO Feature Flag you can have a look at https:/ --- -We encourage everyone to participate in this project and make it better for everyone. Happy contributing 🎉 +We encourage everyone to participate in this project and make it better for everyone. Happy contributing 🎉 \ No newline at end of file diff --git a/cmd/relayproxy/config/notifier.go b/cmd/relayproxy/config/notifier.go index 7310f18a8eb..9dc888c7da8 100644 --- a/cmd/relayproxy/config/notifier.go +++ b/cmd/relayproxy/config/notifier.go @@ -5,12 +5,12 @@ import "fmt" type NotifierConf struct { Kind NotifierKind `mapstructure:"kind" koanf:"kind"` // Deprecated: Use WebhookURL instead - SlackWebhookURL string `mapstructure:"slackWebhookUrl" koanf:"slackWebhookUrl"` - EndpointURL string `mapstructure:"endpointUrl" koanf:"endpointUrl"` - Secret string `mapstructure:"secret" koanf:"secret"` - Meta map[string]string `mapstructure:"meta" koanf:"meta"` - Headers map[string][]string `mapstructure:"headers" koanf:"headers"` - WebhookURL string `mapstructure:"webhookUrl" koanf:"webhookurl"` + SlackWebhookURL string `mapstructure:"slackWebhookUrl" koanf:"slackwebhookurl"` + EndpointURL string `mapstructure:"endpointUrl" koanf:"endpointurl"` + Secret string `mapstructure:"secret" koanf:"secret"` + Meta map[string]string `mapstructure:"meta" koanf:"meta"` + Headers map[string][]string `mapstructure:"headers" koanf:"headers"` + WebhookURL string `mapstructure:"webhookUrl" koanf:"webhookurl"` } func (c *NotifierConf) IsValid() error { @@ -21,7 +21,7 @@ func (c *NotifierConf) IsValid() error { return fmt.Errorf("invalid notifier: no \"slackWebhookUrl\" property found for kind \"%s\"", c.Kind) } if c.Kind == MicrosoftTeamsNotifier && c.WebhookURL == "" { - return fmt.Errorf("invalid notifier: no \"webhookURL\" property found for kind \"%s\"", c.Kind) + return fmt.Errorf("invalid notifier: no \"WebhookURL\" property found for kind \"%s\"", c.Kind) } if c.Kind == WebhookNotifier && c.EndpointURL == "" { return fmt.Errorf("invalid notifier: no \"endpointUrl\" property found for kind \"%s\"", c.Kind) From b9a8d501c370582529f2ac310de51d7e6fb43248 Mon Sep 17 00:00:00 2001 From: abdegenius <johnnieabijah2000@gmail.com> Date: Wed, 6 Nov 2024 21:22:20 +0100 Subject: [PATCH 14/21] Updates --- cmd/relayproxy/config/notifier.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/relayproxy/config/notifier.go b/cmd/relayproxy/config/notifier.go index 9dc888c7da8..8ab7779254e 100644 --- a/cmd/relayproxy/config/notifier.go +++ b/cmd/relayproxy/config/notifier.go @@ -5,12 +5,12 @@ import "fmt" type NotifierConf struct { Kind NotifierKind `mapstructure:"kind" koanf:"kind"` // Deprecated: Use WebhookURL instead - SlackWebhookURL string `mapstructure:"slackWebhookUrl" koanf:"slackwebhookurl"` - EndpointURL string `mapstructure:"endpointUrl" koanf:"endpointurl"` - Secret string `mapstructure:"secret" koanf:"secret"` - Meta map[string]string `mapstructure:"meta" koanf:"meta"` - Headers map[string][]string `mapstructure:"headers" koanf:"headers"` - WebhookURL string `mapstructure:"webhookUrl" koanf:"webhookurl"` + SlackWebhookURL string `mapstructure:"slackWebhookUrl" koanf:"slackwebhookurl"` + EndpointURL string `mapstructure:"endpointUrl" koanf:"endpointurl"` + Secret string `mapstructure:"secret" koanf:"secret"` + Meta map[string]string `mapstructure:"meta" koanf:"meta"` + Headers map[string][]string `mapstructure:"headers" koanf:"headers"` + WebhookURL string `mapstructure:"webhookUrl" koanf:"webhookurl"` } func (c *NotifierConf) IsValid() error { From b10e67011b5a4c7e67312d3c4f3cf0469addaf4f Mon Sep 17 00:00:00 2001 From: abdegenius <johnnieabijah2000@gmail.com> Date: Wed, 6 Nov 2024 21:42:14 +0100 Subject: [PATCH 15/21] Updates --- cmd/relayproxy/config/notifier.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/relayproxy/config/notifier.go b/cmd/relayproxy/config/notifier.go index 8ab7779254e..9dc888c7da8 100644 --- a/cmd/relayproxy/config/notifier.go +++ b/cmd/relayproxy/config/notifier.go @@ -5,12 +5,12 @@ import "fmt" type NotifierConf struct { Kind NotifierKind `mapstructure:"kind" koanf:"kind"` // Deprecated: Use WebhookURL instead - SlackWebhookURL string `mapstructure:"slackWebhookUrl" koanf:"slackwebhookurl"` - EndpointURL string `mapstructure:"endpointUrl" koanf:"endpointurl"` - Secret string `mapstructure:"secret" koanf:"secret"` - Meta map[string]string `mapstructure:"meta" koanf:"meta"` - Headers map[string][]string `mapstructure:"headers" koanf:"headers"` - WebhookURL string `mapstructure:"webhookUrl" koanf:"webhookurl"` + SlackWebhookURL string `mapstructure:"slackWebhookUrl" koanf:"slackwebhookurl"` + EndpointURL string `mapstructure:"endpointUrl" koanf:"endpointurl"` + Secret string `mapstructure:"secret" koanf:"secret"` + Meta map[string]string `mapstructure:"meta" koanf:"meta"` + Headers map[string][]string `mapstructure:"headers" koanf:"headers"` + WebhookURL string `mapstructure:"webhookUrl" koanf:"webhookurl"` } func (c *NotifierConf) IsValid() error { From 0ac6b730162eaed6837270bb7ab7a7399edd6dd9 Mon Sep 17 00:00:00 2001 From: martin machiebe <martinmachiebe21@gmail.com> Date: Wed, 6 Nov 2024 21:50:38 +0100 Subject: [PATCH 16/21] updates --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 62a7fbba5a3..47cd5be8a27 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -36,7 +36,7 @@ If you encounter any bugs or issues with the project, please [create a new issue ### Feature Requests -If you have a feature idea that you would like to see implemented, please [create a new issue](<../../issues/new?assignees=&labels=enhancement%2Cneeds-triage&projects=&template=feature.yaml&title=(feature)+<title>>) with the following information: +If you have a feature idea that you would like to see implemented, please [create a new issue](../../issues/new?assignees=&labels=enhancement%2Cneeds-triage&projects=&template=feature.yaml&title=(feature)+<title>) with the following information: - A clear and descriptive title - A detailed description of the feature From 124aab7d9cea315e635609b9627112dc23fdbf91 Mon Sep 17 00:00:00 2001 From: Thomas Poignant <thomas.poignant@gofeatureflag.org> Date: Thu, 7 Nov 2024 16:44:17 +0100 Subject: [PATCH 17/21] fix: Remove changes for contributing.md --- CONTRIBUTING.md | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 47cd5be8a27..17c21a3aa20 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,15 +16,14 @@ Please take a moment to review the following guidelines. 6. [Documentation](#-documentation) 7. [License](#-license) -## 🚓 Code of Conduct +## 🚓 Code of Conduct We expect all contributors to abide by our [Code of Conduct](CODE_OF_CONDUCT.md). Please read it thoroughly before contributing. ## 🙇 How Can I Contribute? ### Bug Reports - If you encounter any bugs or issues with the project, please [create a new issue](../../issues/new?assignees=&labels=bug%2Cneeds-triage&projects=&template=bug.yaml&title=%28bug%29+%3Ctitle%3E) and include as many details as possible, such as: - A clear and descriptive title @@ -44,9 +43,9 @@ If you have a feature idea that you would like to see implemented, please [creat ### Pull Requests -We welcome contributions in the form of pull requests. +We welcome contributions in the form of pull requests. -Before opening a pull request, we kindly request you check if there is an open issue related to your proposed contributions. +Before opening a pull request, we kindly request you check if there is an open issue related to your proposed contribution. By doing so, we can initiate a discussion and provide feedback on your changes before proceeding with the pull request. This approach ensures that your efforts align with the project's goals and enhances the chances of your contribution being successfully integrated. Thank you for your understanding and cooperation! @@ -73,15 +72,13 @@ Please be patient, as it might take some time for us to get back to you Your contributions are highly valued! ## 🧑‍💻 Development Setup - We always strive to keep the project as simple as possible, so you will find everything you need in the `Makefile` at the root of the repository. -To start contributing please set up your GO environment and run: +To start contributing please set up your GO environment and run: ```shell make vendor ``` - It will download the dependencies and your project will be ready to be used. ### Coding standards @@ -89,18 +86,15 @@ It will download the dependencies and your project will be ready to be used. It is easier for contributors to work on the same project if it has a consistent, unified style, approach, and layout. To help with that, we are using [pre-commit](https://pre-commit.com/) to lint before each commit, I would recommend you to install it, and to apply it to the project by running: - ```bash pre-commit install ``` ### Tests - Every feature or bug should come with an associate test to keep the coverage as high as possible. We aim to have 90% of coverage for the project. ## 🤔 Where can I ask questions about the project? - If you want to contribute and you have any questions you can use different ways to contact us. 1. You can create an issue and ask your question - [Create an issue](https://github.com/thomaspoignant/go-feature-flag/issues/new/choose). @@ -108,25 +102,24 @@ If you want to contribute and you have any questions you can use different ways To join: - Request an invitation [here](https://invite.slack.golangbridge.org/) - Join the [`#go-feature-flag`](https://gophers.slack.com/archives/C029TH8KDFG) channel. -3. Send us an email to contact@gofeatureflag.org +4. Send us an email to contact@gofeatureflag.org ## 🎤 Community Meeting - Since everyone's voice is important we want to hear back from the community. For this reason, we are launching a community meeting every 2 weeks and it is the perfect place to discuss the future of GO Feature Flag and help you use it at full potential. -| Name | Meeting Time | Meeting Notes | Discussions | -| --------------------------------- | ----------------------------------------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | +| Name | Meeting Time | Meeting Notes | Discussions | +| ---- | ------------ | ------------- | ----------- | | GO Feature Flag Community Meeting | Every other Thursday at 10:00 am ET / 16:00 CET | [Google Doc](https://docs.google.com/document/d/13hVS1Eoq6iHwegdk4lveTE3jV4mUehVGqUtf5TLH2pY/edit) | [VC Link (meet)](https://meet.google.com/fpg-ckxs-vmr) | - [Calendar](https://bit.ly/gofeatureflag-calendar) - [ICS](https://calendar.google.com/calendar/ical/30ba1a7fbba6dc31596a2686f6ab22e9971e8785289033f8bb32319c93dd3b59%40group.calendar.google.com/public/basic.ics) - [Web](https://calendar.google.com/calendar/embed?src=30ba1a7fbba6dc31596a2686f6ab22e9971e8785289033f8bb32319c93dd3b59%40group.calendar.google.com&ctz=Europe%2FParis) + ## 📚 Documentation We are maintaining 2 documentations: - - [README.md](README.md) which contains everything you need to know to start working with the module. - [go-feature-flag website](https://gofeatureflag.org) which is the full detail website containing the documentation. @@ -141,11 +134,9 @@ You can start locally the website. 1. Open a terminal and go to the root project of this repository. 2. Launch the command below, it will install the dependencies and run the local server for the documentation. - ```shell make watch-doc ``` - 3. You can now access to the documentation directly in your browser: [http://localhost:3000/](http://localhost:3000/). ## 🪪 License @@ -158,4 +149,4 @@ If you want to check the stats of GO Feature Flag you can have a look at https:/ --- -We encourage everyone to participate in this project and make it better for everyone. Happy contributing 🎉 +We encourage everyone to participate in this project and make it better for everyone. Happy contributing 🎉 From 787b7c5ab7902002372dc82e62a8263d56c6b161 Mon Sep 17 00:00:00 2001 From: Thomas Poignant <thomas.poignant@gofeatureflag.org> Date: Fri, 8 Nov 2024 14:59:38 +0100 Subject: [PATCH 18/21] refactor PR to support teams --- go.mod | 1 + go.sum | 2 + notifier/microsoftteamsnotifier/notifier.go | 189 ++--------- .../microsoftteamsnotifier/notifier_test.go | 295 +++++++++--------- ...d_call_webhook_and_have_valid_results.json | 92 ++---- website/docs/go_module/notifier/index.md | 2 + .../go_module/notifier/microsoft-teams.md | 22 +- .../docs/relay_proxy/configure_relay_proxy.md | 7 + website/src/components/home/features/index.js | 6 + website/static/docs/notifier/teams.png | Bin 0 -> 159928 bytes 10 files changed, 212 insertions(+), 404 deletions(-) create mode 100644 website/static/docs/notifier/teams.png diff --git a/go.mod b/go.mod index 91d4ee089ce..4d379e81301 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( cloud.google.com/go/storage v1.46.0 github.com/BurntSushi/toml v1.4.0 github.com/IBM/sarama v1.43.3 + github.com/atc0005/go-teams-notify/v2 v2.13.0 github.com/aws/aws-lambda-go v1.47.0 github.com/aws/aws-sdk-go v1.55.5 github.com/aws/aws-sdk-go-v2 v1.32.3 diff --git a/go.sum b/go.sum index ab25f5577bc..73c243c5320 100644 --- a/go.sum +++ b/go.sum @@ -168,6 +168,8 @@ github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QN github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.14.2 h1:hY4rAyg7Eqbb27GB6gkhUKrRAuc8xRjlNtJq+LseKeY= github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/atc0005/go-teams-notify/v2 v2.13.0 h1:nbDeHy89NjYlF/PEfLVF6lsserY9O5SnN1iOIw3AxXw= +github.com/atc0005/go-teams-notify/v2 v2.13.0/go.mod h1:WSv9moolRsBcpZbwEf6gZxj7h0uJlJskJq5zkEWKO8Y= github.com/aws/aws-lambda-go v1.47.0 h1:0H8s0vumYx/YKs4sE7YM0ktwL2eWse+kfopsRI1sXVI= github.com/aws/aws-lambda-go v1.47.0/go.mod h1:dpMpZgvWx5vuQJfBt0zqBha60q7Dd7RfgJv23DymV8A= github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= diff --git a/notifier/microsoftteamsnotifier/notifier.go b/notifier/microsoftteamsnotifier/notifier.go index 96ccccee9cb..22ce63387fd 100644 --- a/notifier/microsoftteamsnotifier/notifier.go +++ b/notifier/microsoftteamsnotifier/notifier.go @@ -1,37 +1,21 @@ package microsoftteamsnotifier import ( - "bytes" - "encoding/json" "fmt" - "io" - "net/http" - "net/url" "os" - "sort" "strings" - "sync" + goteamsnotify "github.com/atc0005/go-teams-notify/v2" + "github.com/atc0005/go-teams-notify/v2/adaptivecard" "github.com/luci/go-render/render" "github.com/r3labs/diff/v3" - "github.com/thomaspoignant/go-feature-flag/internal" "github.com/thomaspoignant/go-feature-flag/notifier" ) -const ( - colorDeleted = "#FF0000" - colorUpdated = "#FFA500" - colorAdded = "#008000" - goFFLogo = "https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/logo_128.png" - microsoftteamsFooter = "go-feature-flag" - longMicrosoftTeamsAttachment = 100 -) - type Notifier struct { MicrosoftTeamsWebhookURL string - httpClient internal.HTTPClient - init sync.Once + teamsClient *goteamsnotify.TeamsClient } func (c *Notifier) Notify(diff notifier.DiffCache) error { @@ -39,174 +23,37 @@ func (c *Notifier) Notify(diff notifier.DiffCache) error { return fmt.Errorf("error: (Microsoft Teams Notifier) invalid notifier configuration, no " + "MicrosoftTeamsWebhookURL provided for the microsoft teams notifier") } - - // init the notifier - c.init.Do(func() { - if c.httpClient == nil { - c.httpClient = internal.DefaultHTTPClient() - } - }) - - microsoftteamsURL, err := url.Parse(c.MicrosoftTeamsWebhookURL) + msgText := convertToMicrosoftTeamsMessage(diff) + msg, err := adaptivecard.NewSimpleMessage(msgText, "GO Feature Flag", true) if err != nil { - return fmt.Errorf("error: (Microsoft Teams Notifier) invalid MicrosoftTeamsWebhookURL: %v", - c.MicrosoftTeamsWebhookURL) + return err } - - reqBody := convertToMicrosoftTeamsMessage(diff) - payload, err := json.Marshal(reqBody) - if err != nil { - return fmt.Errorf("error: (Microsoft Teams Notifier) impossible to read differences; %v", err) - } - microsoftTeamAccessToken := os.Getenv("MICROSOFT_TEAMS_ACCESS_TOKEN") - request := http.Request{ - Method: http.MethodPost, - URL: microsoftteamsURL, - Body: io.NopCloser(bytes.NewReader(payload)), - Header: map[string][]string{ - "Content-Type": {"application/json"}, - "Authorization": {"Bearer " + microsoftTeamAccessToken}, - }, - } - response, err := c.httpClient.Do(&request) - if err != nil { - return fmt.Errorf("error: (Microsoft Teams Notifier) error: while calling webhook: %v", err) + if c.teamsClient == nil { + c.teamsClient = goteamsnotify.NewTeamsClient() } + return c.teamsClient.Send(c.MicrosoftTeamsWebhookURL, msg) - defer func() { _ = response.Body.Close() }() - if response.StatusCode > 399 { - return fmt.Errorf("error: (Microsoft Teams Notifier) while calling microsoft teams webhook, statusCode = %d", - response.StatusCode) - } - - return nil } -func convertToMicrosoftTeamsMessage(diffCache notifier.DiffCache) AdaptiveCard { +func convertToMicrosoftTeamsMessage(diffCache notifier.DiffCache) string { hostname, _ := os.Hostname() - attachments := convertDeletedFlagsToMicrosoftTeamsMessage(diffCache) - attachments = append(attachments, convertUpdatedFlagsToMicrosoftTeamsMessage(diffCache)...) - attachments = append(attachments, convertAddedFlagsToMicrosoftTeamsMessage(diffCache)...) - sections := attachmentsToSections(attachments) - res := AdaptiveCard{ - Type: "MessageCard", - Context: "https://schema.org/extensions", - Summary: fmt.Sprintf("Changes detected in your feature flag file on: *%s*", hostname), - Sections: sections, + msgText := fmt.Sprintf("Changes detected in your feature flag file on: **%s**", hostname) + for key := range diffCache.Deleted { + msgText += fmt.Sprintf("\n * ❌ Flag **%s** deleted", key) } - return res -} -func convertDeletedFlagsToMicrosoftTeamsMessage(diffCache notifier.DiffCache) []attachment { - attachments := make([]attachment, 0) - for key := range diffCache.Deleted { - attachment := attachment{ - Title: fmt.Sprintf("❌ Flag \"%s\" deleted", key), - Color: colorDeleted, - FooterIcon: goFFLogo, - Footer: microsoftteamsFooter, - } - attachments = append(attachments, attachment) + for key := range diffCache.Added { + msgText += fmt.Sprintf("\n * 🆕 Flag **%s** created", key) } - return attachments -} -func convertUpdatedFlagsToMicrosoftTeamsMessage(diffCache notifier.DiffCache) []attachment { - attachments := make([]attachment, 0) for key, value := range diffCache.Updated { - attachment := attachment{ - Title: fmt.Sprintf("✏️ Flag \"%s\" updated", key), - Color: colorUpdated, - FooterIcon: goFFLogo, - Footer: microsoftteamsFooter, - Fields: []Field{}, - } - + msgText += fmt.Sprintf("\n * ✏️ Flag **%s** updated", key) changelog, _ := diff.Diff(value.Before, value.After, diff.AllowTypeMismatch(true)) for _, change := range changelog { if change.Type == "update" { - value := fmt.Sprintf("%s => %s", render.Render(change.From), render.Render(change.To)) - short := len(value) < longMicrosoftTeamsAttachment - attachment.Fields = append( - attachment.Fields, - Field{Title: strings.Join(change.Path, "."), Short: short, Value: value}, - ) + msgText += fmt.Sprintf("\n * %s: %s => %s", strings.Join(change.Path, "."), render.Render(change.From), render.Render(change.To)) } } - - sort.Sort(byTitle(attachment.Fields)) - - attachments = append(attachments, attachment) - } - return attachments -} - -func convertAddedFlagsToMicrosoftTeamsMessage(diff notifier.DiffCache) []attachment { - attachments := make([]attachment, 0) - for key := range diff.Added { - attachment := attachment{ - Title: fmt.Sprintf("🆕 Flag \"%s\" created", key), - Color: colorAdded, - FooterIcon: goFFLogo, - Footer: microsoftteamsFooter, - } - attachments = append(attachments, attachment) } - return attachments + return msgText } - -func attachmentsToSections(attachments []attachment) []Section { - sections := make([]Section, len(attachments)) - for i, att := range attachments { - facts := make([]Fact, len(att.Fields)) - for j, field := range att.Fields { - facts[j] = Fact(field) - } - - sections[i] = Section{ - Title: att.Title, - Color: att.Color, - Facts: facts, - } - } - return sections -} - -type AdaptiveCard struct { - Type string `json:"@type"` - Context string `json:"@context"` - Summary string `json:"summary"` - Sections []Section `json:"sections"` -} - -type Section struct { - Title string `json:"title,omitempty"` - Text string `json:"text,omitempty"` - Color string `json:"color,omitempty"` - Facts []Fact `json:"facts,omitempty"` -} - -type Fact struct { - Title string `json:"title"` - Value string `json:"value"` - Short bool `json:"short"` -} -type attachment struct { - Title string `json:"title"` - Color string `json:"color"` - FooterIcon string `json:"footer_icon"` - Footer string `json:"footer"` - Fields []Field `json:"fields,omitempty"` -} - -type Field struct { - Title string `json:"title"` - Value string `json:"value"` - Short bool `json:"short"` -} - -type byTitle []Field - -func (a byTitle) Len() int { return len(a) } -func (a byTitle) Less(i, j int) bool { return a[i].Title < a[j].Title } -func (a byTitle) Swap(i, j int) { a[i], a[j] = a[j], a[i] } diff --git a/notifier/microsoftteamsnotifier/notifier_test.go b/notifier/microsoftteamsnotifier/notifier_test.go index 5b03d69b758..0e1f254844f 100644 --- a/notifier/microsoftteamsnotifier/notifier_test.go +++ b/notifier/microsoftteamsnotifier/notifier_test.go @@ -1,214 +1,203 @@ package microsoftteamsnotifier import ( + "bytes" + "io" "net/http" "os" "strings" "testing" "time" + goteamsnotify "github.com/atc0005/go-teams-notify/v2" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/thomaspoignant/go-feature-flag/internal/flag" "github.com/thomaspoignant/go-feature-flag/notifier" - "github.com/thomaspoignant/go-feature-flag/testutils" "github.com/thomaspoignant/go-feature-flag/testutils/testconvert" ) func TestMicrosoftTeamsNotifier_Notify(t *testing.T) { - type args struct { - diff notifier.DiffCache - statusCode int - forceError bool - url string - } - type expected struct { - err bool - errMsg string - bodyPath string - signature string - } tests := []struct { - name string - args args - expected expected + name string + diff notifier.DiffCache + roundTripper *mockRoundTripper + wantErr assert.ErrorAssertionFunc + want string + webhookURL string }{ { name: "should call webhook and have valid results", - expected: expected{ - bodyPath: "./testdata/should_call_webhook_and_have_valid_results.json", - }, - args: args{ - url: "https://graph.microsoft.com/teams/XXXXXX/channels/YYYYYY/messages", - statusCode: http.StatusOK, - diff: notifier.DiffCache{ - Added: map[string]flag.Flag{ - "test-flag3": &flag.InternalFlag{ - Rules: &[]flag.Rule{ - { - Name: testconvert.String("rule1"), - Query: testconvert.String("key eq \"random-key\""), - Percentages: &map[string]float64{ - "False": 95, - "True": 5, - }, + diff: notifier.DiffCache{ + Added: map[string]flag.Flag{ + "test-flag3": &flag.InternalFlag{ + Rules: &[]flag.Rule{ + { + Name: testconvert.String("rule1"), + Query: testconvert.String("key eq \"random-key\""), + Percentages: &map[string]float64{ + "False": 95, + "True": 5, }, }, - Variations: &map[string]*interface{}{ - "Default": testconvert.Interface("default"), - "False": testconvert.Interface("false"), - "True": testconvert.Interface("test"), - }, - DefaultRule: &flag.Rule{ - Name: testconvert.String("defaultRule"), - VariationResult: testconvert.String("Default"), - }, - TrackEvents: testconvert.Bool(true), - Disable: testconvert.Bool(false), - Version: testconvert.String("1.1"), }, + Variations: &map[string]*interface{}{ + "Default": testconvert.Interface("default"), + "False": testconvert.Interface("false"), + "True": testconvert.Interface("test"), + }, + DefaultRule: &flag.Rule{ + Name: testconvert.String("defaultRule"), + VariationResult: testconvert.String("Default"), + }, + TrackEvents: testconvert.Bool(true), + Disable: testconvert.Bool(false), + Version: testconvert.String("1.1"), }, - Deleted: map[string]flag.Flag{ - "test-flag": &flag.InternalFlag{ - Rules: &[]flag.Rule{ - { - Name: testconvert.String("rule1"), - Query: testconvert.String("key eq \"random-key\""), - Percentages: &map[string]float64{ - "False": 0, - "True": 100, - }, + }, + Deleted: map[string]flag.Flag{ + "test-flag": &flag.InternalFlag{ + Rules: &[]flag.Rule{ + { + Name: testconvert.String("rule1"), + Query: testconvert.String("key eq \"random-key\""), + Percentages: &map[string]float64{ + "False": 0, + "True": 100, }, }, + }, + Variations: &map[string]*interface{}{ + "Default": testconvert.Interface(false), + "False": testconvert.Interface(false), + "True": testconvert.Interface(true), + }, + DefaultRule: &flag.Rule{ + Name: testconvert.String("defaultRule"), + VariationResult: testconvert.String("Default"), + }, + }, + }, + Updated: map[string]notifier.DiffUpdated{ + "test-flag2": { + Before: &flag.InternalFlag{ Variations: &map[string]*interface{}{ "Default": testconvert.Interface(false), "False": testconvert.Interface(false), "True": testconvert.Interface(true), }, DefaultRule: &flag.Rule{ - Name: testconvert.String("defaultRule"), - VariationResult: testconvert.String("Default"), + Name: testconvert.String("defaultRule"), + Percentages: &map[string]float64{ + "False": 0, + "True": 100, + }, + }, + Experimentation: &flag.ExperimentationRollout{ + Start: testconvert.Time(time.Unix(1095379400, 0)), + End: testconvert.Time(time.Unix(1095371000, 0)), }, }, - }, - Updated: map[string]notifier.DiffUpdated{ - "test-flag2": { - Before: &flag.InternalFlag{ - Variations: &map[string]*interface{}{ - "Default": testconvert.Interface(false), - "False": testconvert.Interface(false), - "True": testconvert.Interface(true), - }, - DefaultRule: &flag.Rule{ - Name: testconvert.String("defaultRule"), + After: &flag.InternalFlag{ + Variations: &map[string]*interface{}{ + "Default": testconvert.Interface("strDefault"), + "False": testconvert.Interface("strFalse"), + "True": testconvert.Interface("strTrue"), + }, + Rules: &[]flag.Rule{ + { + Name: testconvert.String("rule1"), + Query: testconvert.String("key eq \"not-a-ke\""), Percentages: &map[string]float64{ - "False": 0, - "True": 100, + "False": 20, + "True": 80, }, }, - Experimentation: &flag.ExperimentationRollout{ - Start: testconvert.Time(time.Unix(1095379400, 0)), - End: testconvert.Time(time.Unix(1095371000, 0)), - }, }, - After: &flag.InternalFlag{ - Variations: &map[string]*interface{}{ - "Default": testconvert.Interface("strDefault"), - "False": testconvert.Interface("strFalse"), - "True": testconvert.Interface("strTrue"), - }, - Rules: &[]flag.Rule{ - { - Name: testconvert.String("rule1"), - Query: testconvert.String("key eq \"not-a-ke\""), - Percentages: &map[string]float64{ - "False": 20, - "True": 80, - }, - }, - }, - DefaultRule: &flag.Rule{ - Name: testconvert.String("defaultRule"), - VariationResult: testconvert.String("Default"), - }, - Disable: testconvert.Bool(true), - TrackEvents: testconvert.Bool(false), - Version: testconvert.String("1.1"), + DefaultRule: &flag.Rule{ + Name: testconvert.String("defaultRule"), + VariationResult: testconvert.String("Default"), }, + Disable: testconvert.Bool(true), + TrackEvents: testconvert.Bool(false), + Version: testconvert.String("1.1"), }, }, }, }, + roundTripper: newMockRoundTripper(http.StatusAccepted), + wantErr: assert.NoError, + want: "./testdata/should_call_webhook_and_have_valid_results.json", + webhookURL: "https://prod-22.francecentral.logic.azure.com:443/workflows/XXXXXX/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=XXX", }, { - name: "should err if http code is superior to 399", - expected: expected{ - err: true, - errMsg: "error: (Microsoft Teams Notifier) while calling microsoft teams webhook, statusCode = 400", - }, - args: args{ - url: "https://graph.microsoft.com/teams/XXXXXX/channels/YYYYYY/messages", - statusCode: http.StatusBadRequest, - diff: notifier.DiffCache{}, - }, + name: "should err if http code is superior to 399", + roundTripper: newMockRoundTripper(http.StatusBadRequest), + wantErr: assert.Error, + webhookURL: "https://prod-22.francecentral.logic.azure.com:443/workflows/XXXXXX/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=XXX", }, { - name: "should err if error while calling webhook", - expected: expected{ - err: true, - errMsg: "error: (Microsoft Teams Notifier) error: while calling webhook: random error", - }, - args: args{ - url: "https://graph.microsoft.com/teams/XXXXXX/channels/YYYYYY/messages", - statusCode: http.StatusOK, - diff: notifier.DiffCache{}, - forceError: true, - }, + name: "missing microsoft teams url", + diff: notifier.DiffCache{}, + roundTripper: newMockRoundTripper(http.StatusAccepted), + wantErr: assert.Error, }, { - name: "missing microsoft teams url", - expected: expected{ - err: true, - errMsg: "error: (Microsoft Teams Notifier) invalid notifier configuration, no MicrosoftTeamsWebhookURL provided for the microsoft teams notifier", - }, - args: args{ - statusCode: http.StatusOK, - diff: notifier.DiffCache{}, - }, - }, - { - name: "invalid microsoft teams url", - expected: expected{ - err: true, - errMsg: "error: (Microsoft Teams Notifier) invalid MicrosoftTeamsWebhookURL: https://{}graph.microsoft.com/teams/XXXXXX/channels/YYYYYY/messages", - }, - args: args{ - url: "https://{}graph.microsoft.com/teams/XXXXXX/channels/YYYYYY/messages", - statusCode: http.StatusOK, - diff: notifier.DiffCache{}, - }, + name: "invalid microsoft teams url", + diff: notifier.DiffCache{}, + roundTripper: newMockRoundTripper(http.StatusAccepted), + wantErr: assert.Error, + webhookURL: "https://{}}/workflows/XXXXXX/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=XXX", }, } + for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - mockHTTPClient := &testutils.HTTPClientMock{StatusCode: tt.args.statusCode, ForceError: tt.args.forceError} + mstClient := goteamsnotify.NewTeamsClient() + if tt.roundTripper != nil { + mstClient.SetHTTPClient(&http.Client{Transport: tt.roundTripper}) + } - c := Notifier{ - MicrosoftTeamsWebhookURL: tt.args.url, - httpClient: mockHTTPClient, + n := &Notifier{ + MicrosoftTeamsWebhookURL: tt.webhookURL, + teamsClient: mstClient, } - err := c.Notify(tt.args.diff) + err := n.Notify(tt.diff) + tt.wantErr(t, err) - if tt.expected.err { - assert.ErrorContains(t, err, tt.expected.errMsg) - } else { - assert.NoError(t, err) - hostname, _ := os.Hostname() - content, _ := os.ReadFile(tt.expected.bodyPath) - expectedContent := strings.ReplaceAll(string(content), "{{hostname}}", hostname) - assert.JSONEq(t, expectedContent, mockHTTPClient.Body) - assert.Equal(t, tt.expected.signature, mockHTTPClient.Signature) + if err != nil { + return } + + hostname, _ := os.Hostname() + wantBody, err := os.ReadFile(tt.want) + require.NoError(t, err) + assert.JSONEq(t, strings.Replace(string(wantBody), "{{hostname}}", hostname, -1), tt.roundTripper.requestBody) }) } } + +func newMockRoundTripper(status int) *mockRoundTripper { + return &mockRoundTripper{ + response: &http.Response{ + StatusCode: status, + Body: nil, + }, + } +} + +type mockRoundTripper struct { + response *http.Response + requestBody string +} + +func (rt *mockRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + body, err := io.ReadAll(req.Body) + if err != nil { + return nil, err + } + rt.requestBody = string(body) + req.Body = io.NopCloser(bytes.NewBuffer(body)) + return rt.response, nil +} diff --git a/notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json b/notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json index 8e7ec8c269d..2bef04bb978 100644 --- a/notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json +++ b/notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json @@ -1,71 +1,29 @@ { - "@context": "https://schema.org/extensions", - "@type": "MessageCard", - "summary": "Changes detected in your feature flag file on: *{{hostname}}*", - "sections": [ + "type": "message", + "attachments": [ { - "color": "#FF0000", - "title": "❌ Flag \"test-flag\" deleted" - }, - { - "color": "#FFA500", - "title": "✏️ Flag \"test-flag2\" updated", - "facts": [ - { - "title": "DefaultRule.Percentages", - "value": "(*map[string]float64){\"False\":0, \"True\":100} =\u003e nil", - "short": true - }, - { - "title": "DefaultRule.VariationResult", - "value": "nil =\u003e (*string)(\"Default\")", - "short": true - }, - { - "title": "Disable", - "value": "nil =\u003e (*bool)(true)", - "short": true - }, - { - "title": "Experimentation", - "value": "(*flag.ExperimentationRollout){Start:(*time.Time){wall:0, ext:63230976200, loc:(*time.Location){name:\"\", zone:[]time.zone(nil), tx:[]time.zoneTrans(nil), extend:\"\", cacheStart:0, cacheEnd:0, cacheZone:(*time.zone)(nil)}}, End:(*time.Time){wall:0, ext:63230967800, loc:(*time.Location){name:\"\", zone:[]time.zone(nil), tx:[]time.zoneTrans(nil), extend:\"\", cacheStart:0, cacheEnd:0, cacheZone:(*time.zone)(nil)}}} =\u003e nil", - "short": false - }, - { - "title": "Rules", - "value": "nil =\u003e (*[]flag.Rule){flag.Rule{Name:(*string)(\"rule1\"), Query:(*string)(\"key eq \\\"not-a-ke\\\"\"), VariationResult:(*string)(nil), Percentages:(*map[string]float64){\"False\":20, \"True\":80}, ProgressiveRollout:(*flag.ProgressiveRollout)(nil), Disable:(*bool)(nil)}}", - "short": false - }, - { - "title": "TrackEvents", - "value": "nil =\u003e (*bool)(false)", - "short": true - }, - { - "title": "Variations.Default", - "value": "false =\u003e \"strDefault\"", - "short": true - }, - { - "title": "Variations.False", - "value": "false =\u003e \"strFalse\"", - "short": true - }, - { - "title": "Variations.True", - "value": "true =\u003e \"strTrue\"", - "short": true - }, - { - "title": "Version", - "value": "nil =\u003e (*string)(\"1.1\")", - "short": true - } - ] - }, - { - "color": "#008000", - "title": "🆕 Flag \"test-flag3\" created" + "contentType": "application/vnd.microsoft.card.adaptive", + "content": { + "type": "AdaptiveCard", + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "version": "1.4", + "body": [ + { + "type": "TextBlock", + "text": "GO Feature Flag", + "size": "large", + "weight": "bolder", + "style": "heading", + "wrap": true + }, + { + "type": "TextBlock", + "text": "Changes detected in your feature flag file on: **{{hostname}}**\n * ❌ Flag **test-flag** deleted\n * 🆕 Flag **test-flag3** created\n * ✏️ Flag **test-flag2** updated\n * Variations.Default: false =\u003e \"strDefault\"\n * Variations.False: false =\u003e \"strFalse\"\n * Variations.True: true =\u003e \"strTrue\"\n * Rules: nil =\u003e (*[]flag.Rule){flag.Rule{Name:(*string)(\"rule1\"), Query:(*string)(\"key eq \\\"not-a-ke\\\"\"), VariationResult:(*string)(nil), Percentages:(*map[string]float64){\"False\":20, \"True\":80}, ProgressiveRollout:(*flag.ProgressiveRollout)(nil), Disable:(*bool)(nil)}}\n * DefaultRule.VariationResult: nil =\u003e (*string)(\"Default\")\n * DefaultRule.Percentages: (*map[string]float64){\"False\":0, \"True\":100} =\u003e nil\n * Experimentation: (*flag.ExperimentationRollout){Start:(*time.Time){wall:0, ext:63230976200, loc:(*time.Location){name:\"\", zone:[]time.zone(nil), tx:[]time.zoneTrans(nil), extend:\"\", cacheStart:0, cacheEnd:0, cacheZone:(*time.zone)(nil)}}, End:(*time.Time){wall:0, ext:63230967800, loc:(*time.Location){name:\"\", zone:[]time.zone(nil), tx:[]time.zoneTrans(nil), extend:\"\", cacheStart:0, cacheEnd:0, cacheZone:(*time.zone)(nil)}}} =\u003e nil\n * TrackEvents: nil =\u003e (*bool)(false)\n * Disable: nil =\u003e (*bool)(true)\n * Version: nil =\u003e (*string)(\"1.1\")", + "wrap": true + } + ], + "msteams": {} + } } ] -} \ No newline at end of file +} diff --git a/website/docs/go_module/notifier/index.md b/website/docs/go_module/notifier/index.md index 3cad29c1332..ac348ef9955 100644 --- a/website/docs/go_module/notifier/index.md +++ b/website/docs/go_module/notifier/index.md @@ -15,3 +15,5 @@ Available notifiers are: - [Slack](slack.md) - Get a slack message with the changes. - [Webhook](webhook.md) - Call an API with the changes. +- [Discord](discord.md) - Get a discord message with the changes. +- [Microsoft Teams](microsoft-teams.md) - Get a Microsoft Teams message with the changes. diff --git a/website/docs/go_module/notifier/microsoft-teams.md b/website/docs/go_module/notifier/microsoft-teams.md index 8c70893b437..3757d394549 100644 --- a/website/docs/go_module/notifier/microsoft-teams.md +++ b/website/docs/go_module/notifier/microsoft-teams.md @@ -7,17 +7,13 @@ sidebar_position: 11 The microsoft teams notifier allows to get notified on your favorite microsoft teams channel when an instance of `go-feature-flag` is detecting changes in the configuration of your flags. -## Configure Microsoft Teams Notifications -https://learn.microsoft.com/en-us/graph/api/chatmessage-post +## Configure Microsoft Teams Notifications -1. First, get your microsoft team access token. - *Need a hand?*[Click here to see how it's done](https://learn.microsoft.com/en-us/graph/auth/auth-concepts?view=graph-rest-1.0#access-tokens) -2. Add the access token in your env file with the key `MICROSOFT_TEAMS_ACCESS_TOKEN` -3. Copy your Team ID (e.g XXXXXX) as well as well as the Channel ID (e.g YYYYYY) -4. Now, generate/copy your webhook URL. - It should look like: `https://graph.microsoft.com/teams/XXXXXX/channels/YYYYYY/messages`. -5. In your init method add a microsoft teams notifier +1. First create a Webhook in the channel you want to send notifications to. + *Need a hand?*[Click here to see how it's done](https://support.microsoft.com/en-us/office/create-incoming-webhooks-with-workflows-for-microsoft-teams-8ae491c7-0394-4861-ba59-055e33f75498) +2. Copy the webhook URL +3. Now you can configure your notifier ```go err := ffclient.Init(ffclient.Config @@ -25,14 +21,14 @@ err := ffclient.Init(ffclient.Config // ... Notifiers: []notifier.Notifier{ µsoftteamsnotifier.Notifier{ - MicrosoftTeamsWebhookURL: "https://graph.microsoft.com/teams/XXXXXX/channels/YYYYYY/messages", - }, + MicrosoftTeamsWebhookURL: "https://xxx.xxx/..." + }, }, }) ``` ## **Configuration fields** -| **Field** | **Description** | -|---------------------|-------------------------------------------| +| **Field** | **Description** | +|----------------------------|---------------------------------------------------| | `MicrosoftTeamsWebhookURL` | The complete URL of your microsoft teams webhook. | diff --git a/website/docs/relay_proxy/configure_relay_proxy.md b/website/docs/relay_proxy/configure_relay_proxy.md index dc4e17a067e..a6bb2db90b0 100644 --- a/website/docs/relay_proxy/configure_relay_proxy.md +++ b/website/docs/relay_proxy/configure_relay_proxy.md @@ -296,6 +296,13 @@ the [doc](../go_module/store_file/redis#expected-format) available._ | `kind` | string | **none** | **(mandatory)** Value should be **`discord`**.<br/>_This field is mandatory and describe which retriever you are using._ | | `webhookUrl` | string | **none** | **(mandatory)** The complete URL of your incoming webhook configured in Discord. | +### Microsoft Teams + +| Field name | Type | Default | Description | +|--------------|--------|----------|---------------------------------------------------------------------------------------------------------------------------------| +| `kind` | string | **none** | **(mandatory)** Value should be **`microsoftteams`**.<br/>_This field is mandatory and describe which retriever you are using._ | +| `webhookUrl` | string | **none** | **(mandatory)** The complete URL of your incoming webhook configured in Discord. | + ### Webhook | Field name | Type | Default | Description | diff --git a/website/src/components/home/features/index.js b/website/src/components/home/features/index.js index f1821dbedd0..5094e2ce97b 100644 --- a/website/src/components/home/features/index.js +++ b/website/src/components/home/features/index.js @@ -7,6 +7,7 @@ import sqslogo from '@site/static/docs/collectors/sqs.png'; import pubsublogo from '@site/static/docs/collectors/pubsub.png'; import s3logo from '@site/static/docs/collectors/s3.png'; import kinesislogo from '@site/static/docs/collectors/kinesis.png'; +import teamslogo from '@site/static/docs/notifier/teams.png'; import webhooklogo from '@site/static/docs/collectors/webhook.png'; import {Headline} from '../headline'; @@ -319,6 +320,11 @@ function Integration() { img={kinesislogo} tooltipText="AWS Kinesis" /> + <SocialIcon + colorClassName={styles.socialIconAws} + img={teamslogo} + tooltipText="Microsoft Teams" + /> </div> </div> </div> diff --git a/website/static/docs/notifier/teams.png b/website/static/docs/notifier/teams.png new file mode 100644 index 0000000000000000000000000000000000000000..511c2e279ebc818b2eee64746d329de0dd00797c GIT binary patch literal 159928 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 literal 0 HcmV?d00001 From ca4424d8df88294c42f2790b6d23b1e2645fe7cf Mon Sep 17 00:00:00 2001 From: Thomas Poignant <thomas.poignant@gofeatureflag.org> Date: Fri, 8 Nov 2024 15:10:48 +0100 Subject: [PATCH 19/21] fix: linter --- notifier/microsoftteamsnotifier/notifier.go | 4 ++-- notifier/microsoftteamsnotifier/notifier_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/notifier/microsoftteamsnotifier/notifier.go b/notifier/microsoftteamsnotifier/notifier.go index 22ce63387fd..52c830a7325 100644 --- a/notifier/microsoftteamsnotifier/notifier.go +++ b/notifier/microsoftteamsnotifier/notifier.go @@ -32,7 +32,6 @@ func (c *Notifier) Notify(diff notifier.DiffCache) error { c.teamsClient = goteamsnotify.NewTeamsClient() } return c.teamsClient.Send(c.MicrosoftTeamsWebhookURL, msg) - } func convertToMicrosoftTeamsMessage(diffCache notifier.DiffCache) string { @@ -51,7 +50,8 @@ func convertToMicrosoftTeamsMessage(diffCache notifier.DiffCache) string { changelog, _ := diff.Diff(value.Before, value.After, diff.AllowTypeMismatch(true)) for _, change := range changelog { if change.Type == "update" { - msgText += fmt.Sprintf("\n * %s: %s => %s", strings.Join(change.Path, "."), render.Render(change.From), render.Render(change.To)) + msgText += fmt.Sprintf("\n * %s: %s => %s", strings.Join(change.Path, "."), + render.Render(change.From), render.Render(change.To)) } } } diff --git a/notifier/microsoftteamsnotifier/notifier_test.go b/notifier/microsoftteamsnotifier/notifier_test.go index 0e1f254844f..c31372b7043 100644 --- a/notifier/microsoftteamsnotifier/notifier_test.go +++ b/notifier/microsoftteamsnotifier/notifier_test.go @@ -173,7 +173,7 @@ func TestMicrosoftTeamsNotifier_Notify(t *testing.T) { hostname, _ := os.Hostname() wantBody, err := os.ReadFile(tt.want) require.NoError(t, err) - assert.JSONEq(t, strings.Replace(string(wantBody), "{{hostname}}", hostname, -1), tt.roundTripper.requestBody) + assert.JSONEq(t, strings.ReplaceAll(string(wantBody), "{{hostname}}", hostname), tt.roundTripper.requestBody) }) } } From 84a813c63cb87fe98606a5f23d0597d8483a4fb4 Mon Sep 17 00:00:00 2001 From: Thomas Poignant <thomas.poignant@gofeatureflag.org> Date: Fri, 8 Nov 2024 15:12:22 +0100 Subject: [PATCH 20/21] add test --- cmd/relayproxy/config/notifier_test.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cmd/relayproxy/config/notifier_test.go b/cmd/relayproxy/config/notifier_test.go index 2cf186b6fc9..d7d6168c395 100644 --- a/cmd/relayproxy/config/notifier_test.go +++ b/cmd/relayproxy/config/notifier_test.go @@ -70,6 +70,15 @@ func TestNotifierConf_IsValid(t *testing.T) { }, wantErr: false, }, + { + name: "kind microsoftteams without webhookURL", + fields: fields{ + Kind: "microsoftteams", + WebhookURL: "", + }, + wantErr: true, + errValue: `invalid notifier: no "WebhookURL" property found for kind "microsoftteams"`, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { From a5ccdc7af0ac3fa75a437feb2e9a2623e7590537 Mon Sep 17 00:00:00 2001 From: Thomas Poignant <thomas.poignant@gofeatureflag.org> Date: Fri, 8 Nov 2024 15:55:43 +0100 Subject: [PATCH 21/21] add test --- cmd/relayproxy/service/gofeatureflag_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cmd/relayproxy/service/gofeatureflag_test.go b/cmd/relayproxy/service/gofeatureflag_test.go index e9de5df3ccc..da62e722096 100644 --- a/cmd/relayproxy/service/gofeatureflag_test.go +++ b/cmd/relayproxy/service/gofeatureflag_test.go @@ -20,6 +20,8 @@ import ( "github.com/thomaspoignant/go-feature-flag/exporter/sqsexporter" "github.com/thomaspoignant/go-feature-flag/exporter/webhookexporter" "github.com/thomaspoignant/go-feature-flag/notifier" + "github.com/thomaspoignant/go-feature-flag/notifier/discordnotifier" + "github.com/thomaspoignant/go-feature-flag/notifier/microsoftteamsnotifier" "github.com/thomaspoignant/go-feature-flag/notifier/slacknotifier" "github.com/thomaspoignant/go-feature-flag/notifier/webhooknotifier" "github.com/thomaspoignant/go-feature-flag/retriever" @@ -428,11 +430,21 @@ func Test_initNotifier(t *testing.T) { Kind: config.WebhookNotifier, EndpointURL: "http:yyyy.yyy", }, + { + Kind: config.MicrosoftTeamsNotifier, + WebhookURL: "http:zzzz.zzz", + }, + { + Kind: config.DiscordNotifier, + WebhookURL: "http:aaaa.aaa", + }, }, }, want: []notifier.Notifier{ &slacknotifier.Notifier{SlackWebhookURL: "http:xxxx.xxx"}, &webhooknotifier.Notifier{EndpointURL: "http:yyyy.yyy"}, + µsoftteamsnotifier.Notifier{MicrosoftTeamsWebhookURL: "http:zzzz.zzz"}, + &discordnotifier.Notifier{DiscordWebhookURL: "http:aaaa.aaa"}, }, wantErr: assert.NoError, },