From fe0103dc81734fe9f4f6312acbed636670a2c808 Mon Sep 17 00:00:00 2001 From: Stanley Peng Date: Fri, 11 Apr 2025 00:22:30 -0700 Subject: [PATCH 1/3] add update facet option configuration --- .../io/constructor/client/ConstructorIO.java | 39 +++++++++ .../FacetOptionConfigurationsRequest.java | 86 +++++++++++++++++++ ...tructorIOFacetOptionConfigurationTest.java | 52 ++++++++++- 3 files changed, 174 insertions(+), 3 deletions(-) create mode 100644 constructorio-client/src/main/java/io/constructor/client/FacetOptionConfigurationsRequest.java diff --git a/constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java b/constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java index e7d33561..b17883ab 100644 --- a/constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java +++ b/constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java @@ -2955,6 +2955,45 @@ public String deleteFacetConfiguration(FacetConfigurationRequest facetConfigurat facetConfigurationRequest.getSection()); } + /** + * Creates or Updates facet option configurations + * + * @param facetOptionConfigurationsRequest The facet option configurations request containing the configurations to create or update + * @return returns the created facet option configurations + * @throws ConstructorException if the request is invalid + */ + public String createOrUpdateFacetOptionConfigurations( + FacetOptionConfigurationsRequest facetOptionConfigurationsRequest) + throws ConstructorException { + try { + HttpUrl url = + this.makeUrl( + Arrays.asList( + "v1", + "facets", + facetOptionConfigurationsRequest.getFacetName(), + "options")); + url = + url.newBuilder() + .addQueryParameter( + "section", facetOptionConfigurationsRequest.getSection()) + .build(); + + String params = + new Gson() + .toJson(facetOptionConfigurationsRequest.getFacetOptionConfigurations()); + RequestBody body = + RequestBody.create(params, MediaType.parse("application/json; charset=utf-8")); + Request request = this.makeAuthorizedRequestBuilder().url(url).patch(body).build(); + + Response response = client.newCall(request).execute(); + + return getResponseBody(response); + } catch (Exception exception) { + throw new ConstructorException(exception); + } + } + /** * Creates a facet option configuration * diff --git a/constructorio-client/src/main/java/io/constructor/client/FacetOptionConfigurationsRequest.java b/constructorio-client/src/main/java/io/constructor/client/FacetOptionConfigurationsRequest.java new file mode 100644 index 00000000..e97308f0 --- /dev/null +++ b/constructorio-client/src/main/java/io/constructor/client/FacetOptionConfigurationsRequest.java @@ -0,0 +1,86 @@ + +package io.constructor.client; + +import io.constructor.client.models.FacetOptionConfiguration; +import java.util.List; + +/** Constructor.io Facet Option Configurations Request */ +public class FacetOptionConfigurationsRequest { + private List facetOptionConfigurations; + private String facetName; + private String section; + + /** + * Creates a facet option configurations request (create or update) + * + * @param facetOptionConfigurations the facet option configurations to be created or updated + * @param facetName the name of the facet + * @param section the section to which the facet belongs + */ + public FacetOptionConfigurationsRequest( + List facetOptionConfigurations, String facetName, String section) { + if (facetOptionConfigurations.isEmpty()) { + throw new IllegalArgumentException("facetOptionConfigurations is required"); + } + if (facetName == null || facetName.trim().isEmpty()) { + throw new IllegalArgumentException("facetName is required"); + } + + this.facetOptionConfigurations = facetOptionConfigurations; + this.facetName = facetName; + this.section = section; + } + + /** + * Creates a facet option configurations request (Create or Update) with default section "Products" + * + * @param facetOptionConfigurations the facet option configuration to be created or updated + * @param facetName the name of the facet + */ + public FacetOptionConfigurationsRequest( + List facetOptionConfigurations, String facetName) { + this(facetOptionConfigurations, facetName, "Products"); + } + + /** + * @return the facet option configuration + */ + public List getFacetOptionConfigurations() { + return facetOptionConfigurations; + } + + /** + * @param facetOptionConfigurations the facet option configurations to set + */ + public void setFacetOptionConfigurations(List facetOptionConfigurations) { + this.facetOptionConfigurations = facetOptionConfigurations; + } + + /** + * @return the facet name + */ + public String getFacetName() { + return facetName; + } + + /** + * @param facetName the facet name to set + */ + public void setFacetName(String facetName) { + this.facetName = facetName; + } + + /** + * @return the section + */ + public String getSection() { + return section; + } + + /** + * @param section the section to set + */ + public void setSection(String section) { + this.section = section; + } +} diff --git a/constructorio-client/src/test/java/io/constructor/client/ConstructorIOFacetOptionConfigurationTest.java b/constructorio-client/src/test/java/io/constructor/client/ConstructorIOFacetOptionConfigurationTest.java index 93fc6e4e..b66ddcfa 100644 --- a/constructorio-client/src/test/java/io/constructor/client/ConstructorIOFacetOptionConfigurationTest.java +++ b/constructorio-client/src/test/java/io/constructor/client/ConstructorIOFacetOptionConfigurationTest.java @@ -5,9 +5,10 @@ import com.google.gson.Gson; import io.constructor.client.models.FacetConfiguration; import io.constructor.client.models.FacetOptionConfiguration; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; + +import java.util.*; + +import org.json.JSONArray; import org.json.JSONObject; import org.junit.AfterClass; import org.junit.Before; @@ -144,6 +145,51 @@ public void testCreateFacetOptionConfiguration() throws Exception { addFacetOptionToCleanupArray(facetName, "test-option"); } + @Test + public void testCreateFacetOptionConfigurations() throws Exception { + String facetName = "testFacet"; + constructor.createFacetConfiguration( + new FacetConfigurationRequest( + createFacetConfigurationObject(facetName, PRODUCTS_SECTION), + PRODUCTS_SECTION)); + addFacetToCleanupArray(facetName); + + // Create facet option configuration + FacetOptionConfiguration option = + createFacetOptionConfigurationObject("test-option", "Test Option", 1); + FacetOptionConfiguration option2 = + createFacetOptionConfigurationObject("test-option-2", "Test Option 2", 2); + option.setValueAlias("test-alias"); + option2.setHidden(true); + Map data = new HashMap<>(); + data.put("foo", "bar"); + option.setData(data); + option.setHidden(false); + List configurations = Arrays.asList(option, option2); + + // Create and verify configuration + String response = + constructor.createOrUpdateFacetOptionConfigurations( + new FacetOptionConfigurationsRequest(configurations, "testFacet", PRODUCTS_SECTION)); + JSONArray jsonArr = new JSONArray(response); + JSONObject jsonOption1 = (JSONObject) jsonArr.get(0); + JSONObject jsonOption2 = (JSONObject) jsonArr.get(1); + + assertEquals("test-option", jsonOption1.get("value")); + assertEquals("test-alias", jsonOption1.get("value_alias")); + assertEquals("Test Option", jsonOption1.get("display_name")); + assertEquals(1, jsonOption1.get("position")); + assertEquals(false, jsonOption1.get("hidden")); + assertEquals("bar", jsonOption1.getJSONObject("data").get("foo")); + assertEquals("test-option-2", jsonOption2.get("value")); + assertEquals("Test Option 2", jsonOption2.get("display_name")); + assertEquals(2, jsonOption2.get("position")); + assertEquals(true, jsonOption2.get("hidden")); + + addFacetOptionToCleanupArray(facetName, "test-option"); + addFacetOptionToCleanupArray(facetName, "test-option-2"); + } + @Test(expected = ConstructorException.class) public void testCreateFacetOptionConfigurationWithNullRequest() throws Exception { ConstructorIO constructor = new ConstructorIO(token, apiKey, true, null); From cf944f6cf8201c88c767d0b26409866ba8a58afd Mon Sep 17 00:00:00 2001 From: Stanley Peng Date: Thu, 17 Apr 2025 09:24:50 -0700 Subject: [PATCH 2/3] address comments --- .../io/constructor/client/ConstructorIO.java | 13 ++++++++---- .../FacetOptionConfigurationsRequest.java | 21 ++++++++++++------- ...tructorIOFacetOptionConfigurationTest.java | 9 ++++---- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java b/constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java index b17883ab..2cbc6859 100644 --- a/constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java +++ b/constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java @@ -2958,7 +2958,8 @@ public String deleteFacetConfiguration(FacetConfigurationRequest facetConfigurat /** * Creates or Updates facet option configurations * - * @param facetOptionConfigurationsRequest The facet option configurations request containing the configurations to create or update + * @param facetOptionConfigurationsRequest The facet option configurations request containing + * the configurations to create or update * @return returns the created facet option configurations * @throws ConstructorException if the request is invalid */ @@ -2981,7 +2982,9 @@ public String createOrUpdateFacetOptionConfigurations( String params = new Gson() - .toJson(facetOptionConfigurationsRequest.getFacetOptionConfigurations()); + .toJson( + facetOptionConfigurationsRequest + .getFacetOptionConfigurations()); RequestBody body = RequestBody.create(params, MediaType.parse("application/json; charset=utf-8")); Request request = this.makeAuthorizedRequestBuilder().url(url).patch(body).build(); @@ -2997,7 +3000,8 @@ public String createOrUpdateFacetOptionConfigurations( /** * Creates a facet option configuration * - * @param facetOptionConfigurationRequest The facet option configuration request containing the configuration to create + * @param facetOptionConfigurationRequest The facet option configuration request containing the + * configuration to create * @return returns the created facet option configuration * @throws ConstructorException if the request is invalid */ @@ -3083,7 +3087,8 @@ public String deleteFacetOptionConfiguration(String facetName, String facetOptio /** * Deletes a facet option configuration * - * @param facetOptionConfigurationRequest The facet option configuration request containing the configuration to delete + * @param facetOptionConfigurationRequest The facet option configuration request containing the + * configuration to delete * @return returns the deleted facet option configuration * @throws ConstructorException if the request is invalid */ diff --git a/constructorio-client/src/main/java/io/constructor/client/FacetOptionConfigurationsRequest.java b/constructorio-client/src/main/java/io/constructor/client/FacetOptionConfigurationsRequest.java index e97308f0..58df2a66 100644 --- a/constructorio-client/src/main/java/io/constructor/client/FacetOptionConfigurationsRequest.java +++ b/constructorio-client/src/main/java/io/constructor/client/FacetOptionConfigurationsRequest.java @@ -1,4 +1,3 @@ - package io.constructor.client; import io.constructor.client.models.FacetOptionConfiguration; @@ -13,12 +12,15 @@ public class FacetOptionConfigurationsRequest { /** * Creates a facet option configurations request (create or update) * - * @param facetOptionConfigurations the facet option configurations to be created or updated + * @param facetOptionConfigurations the list of facet option configurations to be created or + * updated * @param facetName the name of the facet * @param section the section to which the facet belongs */ public FacetOptionConfigurationsRequest( - List facetOptionConfigurations, String facetName, String section) { + List facetOptionConfigurations, + String facetName, + String section) { if (facetOptionConfigurations.isEmpty()) { throw new IllegalArgumentException("facetOptionConfigurations is required"); } @@ -32,9 +34,11 @@ public FacetOptionConfigurationsRequest( } /** - * Creates a facet option configurations request (Create or Update) with default section "Products" + * Creates a facet option configurations request (Create or Update) with default section + * "Products" * - * @param facetOptionConfigurations the facet option configuration to be created or updated + * @param facetOptionConfigurations the list of facet option configuration to be created or + * updated * @param facetName the name of the facet */ public FacetOptionConfigurationsRequest( @@ -43,16 +47,17 @@ public FacetOptionConfigurationsRequest( } /** - * @return the facet option configuration + * @return the list of facet option configurations */ public List getFacetOptionConfigurations() { return facetOptionConfigurations; } /** - * @param facetOptionConfigurations the facet option configurations to set + * @param facetOptionConfigurations the list of facet option configurations to set */ - public void setFacetOptionConfigurations(List facetOptionConfigurations) { + public void setFacetOptionConfigurations( + List facetOptionConfigurations) { this.facetOptionConfigurations = facetOptionConfigurations; } diff --git a/constructorio-client/src/test/java/io/constructor/client/ConstructorIOFacetOptionConfigurationTest.java b/constructorio-client/src/test/java/io/constructor/client/ConstructorIOFacetOptionConfigurationTest.java index b66ddcfa..36e01969 100644 --- a/constructorio-client/src/test/java/io/constructor/client/ConstructorIOFacetOptionConfigurationTest.java +++ b/constructorio-client/src/test/java/io/constructor/client/ConstructorIOFacetOptionConfigurationTest.java @@ -5,9 +5,7 @@ import com.google.gson.Gson; import io.constructor.client.models.FacetConfiguration; import io.constructor.client.models.FacetOptionConfiguration; - import java.util.*; - import org.json.JSONArray; import org.json.JSONObject; import org.junit.AfterClass; @@ -154,7 +152,7 @@ public void testCreateFacetOptionConfigurations() throws Exception { PRODUCTS_SECTION)); addFacetToCleanupArray(facetName); - // Create facet option configuration + // Create facet option configurations FacetOptionConfiguration option = createFacetOptionConfigurationObject("test-option", "Test Option", 1); FacetOptionConfiguration option2 = @@ -167,10 +165,11 @@ public void testCreateFacetOptionConfigurations() throws Exception { option.setHidden(false); List configurations = Arrays.asList(option, option2); - // Create and verify configuration + // Create and verify configurations String response = constructor.createOrUpdateFacetOptionConfigurations( - new FacetOptionConfigurationsRequest(configurations, "testFacet", PRODUCTS_SECTION)); + new FacetOptionConfigurationsRequest( + configurations, "testFacet", PRODUCTS_SECTION)); JSONArray jsonArr = new JSONArray(response); JSONObject jsonOption1 = (JSONObject) jsonArr.get(0); JSONObject jsonOption2 = (JSONObject) jsonArr.get(1); From 0c1a57f9fdd3b99f2d082811442383db049d2f2f Mon Sep 17 00:00:00 2001 From: Stanley Peng Date: Thu, 17 Apr 2025 09:33:41 -0700 Subject: [PATCH 3/3] update tests --- .../client/ConstructorIOFacetOptionConfigurationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/constructorio-client/src/test/java/io/constructor/client/ConstructorIOFacetOptionConfigurationTest.java b/constructorio-client/src/test/java/io/constructor/client/ConstructorIOFacetOptionConfigurationTest.java index 36e01969..52314bf2 100644 --- a/constructorio-client/src/test/java/io/constructor/client/ConstructorIOFacetOptionConfigurationTest.java +++ b/constructorio-client/src/test/java/io/constructor/client/ConstructorIOFacetOptionConfigurationTest.java @@ -145,7 +145,7 @@ public void testCreateFacetOptionConfiguration() throws Exception { @Test public void testCreateFacetOptionConfigurations() throws Exception { - String facetName = "testFacet"; + String facetName = "testFacet2"; constructor.createFacetConfiguration( new FacetConfigurationRequest( createFacetConfigurationObject(facetName, PRODUCTS_SECTION), @@ -169,7 +169,7 @@ public void testCreateFacetOptionConfigurations() throws Exception { String response = constructor.createOrUpdateFacetOptionConfigurations( new FacetOptionConfigurationsRequest( - configurations, "testFacet", PRODUCTS_SECTION)); + configurations, facetName, PRODUCTS_SECTION)); JSONArray jsonArr = new JSONArray(response); JSONObject jsonOption1 = (JSONObject) jsonArr.get(0); JSONObject jsonOption2 = (JSONObject) jsonArr.get(1);