Skip to content

Commit 3a42f89

Browse files
(FFM-7235) Update feature configs endpoints (#136)
1 parent 400b846 commit 3a42f89

File tree

4 files changed

+5
-36
lines changed

4 files changed

+5
-36
lines changed

docs/sample_curl_requests.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Fetches an authentication token that can be used for future requests:
2020

2121
If sending this request to a Relay Proxy instance running on localhost:7000 this would be:
2222

23-
`curl -v 'http://localost:7000/client/auth' -H 'content-type: application/json' --data-raw '{"apiKey":"${API_KEY}"}'`
23+
`curl -v 'http://localhost:7000/client/auth' -H 'content-type: application/json' --data-raw '{"apiKey":"${API_KEY}"}'`
2424

2525
This should return a 200 code and a body that includes an auth token that we’ll use for future requests e.g.
2626

domain/domain.go

-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ type FeatureFlag rest.FeatureConfig
2525
// we return from /GET client/env/<env>/feature-configs
2626
type FeatureConfig struct {
2727
FeatureFlag
28-
Segments map[string]Segment `json:"segments"`
2928
}
3029

3130
// MarshalBinary marshals a FeatureFlag to bytes. Currently it just uses json

proxy-service/service.go

-30
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,6 @@ var (
6868
ErrUnauthorised = errors.New("unauthorised")
6969
)
7070

71-
// evaluator is a type that can perform evaluations
72-
type evaluator interface {
73-
// Evaluate evaluates featureConfig(s) against a target and returns an evaluation
74-
Evaluate(target domain.Target, featureConfigs ...domain.FeatureConfig) ([]clientgen.Evaluation, error)
75-
}
76-
7771
// authTokenFn is a function that can generate an auth token
7872
type authTokenFn func(key string) (domain.Token, error)
7973

@@ -197,7 +191,6 @@ func (s Service) FeatureConfig(ctx context.Context, req domain.FeatureConfigRequ
197191

198192
configs := []domain.FeatureConfig{}
199193
flagKey := domain.NewFeatureConfigKey(req.EnvironmentID)
200-
segmentKey := domain.NewSegmentKey(req.EnvironmentID)
201194

202195
// fetch flags
203196
flags, err := s.featureRepo.Get(ctx, flagKey)
@@ -210,21 +203,10 @@ func (s Service) FeatureConfig(ctx context.Context, req domain.FeatureConfigRequ
210203
s.logger.Debug(ctx, "flags not found in cache: ", "err", err.Error())
211204
}
212205

213-
// fetch segments
214-
segments, err := s.segmentRepo.GetAsMap(ctx, segmentKey)
215-
if err != nil {
216-
if !errors.Is(err, domain.ErrCacheNotFound) {
217-
return []domain.FeatureConfig{}, fmt.Errorf("%w: %s", ErrInternal, err)
218-
}
219-
// segments aren't required so just log and continue here
220-
s.logger.Debug(ctx, "target segments not found in cache: ", "err", err.Error())
221-
}
222-
223206
// build FeatureConfig
224207
for _, flag := range flags {
225208
configs = append(configs, domain.FeatureConfig{
226209
FeatureFlag: flag,
227-
Segments: segments,
228210
})
229211
}
230212

@@ -236,7 +218,6 @@ func (s Service) FeatureConfigByIdentifier(ctx context.Context, req domain.Featu
236218
s.logger = s.logger.With("method", "FeatureConfigByIdentifier")
237219

238220
flagKey := domain.NewFeatureConfigKey(req.EnvironmentID)
239-
segmentKey := domain.NewSegmentKey(req.EnvironmentID)
240221

241222
// fetch flag
242223
flag, err := s.featureRepo.GetByIdentifier(ctx, flagKey, req.Identifier)
@@ -247,20 +228,9 @@ func (s Service) FeatureConfigByIdentifier(ctx context.Context, req domain.Featu
247228
return domain.FeatureConfig{}, fmt.Errorf("%w: %s", ErrInternal, err)
248229
}
249230

250-
// fetch segments
251-
segments, err := s.segmentRepo.GetAsMap(ctx, segmentKey)
252-
if err != nil {
253-
if !errors.Is(err, domain.ErrCacheNotFound) {
254-
return domain.FeatureConfig{}, fmt.Errorf("%w: %s", ErrInternal, err)
255-
}
256-
// segments aren't required so just log and continue here
257-
s.logger.Debug(ctx, "target segments not found in cache: ", "err", err.Error())
258-
}
259-
260231
// build FeatureConfig
261232
return domain.FeatureConfig{
262233
FeatureFlag: flag,
263-
Segments: segments,
264234
}, nil
265235
}
266236

transport/http_server_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -249,8 +249,8 @@ func setupHTTPServer(t *testing.T, bypassAuth bool, opts ...setupOpts) *HTTPServ
249249
}
250250

251251
// variationToTargetMap:null is intentional here - refer to FFM-3246 before removing
252-
// featureConfigWithSegments is the expected response body for a FeatureConfigs request - the newline at the end is intentional
253-
var featureConfigWithSegments = []byte(`[{"defaultServe":{"variation":"true"},"environment":"featureflagsqa","feature":"harnessappdemodarkmode","kind":"boolean","offVariation":"false","prerequisites":[],"project":"FeatureFlagsQADemo","rules":[{"clauses":[{"attribute":"age","id":"79f5bca0-17ca-42c2-8934-5cee840fe2e0","negate":false,"op":"equal","values":["55"]}],"priority":1,"ruleId":"8756c207-abf8-4202-83fd-dedf5d27e2c2","serve":{"variation":"false"}}],"state":"on","variationToTargetMap":[{"targetSegments":["flagsTeam"],"targets":[{"identifier":"davej","name":"Dave Johnston"}],"variation":"false"}],"variations":[{"identifier":"true","name":"True","value":"true"},{"identifier":"false","name":"False","value":"false"}],"version":568,"segments":{"flagsTeam":{"createdAt":123,"environment":"featureflagsqa","excluded":[],"identifier":"flagsTeam","included":[],"modifiedAt":456,"name":"flagsTeam","rules":[{"attribute":"ip","id":"31c18ee7-8051-44cc-8507-b44580467ee5","negate":false,"op":"equal","values":["2a00:23c5:b672:2401:158:f2a6:67a0:6a79"]}],"version":1}}},{"defaultServe":{"variation":"1"},"environment":"featureflagsqa","feature":"yet_another_flag","kind":"string","offVariation":"2","prerequisites":[],"project":"FeatureFlagsQADemo","rules":[],"state":"on","variations":[{"identifier":"1","name":"1","value":"1"},{"identifier":"2","name":"2","value":"2"}],"variationToTargetMap":[],"version":6,"segments":{"flagsTeam":{"createdAt":123,"environment":"featureflagsqa","excluded":[],"identifier":"flagsTeam","included":[],"modifiedAt":456,"name":"flagsTeam","rules":[{"attribute":"ip","id":"31c18ee7-8051-44cc-8507-b44580467ee5","negate":false,"op":"equal","values":["2a00:23c5:b672:2401:158:f2a6:67a0:6a79"]}],"version":1}}}]
252+
// featureConfig is the expected response body for a FeatureConfigs request - the newline at the end is intentional
253+
var featureConfig = []byte(`[{"defaultServe":{"variation":"true"},"environment":"featureflagsqa","feature":"harnessappdemodarkmode","kind":"boolean","offVariation":"false","prerequisites":[],"project":"FeatureFlagsQADemo","rules":[{"clauses":[{"attribute":"age","id":"79f5bca0-17ca-42c2-8934-5cee840fe2e0","negate":false,"op":"equal","values":["55"]}],"priority":1,"ruleId":"8756c207-abf8-4202-83fd-dedf5d27e2c2","serve":{"variation":"false"}}],"state":"on","variationToTargetMap":[{"targetSegments":["flagsTeam"],"targets":[{"identifier":"davej","name":"Dave Johnston"}],"variation":"false"}],"variations":[{"identifier":"true","name":"True","value":"true"},{"identifier":"false","name":"False","value":"false"}],"version":568},{"defaultServe":{"variation":"1"},"environment":"featureflagsqa","feature":"yet_another_flag","kind":"string","offVariation":"2","prerequisites":[],"project":"FeatureFlagsQADemo","rules":[],"state":"on","variationToTargetMap":[],"variations":[{"identifier":"1","name":"1","value":"1"},{"identifier":"2","name":"2","value":"2"}],"version":6}]
254254
`)
255255

256256
var emptyFeatureConfig = []byte(`[]
@@ -288,7 +288,7 @@ func TestHTTPServer_GetFeatureConfig(t *testing.T) {
288288
method: http.MethodGet,
289289
url: fmt.Sprintf("%s/client/env/1234/feature-configs", testServer.URL),
290290
expectedStatusCode: http.StatusOK,
291-
expectedResponseBody: featureConfigWithSegments,
291+
expectedResponseBody: featureConfig,
292292
},
293293
}
294294
for desc, tc := range testCases {
@@ -333,7 +333,7 @@ func TestHTTPServer_GetFeatureConfig(t *testing.T) {
333333
}
334334

335335
// harnessAppDemoDarkMode is the expected response body for a FeatureConfigsByIdentifier request where identifier='harnessappdemodarkmode' - the newline at the end is intentional
336-
var harnessAppDemoDarkMode = []byte(`{"defaultServe":{"variation":"true"},"environment":"featureflagsqa","feature":"harnessappdemodarkmode","kind":"boolean","offVariation":"false","prerequisites":[],"project":"FeatureFlagsQADemo","rules":[{"clauses":[{"attribute":"age","id":"79f5bca0-17ca-42c2-8934-5cee840fe2e0","negate":false,"op":"equal","values":["55"]}],"priority":1,"ruleId":"8756c207-abf8-4202-83fd-dedf5d27e2c2","serve":{"variation":"false"}}],"state":"on","variationToTargetMap":[{"targetSegments":["flagsTeam"],"targets":[{"identifier":"davej","name":"Dave Johnston"}],"variation":"false"}],"variations":[{"identifier":"true","name":"True","value":"true"},{"identifier":"false","name":"False","value":"false"}],"version":568,"segments":{"flagsTeam":{"createdAt":123,"environment":"featureflagsqa","excluded":[],"identifier":"flagsTeam","included":[],"modifiedAt":456,"name":"flagsTeam","rules":[{"attribute":"ip","id":"31c18ee7-8051-44cc-8507-b44580467ee5","negate":false,"op":"equal","values":["2a00:23c5:b672:2401:158:f2a6:67a0:6a79"]}],"version":1}}}
336+
var harnessAppDemoDarkMode = []byte(`{"defaultServe":{"variation":"true"},"environment":"featureflagsqa","feature":"harnessappdemodarkmode","kind":"boolean","offVariation":"false","prerequisites":[],"project":"FeatureFlagsQADemo","rules":[{"clauses":[{"attribute":"age","id":"79f5bca0-17ca-42c2-8934-5cee840fe2e0","negate":false,"op":"equal","values":["55"]}],"priority":1,"ruleId":"8756c207-abf8-4202-83fd-dedf5d27e2c2","serve":{"variation":"false"}}],"state":"on","variationToTargetMap":[{"targetSegments":["flagsTeam"],"targets":[{"identifier":"davej","name":"Dave Johnston"}],"variation":"false"}],"variations":[{"identifier":"true","name":"True","value":"true"},{"identifier":"false","name":"False","value":"false"}],"version":568}
337337
`)
338338

339339
// TestHTTPServer_GetFeatureConfigByIdentifier sets up a service with repositories

0 commit comments

Comments
 (0)