From 7d8c713e70cf06c2bd87b2212eb433031e4366df Mon Sep 17 00:00:00 2001 From: Sebastian Winkler Date: Fri, 23 Aug 2019 20:49:59 +0200 Subject: [PATCH] event: adds feature flagger check with user ID context --- events/event.go | 2 ++ events/event_featureflag.go | 9 +++++++++ events/event_values.go | 9 +++++++++ featureflag/featureflag.go | 16 ++++++++++++++-- go.mod | 2 +- go.sum | 6 ++++-- 6 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 events/event_featureflag.go diff --git a/events/event.go b/events/event.go index c8ce0d5..7045c5f 100644 --- a/events/event.go +++ b/events/event.go @@ -9,6 +9,7 @@ import ( "github.com/go-redis/redis" "github.com/jinzhu/gorm" "gitlab.com/Cacophony/go-kit/discord" + "gitlab.com/Cacophony/go-kit/featureflag" "gitlab.com/Cacophony/go-kit/interfaces" "gitlab.com/Cacophony/go-kit/paginator" "gitlab.com/Cacophony/go-kit/state" @@ -83,6 +84,7 @@ type Event struct { httpClient *http.Client questionnaire *Questionnaire storage *Storage + featureFlagger *featureflag.FeatureFlagger } // BucketType specifies the scope of a bucket diff --git a/events/event_featureflag.go b/events/event_featureflag.go new file mode 100644 index 0000000..6f7b930 --- /dev/null +++ b/events/event_featureflag.go @@ -0,0 +1,9 @@ +package events + +func (e *Event) IsEnabled(key string, fallback bool) bool { + if e.FeatureFlagger() == nil { + return fallback + } + + return e.FeatureFlagger().IsEnabledFor(key, fallback, e.UserID) +} diff --git a/events/event_values.go b/events/event_values.go index d4f250f..f06b2b7 100644 --- a/events/event_values.go +++ b/events/event_values.go @@ -5,6 +5,7 @@ import ( "net/http" "github.com/jinzhu/gorm" + "gitlab.com/Cacophony/go-kit/featureflag" "github.com/go-redis/redis" @@ -141,3 +142,11 @@ func (e *Event) WithQuestionnaire(questionnaire *Questionnaire) { func (e *Event) Questionnaire() *Questionnaire { return e.questionnaire } + +func (e *Event) WithFeatureFlagger(featureFlagger *featureflag.FeatureFlagger) { + e.featureFlagger = featureFlagger +} + +func (e *Event) FeatureFlagger() *featureflag.FeatureFlagger { + return e.featureFlagger +} diff --git a/featureflag/featureflag.go b/featureflag/featureflag.go index 56e2285..dbbcdff 100644 --- a/featureflag/featureflag.go +++ b/featureflag/featureflag.go @@ -4,7 +4,8 @@ import ( "net/http" "time" - unleash "github.com/Unleash/unleash-client-go" + unleash "github.com/Unleash/unleash-client-go/v3" + "github.com/Unleash/unleash-client-go/v3/context" ) // Config represents a Feature Flagger Configuration @@ -44,7 +45,7 @@ func New(config *Config) (*FeatureFlagger, error) { }, nil } -// IsEnabled checks if a feature flag is enabled +// IsEnabled checks if a feature flag is enabled globally func (ff *FeatureFlagger) IsEnabled(key string, fallback bool) bool { if ff.unleashClient == nil { return fallback @@ -53,6 +54,17 @@ func (ff *FeatureFlagger) IsEnabled(key string, fallback bool) bool { return ff.unleashClient.IsEnabled(key, unleash.WithFallback(fallback)) } +// IsEnabled checks if a feature flag is enabled for a specific UserID +func (ff *FeatureFlagger) IsEnabledFor(key string, fallback bool, userID string) bool { + if ff.unleashClient == nil { + return fallback + } + + return ff.unleashClient.IsEnabled(key, unleash.WithFallback(fallback), unleash.WithContext(context.Context{ + UserId: userID, + })) +} + // UnleashListener is our listener for Unleash events type UnleashListener struct{} diff --git a/go.mod b/go.mod index 653ced1..7a6b7a4 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/Masterminds/semver v1.4.2 // indirect github.com/Masterminds/sprig v2.20.0+incompatible github.com/Seklfreak/polr-go v0.0.0-20190324143256-a87fed130937 - github.com/Unleash/unleash-client-go v0.0.0-20190225211619-9febc6ff26f4 + github.com/Unleash/unleash-client-go/v3 v3.0.0 github.com/aws/aws-sdk-go v1.19.46 // indirect github.com/bwmarrin/discordgo v0.16.1-0.20190608205439-347a4f69b0b5 github.com/certifi/gocertifi v0.0.0-20190506164543-d2eda7129713 // indirect diff --git a/go.sum b/go.sum index c3fe883..bec7f59 100644 --- a/go.sum +++ b/go.sum @@ -38,8 +38,8 @@ github.com/Seklfreak/polr-go v0.0.0-20190324143256-a87fed130937 h1:i7uyK5VEr5L/Z github.com/Seklfreak/polr-go v0.0.0-20190324143256-a87fed130937/go.mod h1:eoGl/sGHUD/1hNQEHPvNunsRryc3c4Im57OavEzSxiw= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/Unleash/unleash-client-go v0.0.0-20190225211619-9febc6ff26f4 h1:ZxgumCXfW2XHYgZQD/iwl7qCy6uziWsSJDEdQ05hTXE= -github.com/Unleash/unleash-client-go v0.0.0-20190225211619-9febc6ff26f4/go.mod h1:89lPmFeGRU6Xv5kYZnN1ByXulB4vHW+UepUYSm8s8ws= +github.com/Unleash/unleash-client-go/v3 v3.0.0 h1:J2Ak/0/9atePwIzUccNsZRmZNLyyB1sD5DP4C10hRdk= +github.com/Unleash/unleash-client-go/v3 v3.0.0/go.mod h1:qOPteDX5tImaQlhQOrDtFX3B7WTJuZz53Py88tEV7v8= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -207,6 +207,8 @@ github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94 h1:0ngsPmuP6XIjiFRNFYlvKwSr5zff2v+uPHaffZ6/M4k= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=