diff --git a/src/main/java/com/devcycle/sdk/server/common/model/EvalHooksRunner.java b/src/main/java/com/devcycle/sdk/server/common/model/EvalHooksRunner.java index d7342782..a0febf84 100644 --- a/src/main/java/com/devcycle/sdk/server/common/model/EvalHooksRunner.java +++ b/src/main/java/com/devcycle/sdk/server/common/model/EvalHooksRunner.java @@ -1,13 +1,13 @@ package com.devcycle.sdk.server.common.model; -import com.devcycle.sdk.server.common.exception.AfterHookError; -import com.devcycle.sdk.server.common.exception.BeforeHookError; -import com.devcycle.sdk.server.common.logging.DevCycleLogger; - import java.util.ArrayList; import java.util.List; import java.util.Optional; +import com.devcycle.sdk.server.common.exception.AfterHookError; +import com.devcycle.sdk.server.common.exception.BeforeHookError; +import com.devcycle.sdk.server.common.logging.DevCycleLogger; + /** * A class that manages evaluation hooks for the DevCycle SDK. * Provides functionality to add and clear hooks, storing them in an array. diff --git a/src/main/java/com/devcycle/sdk/server/common/model/PlatformData.java b/src/main/java/com/devcycle/sdk/server/common/model/PlatformData.java index 3c2e4214..8930cee4 100644 --- a/src/main/java/com/devcycle/sdk/server/common/model/PlatformData.java +++ b/src/main/java/com/devcycle/sdk/server/common/model/PlatformData.java @@ -1,18 +1,19 @@ package com.devcycle.sdk.server.common.model; +import java.net.InetAddress; +import java.net.UnknownHostException; + import com.devcycle.sdk.server.common.logging.DevCycleLogger; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonValue; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; + import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Data; -import java.net.InetAddress; -import java.net.UnknownHostException; - @Data @Builder @JsonInclude(JsonInclude.Include.NON_NULL) @@ -34,6 +35,7 @@ public class PlatformData { private String sdkVersion = "2.8.1"; @Schema(description = "DevCycle SDK Platform") + @Builder.Default private String sdkPlatform = null; @Schema(description = "Hostname where the SDK is running") diff --git a/src/main/java/com/devcycle/sdk/server/common/model/Variable.java b/src/main/java/com/devcycle/sdk/server/common/model/Variable.java index a0dabc64..660e6238 100755 --- a/src/main/java/com/devcycle/sdk/server/common/model/Variable.java +++ b/src/main/java/com/devcycle/sdk/server/common/model/Variable.java @@ -43,6 +43,10 @@ public class Variable { @JsonIgnore private final String evalReason = null; + @Schema(description = "Feature ID") + @JsonProperty("_feature") + private String featureId; + public enum TypeEnum { STRING("String"), BOOLEAN("Boolean"), diff --git a/src/main/java/com/devcycle/sdk/server/local/utils/ProtobufUtils.java b/src/main/java/com/devcycle/sdk/server/local/utils/ProtobufUtils.java index 7eb3457f..01573033 100644 --- a/src/main/java/com/devcycle/sdk/server/local/utils/ProtobufUtils.java +++ b/src/main/java/com/devcycle/sdk/server/local/utils/ProtobufUtils.java @@ -60,6 +60,7 @@ public static Variable createVariable(SDKVariable_PB sdkVariable, T defau .defaultValue(defaultValue) .isDefaulted(false) .eval(convertToEvalReason(sdkVariable.getEval())) + .featureId(sdkVariable.getFeature().getValue()) .build(); break; case String: @@ -70,6 +71,7 @@ public static Variable createVariable(SDKVariable_PB sdkVariable, T defau .defaultValue(defaultValue) .isDefaulted(false) .eval(convertToEvalReason(sdkVariable.getEval())) + .featureId(sdkVariable.getFeature().getValue()) .build(); break; case Number: @@ -80,6 +82,7 @@ public static Variable createVariable(SDKVariable_PB sdkVariable, T defau .defaultValue(defaultValue) .isDefaulted(false) .eval(convertToEvalReason(sdkVariable.getEval())) + .featureId(sdkVariable.getFeature().getValue()) .build(); break; case JSON: @@ -93,6 +96,7 @@ public static Variable createVariable(SDKVariable_PB sdkVariable, T defau .defaultValue(defaultValue) .isDefaulted(false) .eval(convertToEvalReason(sdkVariable.getEval())) + .featureId(sdkVariable.getFeature().getValue()) .build(); break; default: diff --git a/src/test/java/com/devcycle/sdk/server/local/DevCycleLocalClientTest.java b/src/test/java/com/devcycle/sdk/server/local/DevCycleLocalClientTest.java index 4b209d1a..c630a9c0 100644 --- a/src/test/java/com/devcycle/sdk/server/local/DevCycleLocalClientTest.java +++ b/src/test/java/com/devcycle/sdk/server/local/DevCycleLocalClientTest.java @@ -157,6 +157,7 @@ public void variableTest() { var = client.variable(user, "string-var", "default string"); Assert.assertNotNull(var); Assert.assertEquals("variationOn", var.getValue()); + Assert.assertEquals("62fbf6566f1ba302829f9e32", var.getFeatureId()); EvalReason varEval = var.getEval(); Assert.assertEquals("TARGETING_MATCH", varEval.getReason()); @@ -173,6 +174,7 @@ public void variableBooleanValueTest() { Assert.assertNotNull(var); Assert.assertFalse(var.getIsDefaulted()); Assert.assertEquals(true, var.getValue()); + Assert.assertEquals("62fbf6566f1ba302829f9e32", var.getFeatureId()); EvalReason varEval = var.getEval(); Assert.assertEquals("TARGETING_MATCH", varEval.getReason()); @@ -188,6 +190,7 @@ public void variableNumberValueTest() { Assert.assertNotNull(var); Assert.assertFalse(var.getIsDefaulted()); Assert.assertEquals(12345.0, var.getValue().doubleValue(), 0.0); + Assert.assertEquals("62fbf6566f1ba302829f9e32", var.getFeatureId()); EvalReason varEval = var.getEval(); Assert.assertEquals("TARGETING_MATCH", varEval.getReason()); @@ -213,6 +216,7 @@ public void variableJsonValueTest() { Assert.assertEquals("This variation is on", variableData.get("displayText")); Assert.assertEquals(true, variableData.get("showDialog")); Assert.assertEquals(100, variableData.get("maxUsers")); + Assert.assertEquals("62fbf6566f1ba302829f9e32", var.getFeatureId()); EvalReason varEval = var.getEval(); Assert.assertEquals("TARGETING_MATCH", varEval.getReason()); @@ -253,6 +257,7 @@ public void variableTestWithCustomData() { Assert.assertNotNull(var); Assert.assertFalse(var.getIsDefaulted()); Assert.assertEquals("variationOn", var.getValue()); + Assert.assertEquals("62fbf6566f1ba302829f9e32", var.getFeatureId()); EvalReason varEval = var.getEval(); Assert.assertEquals("TARGETING_MATCH", varEval.getReason()); @@ -275,6 +280,7 @@ public void variableTestBucketingWithCustomData() { Assert.assertNotNull(var); Assert.assertFalse(var.getIsDefaulted()); Assert.assertEquals("↑↑↓↓←→←→BA 🤖", var.getValue()); + Assert.assertEquals("638680d6fcb67b96878d90e6", var.getFeatureId()); EvalReason varEval = var.getEval(); Assert.assertEquals("TARGETING_MATCH", varEval.getReason()); @@ -288,6 +294,7 @@ public void variableTestUnknownVariableKey() { Assert.assertNotNull(var); Assert.assertTrue(var.getIsDefaulted()); Assert.assertEquals(true, var.getValue()); + Assert.assertNull(var.getFeatureId()); EvalReason varEval = var.getEval(); Assert.assertEquals("DEFAULT", varEval.getReason()); @@ -301,6 +308,7 @@ public void variableTestTypeMismatch() { Assert.assertNotNull(var); Assert.assertTrue(var.getIsDefaulted()); Assert.assertEquals(true, var.getValue()); + Assert.assertNull(var.getFeatureId()); EvalReason varEval = var.getEval(); Assert.assertEquals("DEFAULT", varEval.getReason()); @@ -722,6 +730,7 @@ public void onFinally(HookContext ctx, Optional> variab .isDefaulted(false) .defaultValue("default string") .eval(new EvalReason("TARGETING_MATCH", "All Users", "63125321d31c601f992288bc")) + .featureId("62fbf6566f1ba302829f9e32") .build(); Variable result = client.variable(user, "string-var", "default string"); @@ -993,6 +1002,7 @@ public void error(HookContext ctx, Throwable e) { .isDefaulted(false) .defaultValue("default string") .eval(new EvalReason("TARGETING_MATCH", "All Users", "63125321d31c601f992288bc")) + .featureId("62fbf6566f1ba302829f9e32") .build(); Variable result = client.variable(user, "string-var", "default string");