77import com .flagsmith .flagengine .EvaluationContext ;
88import com .flagsmith .flagengine .FeatureContext ;
99import com .flagsmith .flagengine .FeatureValue ;
10+ import com .flagsmith .flagengine .FlagResult ;
1011import com .flagsmith .flagengine .IdentityContext ;
1112import com .flagsmith .flagengine .SegmentCondition ;
1213import com .flagsmith .flagengine .SegmentContext ;
1314import com .flagsmith .flagengine .SegmentRule ;
1415import com .flagsmith .flagengine .Segments ;
1516import com .flagsmith .flagengine .Traits ;
1617import com .flagsmith .flagengine .segments .constants .SegmentConditions ;
18+ import com .flagsmith .models .FeatureMetadata ;
19+ import com .flagsmith .models .Flag ;
1720import com .flagsmith .models .SegmentMetadata ;
1821import com .flagsmith .models .environments .EnvironmentModel ;
1922import com .flagsmith .models .features .FeatureModel ;
3740 * <p>Utility class for mapping JSON data to flag engine context objects.
3841 */
3942public class EngineMappers {
43+ /**
44+ * Maps FlagResult to Flag.
45+ * Returns null if metadata is missing or invalid.
46+ *
47+ * @param flagResult the flag result
48+ * @return the mapped flag or null
49+ */
50+ public static Flag mapFlagResultToFlag (
51+ FlagResult flagResult
52+ ) {
53+ FeatureMetadata metadata ;
54+
55+ metadata = MapperFactory .getMapper ()
56+ .convertValue (flagResult .getMetadata (), FeatureMetadata .class );
57+
58+ if (metadata == null || metadata .getFlagsmithId () == null ) {
59+ return null ;
60+ }
61+
62+ Flag flag = new Flag ();
63+ flag .setFeatureId (metadata .getFlagsmithId ());
64+ flag .setFeatureName (flagResult .getName ());
65+ flag .setValue (flagResult .getValue ());
66+ flag .setEnabled (flagResult .getEnabled ());
67+ return flag ;
68+ }
69+
4070 /**
4171 * Maps context and identity data to evaluation context.
4272 *
@@ -178,7 +208,8 @@ private static Map<String, SegmentContext> mapIdentityOverridesToSegments(
178208 .withName (feature .getName ())
179209 .withEnabled (featureState .getEnabled ())
180210 .withValue (featureState .getValue ())
181- .withPriority (EngineConstants .STRONGEST_PRIORITY );
211+ .withPriority (EngineConstants .STRONGEST_PRIORITY )
212+ .withMetadata (mapFeatureStateToFeatureMetadata (featureState ));
182213 overridesKey .add (featureContext );
183214 }
184215
@@ -332,7 +363,8 @@ private static FeatureContext mapFeatureStateToFeatureContext(FeatureStateModel
332363 .withFeatureKey (String .valueOf (featureState .getFeature ().getId ()))
333364 .withName (featureState .getFeature ().getName ())
334365 .withEnabled (featureState .getEnabled ())
335- .withValue (featureState .getValue ());
366+ .withValue (featureState .getValue ())
367+ .withMetadata (mapFeatureStateToFeatureMetadata (featureState ));
336368
337369 // Handle multivariate feature state values
338370 List <FeatureValue > variants = new ArrayList <>();
@@ -358,6 +390,15 @@ private static FeatureContext mapFeatureStateToFeatureContext(FeatureStateModel
358390 return featureContext ;
359391 }
360392
393+ private static Map <String , Object > mapFeatureStateToFeatureMetadata (
394+ FeatureStateModel featureState ) {
395+ FeatureMetadata metadata = new FeatureMetadata ();
396+ metadata .setFlagsmithId (featureState .getFeature ().getId ());
397+ return MapperFactory .getMapper ().convertValue (metadata ,
398+ new com .fasterxml .jackson .core .type .TypeReference <Map <String , Object >>() {
399+ });
400+ }
401+
361402 /**
362403 * Maps a segment to segment context.
363404 *
0 commit comments