1616import com .flagsmith .interfaces .FlagsmithSdk ;
1717import com .flagsmith .models .BaseFlag ;
1818import com .flagsmith .models .Flags ;
19+ import com .flagsmith .models .SdkTraitModel ;
1920import com .flagsmith .models .Segment ;
2021import com .flagsmith .threads .PollingManager ;
22+ import com .flagsmith .utils .ModelUtils ;
23+ import java .util .ArrayList ;
2124import java .util .HashMap ;
2225import java .util .List ;
2326import java .util .Map ;
@@ -78,6 +81,11 @@ public void updateEnvironment() {
7881
7982 /**
8083 * Get all the default for flags for the current environment.
84+ * <<<<<<< HEAD
85+ * =======
86+ *
87+ * @return environment flags
88+ * >>>>>>> a7a9291 (feat: Support transient identities and traits)
8189 */
8290 public Flags getEnvironmentFlags () throws FlagsmithClientError {
8391 if (getShouldUseEnvironmentDocument ()) {
@@ -88,12 +96,13 @@ public Flags getEnvironmentFlags() throws FlagsmithClientError {
8896 }
8997
9098 /**
91- * Get all the flags for the current environment for a given identity. Will also
92- * upsert all traits to the Flagsmith API for future evaluations. Providing a
93- * trait with a value of None will remove the trait from the identity if it
94- * exists.
99+ * Get all the flags for the current environment for a given identity.
95100 *
96101 * @param identifier identifier string
102+ * <<<<<<< HEAD
103+ * =======
104+ * @return result of flag evaluation for given identity
105+ * >>>>>>> a7a9291 (feat: Support transient identities and traits)
97106 */
98107 public Flags getIdentityFlags (String identifier )
99108 throws FlagsmithClientError {
@@ -102,20 +111,58 @@ public Flags getIdentityFlags(String identifier)
102111
103112 /**
104113 * Get all the flags for the current environment for a given identity. Will also
105- * upsert all traits to the Flagsmith API for future evaluations. Providing a
106- * trait with a value of None will remove the trait from the identity if it
114+ * upsert traits to the Flagsmith API for future evaluations.
115+ *
116+ * <p>
117+ * A trait with a value of null will remove the trait from the identity if it
107118 * exists.
119+ * </p>
120+ * <p>
121+ * To specify a transient trait, use the TraitConfig class with isTransient set
122+ * to true as the trait value.
123+ * </p>
108124 *
125+ * @see com.flagsmith.models.TraitConfig
126+ *
109127 * @param identifier identifier string
110- * @param traits list of key value traits
128+ * @param traits a map of trait keys to trait values
111129 */
112130 public Flags getIdentityFlags (String identifier , Map <String , Object > traits )
113131 throws FlagsmithClientError {
132+ return getIdentityFlags (identifier , traits , false );
133+ }
134+
135+ /**
136+ * Get all the flags for the current environment for a given identity. Will also
137+ * upsert traits to the Flagsmith API for future evaluations, if isTransient set
138+ * to false.
139+ *
140+ * <p>
141+ * A trait with a value of null will remove the trait from the identity if it
142+ * exists.
143+ * </p>
144+ * <p>
145+ * To specify a transient trait, use the TraitConfig class with isTransient set
146+ * to true as the trait value.
147+ * </p>
148+ *
149+ * @see com.flagsmith.models.TraitConfig
150+ *
151+ * @param identifier identifier string
152+ * @param traits a map of trait keys to trait values
153+ * @param isTransient set to true to prevent identity persistence
154+ * @return result of flag evaluation for given identity
155+ */
156+ public Flags getIdentityFlags (String identifier , Map <String , Object > traits , boolean isTransient )
157+ throws FlagsmithClientError {
114158 if (getShouldUseEnvironmentDocument ()) {
115- return getIdentityFlagsFromDocument (identifier , traits );
159+ return getIdentityFlagsFromDocument (
160+ identifier ,
161+ ModelUtils .getTraitModelsFromTraitMap (traits ));
116162 }
117163
118- return getIdentityFlagsFromApi (identifier , traits );
164+ return getIdentityFlagsFromApi (
165+ identifier , ModelUtils .getSdkTraitModelsFromTraitMap (traits ), isTransient );
119166 }
120167
121168 /**
@@ -143,7 +190,10 @@ public List<Segment> getIdentitySegments(String identifier, Map<String, Object>
143190 throw new FlagsmithClientError ("Local evaluation required to obtain identity segments." );
144191 }
145192 IdentityModel identityModel = getIdentityModel (
146- identifier , (traits != null ? traits : new HashMap <>()));
193+ identifier ,
194+ (traits != null
195+ ? ModelUtils .getTraitModelsFromTraitMap (traits )
196+ : new ArrayList <TraitModel >()));
147197 List <SegmentModel > segmentModels = SegmentEvaluator .getIdentitySegments (
148198 environment , identityModel );
149199
@@ -182,7 +232,8 @@ private Flags getEnvironmentFlagsFromDocument() throws FlagsmithClientError {
182232 getConfig ().getFlagsmithFlagDefaults ());
183233 }
184234
185- private Flags getIdentityFlagsFromDocument (String identifier , Map <String , Object > traits )
235+ private Flags getIdentityFlagsFromDocument (
236+ String identifier , List <? extends TraitModel > traitModels )
186237 throws FlagsmithClientError {
187238 if (environment == null ) {
188239 if (getConfig ().getFlagsmithFlagDefaults () == null ) {
@@ -191,7 +242,7 @@ private Flags getIdentityFlagsFromDocument(String identifier, Map<String, Object
191242 return getDefaultFlags ();
192243 }
193244
194- IdentityModel identity = getIdentityModel (identifier , traits );
245+ IdentityModel identity = getIdentityModel (identifier , traitModels );
195246 List <FeatureStateModel > featureStates = Engine .getIdentityFeatureStates (environment , identity );
196247
197248 return Flags .fromFeatureStateModels (
@@ -219,27 +270,21 @@ private Flags getEnvironmentFlagsFromApi() throws FlagsmithApiError {
219270 }
220271 }
221272
222- private Flags getIdentityFlagsFromApi (String identifier , Map <String , Object > traits )
273+ private Flags getIdentityFlagsFromApi (
274+ String identifier , List <SdkTraitModel > traitModels , boolean isTransient )
223275 throws FlagsmithApiError {
224276 try {
225- List <TraitModel > traitsList = traits .entrySet ().stream ().map ((row ) -> {
226- TraitModel trait = new TraitModel ();
227- trait .setTraitValue (row .getValue ());
228- trait .setTraitKey (row .getKey ());
229-
230- return trait ;
231- }).collect (Collectors .toList ());
232-
233277 return flagsmithSdk .identifyUserWithTraits (
234278 identifier ,
235- traitsList ,
279+ traitModels ,
280+ isTransient ,
236281 Boolean .TRUE );
237282 } catch (Exception e ) {
238283 if (getConfig ().getFlagsmithFlagDefaults () != null ) {
239284 return getDefaultFlags ();
240285 } else if (environment != null ) {
241286 try {
242- return getIdentityFlagsFromDocument (identifier , traits );
287+ return getIdentityFlagsFromDocument (identifier , traitModels );
243288 } catch (FlagsmithClientError ce ) {
244289 // Do nothing and fall through to FlagsmithApiError
245290 }
@@ -249,31 +294,23 @@ private Flags getIdentityFlagsFromApi(String identifier, Map<String, Object> tra
249294 }
250295 }
251296
252- private IdentityModel getIdentityModel (String identifier , Map < String , Object > traits )
297+ private IdentityModel getIdentityModel (String identifier , List <? extends TraitModel > traitModels )
253298 throws FlagsmithClientError {
254299 if (environment == null ) {
255300 throw new FlagsmithClientError (
256301 "Unable to build identity model when no local environment present." );
257302 }
258303
259- List <TraitModel > traitsList = traits .entrySet ().stream ().map ((entry ) -> {
260- TraitModel trait = new TraitModel ();
261- trait .setTraitKey (entry .getKey ());
262- trait .setTraitValue (entry .getValue ());
263-
264- return trait ;
265- }).collect (Collectors .toList ());
266-
267304 if (identitiesWithOverridesByIdentifier != null ) {
268305 IdentityModel identityOverride = identitiesWithOverridesByIdentifier .get (identifier );
269306 if (identityOverride != null ) {
270- identityOverride .updateTraits (traitsList );
307+ identityOverride .updateTraits (traitModels );
271308 return identityOverride ;
272309 }
273310 }
274311
275312 IdentityModel identity = new IdentityModel ();
276- identity .setIdentityTraits (traitsList );
313+ identity .setIdentityTraits (traitModels );
277314 identity .setEnvironmentApiKey (environment .getApiKey ());
278315 identity .setIdentifier (identifier );
279316
@@ -289,7 +326,7 @@ private Flags getDefaultFlags() {
289326 private String getEnvironmentUpdateErrorMessage () {
290327 if (this .environment == null ) {
291328 return "Unable to update environment from API. "
292- + "No environment configured - using defaultHandler if configured." ;
329+ + "No environment configured - using defaultHandler if configured." ;
293330 } else {
294331 return "Unable to update environment from API. Continuing to use previous copy." ;
295332 }
@@ -541,7 +578,7 @@ public FlagsmithClient build() {
541578 if (configuration .getOfflineHandler () != null ) {
542579 if (configuration .getFlagsmithFlagDefaults () != null ) {
543580 throw new FlagsmithRuntimeError (
544- "Cannot use both default flag handler and offline handler." );
581+ "Cannot use both default flag handler and offline handler." );
545582 }
546583 client .environment = configuration .getOfflineHandler ().getEnvironment ();
547584 }
0 commit comments