@@ -22,7 +22,8 @@ type Client struct {
2222 apiKey string
2323 config config
2424
25- environment atomic.Value
25+ environment atomic.Value
26+ identitiesWithOverrides atomic.Value
2627
2728 analyticsProcessor * AnalyticsProcessor
2829 defaultFlagHandler func (string ) (Flag , error )
@@ -138,7 +139,7 @@ func (c *Client) GetIdentityFlags(ctx context.Context, identifier string, traits
138139// Returns an array of segments that the given identity is part of.
139140func (c * Client ) GetIdentitySegments (identifier string , traits []* Trait ) ([]* segments.SegmentModel , error ) {
140141 if env , ok := c .environment .Load ().(* environments.EnvironmentModel ); ok {
141- identity := buildIdentityModel (identifier , env .APIKey , traits )
142+ identity := c . getIdentityModel (identifier , env .APIKey , traits )
142143 return flagengine .GetIdentitySegments (env , & identity ), nil
143144 }
144145 return nil , & FlagsmithClientError {msg : "flagsmith: Local evaluation required to obtain identity segments" }
@@ -214,7 +215,7 @@ func (c *Client) getIdentityFlagsFromEnvironment(identifier string, traits []*Tr
214215 if ! ok {
215216 return Flags {}, fmt .Errorf ("flagsmith: local environment has not yet been updated" )
216217 }
217- identity := buildIdentityModel (identifier , env .APIKey , traits )
218+ identity := c . getIdentityModel (identifier , env .APIKey , traits )
218219 featureStates := flagengine .GetIdentityFeatureStates (env , & identity )
219220 flags := makeFlagsFromFeatureStates (
220221 featureStates ,
@@ -276,15 +277,28 @@ func (c *Client) UpdateEnvironment(ctx context.Context) error {
276277 return errors .New (e ["detail" ])
277278 }
278279 c .environment .Store (& env )
280+ identitiesWithOverrides := make (map [string ]identities.IdentityModel )
281+ for _ , id := range env .IdentityOverrides {
282+ identitiesWithOverrides [id .Identifier ] = * id
283+ }
284+ c .identitiesWithOverrides .Store (identitiesWithOverrides )
279285
280286 return nil
281287}
282288
283- func buildIdentityModel (identifier string , apiKey string , traits []* Trait ) identities.IdentityModel {
289+ func ( c * Client ) getIdentityModel (identifier string , apiKey string , traits []* Trait ) identities.IdentityModel {
284290 identityTraits := make ([]* TraitModel , len (traits ))
285291 for i , trait := range traits {
286292 identityTraits [i ] = trait .ToTraitModel ()
287293 }
294+
295+ identitiesWithOverrides , _ := c .identitiesWithOverrides .Load ().(map [string ]identities.IdentityModel )
296+ identity , ok := identitiesWithOverrides [identifier ]
297+ if ok {
298+ identity .IdentityTraits = identityTraits
299+ return identity
300+ }
301+
288302 return identities.IdentityModel {
289303 Identifier : identifier ,
290304 IdentityTraits : identityTraits ,
0 commit comments