@@ -25,14 +25,15 @@ import (
2525
2626// SdkServerController bundles all request handler for sdk-server apis
2727type SdkServerController struct {
28- logger logging.LoggerInterface
29- fetcher service.SplitFetcher
30- proxySplitStorage storage.ProxySplitStorage
31- proxySegmentStorage storage.ProxySegmentStorage
32- fsmatcher flagsets.FlagSetMatcher
33- versionFilter specs.SplitVersionFilter
34- largeSegmentStorage cmnStorage.LargeSegmentsStorage
35- specVersion string
28+ logger logging.LoggerInterface
29+ fetcher service.SplitFetcher
30+ proxySplitStorage storage.ProxySplitStorage
31+ proxyRBSegmentStorage storage.ProxyRuleBasedSegmentsStorage
32+ proxySegmentStorage storage.ProxySegmentStorage
33+ fsmatcher flagsets.FlagSetMatcher
34+ versionFilter specs.SplitVersionFilter
35+ largeSegmentStorage cmnStorage.LargeSegmentsStorage
36+ specVersion string
3637}
3738
3839// NewSdkServerController instantiates a new sdk server controller
@@ -41,19 +42,21 @@ func NewSdkServerController(
4142 fetcher service.SplitFetcher ,
4243 proxySplitStorage storage.ProxySplitStorage ,
4344 proxySegmentStorage storage.ProxySegmentStorage ,
45+ proxyRBSegmentStorage storage.ProxyRuleBasedSegmentsStorage ,
4446 fsmatcher flagsets.FlagSetMatcher ,
4547 largeSegmentStorage cmnStorage.LargeSegmentsStorage ,
4648 specVersion string ,
4749) * SdkServerController {
4850 return & SdkServerController {
49- logger : logger ,
50- fetcher : fetcher ,
51- proxySplitStorage : proxySplitStorage ,
52- proxySegmentStorage : proxySegmentStorage ,
53- fsmatcher : fsmatcher ,
54- versionFilter : specs .NewSplitVersionFilter (),
55- largeSegmentStorage : largeSegmentStorage ,
56- specVersion : specVersion ,
51+ logger : logger ,
52+ fetcher : fetcher ,
53+ proxySplitStorage : proxySplitStorage ,
54+ proxySegmentStorage : proxySegmentStorage ,
55+ proxyRBSegmentStorage : proxyRBSegmentStorage ,
56+ fsmatcher : fsmatcher ,
57+ versionFilter : specs .NewSplitVersionFilter (),
58+ largeSegmentStorage : largeSegmentStorage ,
59+ specVersion : specVersion ,
5760 }
5861}
5962
@@ -107,6 +110,11 @@ func (c *SdkServerController) SplitChanges(ctx *gin.Context) {
107110 since = - 1
108111 }
109112
113+ rbsince , err := strconv .ParseInt (ctx .DefaultQuery ("rbSince" , "-1" ), 10 , 64 )
114+ if err != nil {
115+ rbsince = - 1
116+ }
117+
110118 var rawSets []string
111119 if fq , ok := ctx .GetQuery ("sets" ); ok {
112120 rawSets = strings .Split (fq , "," )
@@ -116,9 +124,9 @@ func (c *SdkServerController) SplitChanges(ctx *gin.Context) {
116124 c .logger .Warning (fmt .Sprintf ("SDK [%s] is sending flagsets unordered or with duplicates." , ctx .Request .Header .Get ("SplitSDKVersion" )))
117125 }
118126
119- c .logger .Debug (fmt .Sprintf ("SDK Fetches Feature Flags Since: %d" , since ))
127+ c .logger .Debug (fmt .Sprintf ("SDK Fetches Feature Flags Since: %d, RBSince: %d " , since , rbsince ))
120128
121- splits , err := c .fetchSplitChangesSince (since , sets )
129+ rules , err := c .fetchRulesSince (since , rbsince , sets )
122130 if err != nil {
123131 c .logger .Error ("error fetching splitChanges payload from storage: " , err )
124132 ctx .JSON (http .StatusInternalServerError , gin.H {"error" : err .Error ()})
@@ -133,9 +141,23 @@ func (c *SdkServerController) SplitChanges(ctx *gin.Context) {
133141 return
134142 }
135143
136- splits . Splits = c .patchUnsupportedMatchers (splits .Splits , spec )
144+ rules . FeatureFlags . Splits = c .patchUnsupportedMatchers (rules . FeatureFlags .Splits , spec )
137145
138- ctx .JSON (http .StatusOK , splits )
146+ if spec == specs .FLAG_V1_3 {
147+ fmt .Println ("1.3 1.3 1.3 1.3 1.3 " )
148+ fmt .Println ("cantidad de ff:" , len (rules .FeatureFlags .Splits ), rules .FeatureFlags .Since , rules .FeatureFlags .Till )
149+ fmt .Println ("cantidad de rb:" , len (rules .RuleBasedSegments .RuleBasedSegments ), rules .RuleBasedSegments .Since , rules .RuleBasedSegments .Till )
150+ ctx .JSON (http .StatusOK , rules )
151+ ctx .Set (caching .SurrogateContextKey , []string {caching .SplitSurrogate })
152+ ctx .Set (caching .StickyContextKey , true )
153+ return
154+ }
155+ fmt .Println ("otra otra otra otra" )
156+ ctx .JSON (http .StatusOK , dtos.SplitChangesDTO {
157+ Splits : rules .FeatureFlags .Splits ,
158+ Since : rules .FeatureFlags .Since ,
159+ Till : rules .FeatureFlags .Till ,
160+ })
139161 ctx .Set (caching .SurrogateContextKey , []string {caching .SplitSurrogate })
140162 ctx .Set (caching .StickyContextKey , true )
141163}
@@ -187,26 +209,49 @@ func (c *SdkServerController) MySegments(ctx *gin.Context) {
187209 ctx .Set (caching .SurrogateContextKey , caching .MakeSurrogateForMySegments (mySegments ))
188210}
189211
190- func (c * SdkServerController ) fetchSplitChangesSince (since int64 , sets []string ) (* dtos.SplitChangesDTO , error ) {
212+ func (c * SdkServerController ) fetchRulesSince (since int64 , rbsince int64 , sets []string ) (* dtos.RuleChangesDTO , error ) {
213+ fmt .Println ("split change since: " , since )
191214 splits , err := c .proxySplitStorage .ChangesSince (since , sets )
192- if err == nil {
193- return splits , nil
215+ fmt .Println ("split result: " , splits , err )
216+ fmt .Println ("rule baseed since: " , rbsince )
217+ rbs , rbsErr := c .proxyRBSegmentStorage .ChangesSince (rbsince )
218+ fmt .Println ("rulebased result: " , rbs , rbsErr )
219+ if err == nil && rbsErr == nil {
220+ return & dtos.RuleChangesDTO {
221+ FeatureFlags : dtos.FeatureFlagsDTO {
222+ Splits : splits .Splits ,
223+ Till : splits .Till ,
224+ Since : splits .Since ,
225+ },
226+ RuleBasedSegments : * rbs ,
227+ }, err
194228 }
195- if ! errors .Is (err , storage .ErrSinceParamTooOld ) {
229+ if err != nil && ! errors .Is (err , storage .ErrSinceParamTooOld ) {
196230 return nil , fmt .Errorf ("unexpected error fetching feature flag changes from storage: %w" , err )
197231 }
198232
233+ if rbsErr != nil && ! errors .Is (rbsErr , storage .ErrSinceParamTooOld ) {
234+ return nil , fmt .Errorf ("unexpected error fetching rule-based segments changes from storage: %w" , rbsErr )
235+ }
236+
199237 // perform a fetch to the BE using the supplied `since`, have the storage process it's response &, retry
200238 // TODO(mredolatti): implement basic collapsing here to avoid flooding the BE with requests
201- fetchOptions := service .MakeFlagRequestParams ().WithSpecVersion (common .StringRef (c .specVersion )).WithChangeNumber (since ).WithFlagSetsFilter (strings .Join (sets , "," )) // at this point the sets have been sanitized & sorted
239+ fetchOptions := service .MakeFlagRequestParams ().WithSpecVersion (common .StringRef (c .specVersion )).WithChangeNumber (since ).WithChangeNumberRB ( rbsince ). WithFlagSetsFilter (strings .Join (sets , "," )) // at this point the sets have been sanitized & sorted
202240 ruleChanges , err := c .fetcher .Fetch (fetchOptions )
203241 if err != nil {
204242 return nil , err
205243 }
206- return & dtos.SplitChangesDTO {
207- Since : ruleChanges .FFSince (),
208- Till : ruleChanges .FFTill (),
209- Splits : ruleChanges .FeatureFlags (),
244+ return & dtos.RuleChangesDTO {
245+ FeatureFlags : dtos.FeatureFlagsDTO {
246+ Splits : ruleChanges .FeatureFlags (),
247+ Till : ruleChanges .FFTill (),
248+ Since : ruleChanges .FFSince (),
249+ },
250+ RuleBasedSegments : dtos.RuleBasedSegmentsDTO {
251+ RuleBasedSegments : ruleChanges .RuleBasedSegments (),
252+ Till : ruleChanges .RBTill (),
253+ Since : ruleChanges .RBSince (),
254+ },
210255 }, nil
211256}
212257
0 commit comments