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..2cbc6859 100644 --- a/constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java +++ b/constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java @@ -2955,10 +2955,53 @@ 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 * - * @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 */ @@ -3044,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 new file mode 100644 index 00000000..58df2a66 --- /dev/null +++ b/constructorio-client/src/main/java/io/constructor/client/FacetOptionConfigurationsRequest.java @@ -0,0 +1,91 @@ +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 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) { + 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 list of 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 list of facet option configurations + */ + public List getFacetOptionConfigurations() { + return facetOptionConfigurations; + } + + /** + * @param facetOptionConfigurations the list of 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..52314bf2 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,8 @@ 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 +143,52 @@ public void testCreateFacetOptionConfiguration() throws Exception { addFacetOptionToCleanupArray(facetName, "test-option"); } + @Test + public void testCreateFacetOptionConfigurations() throws Exception { + String facetName = "testFacet2"; + constructor.createFacetConfiguration( + new FacetConfigurationRequest( + createFacetConfigurationObject(facetName, PRODUCTS_SECTION), + PRODUCTS_SECTION)); + addFacetToCleanupArray(facetName); + + // Create facet option configurations + 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 configurations + String response = + constructor.createOrUpdateFacetOptionConfigurations( + new FacetOptionConfigurationsRequest( + configurations, facetName, 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);