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 d432abe0..bc81e873 100644 --- a/constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java +++ b/constructorio-client/src/main/java/io/constructor/client/ConstructorIO.java @@ -1811,6 +1811,17 @@ public String recommendationsAsJSON(RecommendationsRequest req, UserInfo userInf } } + if (StringUtils.isNotBlank(req.getVariationId())) { + if (req.getItemIds() == null || req.getItemIds().size() != 1) { + throw new IllegalArgumentException( + "variationId requires exactly one itemId to be specified"); + } + url = + url.newBuilder() + .addQueryParameter("variation_id", req.getVariationId()) + .build(); + } + if (StringUtils.isNotBlank(req.getTerm())) { url = url.newBuilder().addQueryParameter("term", req.getTerm()).build(); } diff --git a/constructorio-client/src/main/java/io/constructor/client/RecommendationsRequest.java b/constructorio-client/src/main/java/io/constructor/client/RecommendationsRequest.java index ec6b9def..32318941 100644 --- a/constructorio-client/src/main/java/io/constructor/client/RecommendationsRequest.java +++ b/constructorio-client/src/main/java/io/constructor/client/RecommendationsRequest.java @@ -12,6 +12,7 @@ public class RecommendationsRequest { private String term; private int numResults; private List itemIds; + private String variationId; private Map> facets; private String section; private String preFilterExpression; @@ -32,6 +33,7 @@ public RecommendationsRequest(String podId) throws IllegalArgumentException { this.podId = podId; this.numResults = 10; this.itemIds = null; + this.variationId = null; this.term = null; this.section = "Products"; this.variationsMap = null; @@ -97,6 +99,22 @@ public List getItemIds() { return itemIds; } + /** + * @param variationId the variation id to set. Can be used with exactly one item_id specified in + * the request. Applicable for alternative_items, complementary_items, and bundles pod + * types. + */ + public void setVariationId(String variationId) { + this.variationId = variationId; + } + + /** + * @return the variation id + */ + public String getVariationId() { + return variationId; + } + /** * @param section the section to set */ diff --git a/constructorio-client/src/test/java/io/constructor/client/ConstructorIORecommendationsTest.java b/constructorio-client/src/test/java/io/constructor/client/ConstructorIORecommendationsTest.java index 4b019334..c5a0cc46 100644 --- a/constructorio-client/src/test/java/io/constructor/client/ConstructorIORecommendationsTest.java +++ b/constructorio-client/src/test/java/io/constructor/client/ConstructorIORecommendationsTest.java @@ -29,6 +29,43 @@ public void getRecommendationsShouldReturnAResultWithSingleItemId() throws Excep assertTrue("recommendation result id exists", response.getResultId() != null); } + @Test + public void getRecommendationsShouldReturnAResultWithItemIdAndVariationId() throws Exception { + ConstructorIO constructor = new ConstructorIO("", apiKey, true, null); + UserInfo userInfo = new UserInfo(3, "c62a-2a09-faie"); + RecommendationsRequest request = new RecommendationsRequest("item_page_1"); + request.setItemIds(Arrays.asList("power_drill")); + request.setVariationId("power_drill_variation"); + RecommendationsResponse response = constructor.recommendations(request, userInfo); + assertTrue("recommendation results exist", response.getResponse().getResults().size() >= 0); + assertTrue("recommendation result id exists", response.getResultId() != null); + } + + @Test + public void getRecommendationsShouldErrorWithVariationIdAndNoItemIds() throws Exception { + ConstructorIO constructor = new ConstructorIO("", apiKey, true, null); + UserInfo userInfo = new UserInfo(3, "c62a-2a09-faie"); + RecommendationsRequest request = new RecommendationsRequest("item_page_1"); + request.setVariationId("power_drill_variation"); + + thrown.expect(ConstructorException.class); + thrown.expectMessage("variationId requires exactly one itemId to be specified"); + constructor.recommendations(request, userInfo); + } + + @Test + public void getRecommendationsShouldErrorWithVariationIdAndMultipleItemIds() throws Exception { + ConstructorIO constructor = new ConstructorIO("", apiKey, true, null); + UserInfo userInfo = new UserInfo(3, "c62a-2a09-faie"); + RecommendationsRequest request = new RecommendationsRequest("item_page_1"); + request.setItemIds(Arrays.asList("power_drill", "drill")); + request.setVariationId("power_drill_variation"); + + thrown.expect(ConstructorException.class); + thrown.expectMessage("variationId requires exactly one itemId to be specified"); + constructor.recommendations(request, userInfo); + } + @Test public void getRecommendationsShouldReturnAResultWithMultipleItemIds() throws Exception { ConstructorIO constructor = new ConstructorIO("", apiKey, true, null); diff --git a/constructorio-client/src/test/java/io/constructor/client/RecommendationsRequestTest.java b/constructorio-client/src/test/java/io/constructor/client/RecommendationsRequestTest.java index 0dda7e8b..beaf567e 100644 --- a/constructorio-client/src/test/java/io/constructor/client/RecommendationsRequestTest.java +++ b/constructorio-client/src/test/java/io/constructor/client/RecommendationsRequestTest.java @@ -35,6 +35,7 @@ public void newShouldReturnDefaultProperties() throws Exception { assertEquals(request.getPodId(), podId); assertEquals(request.getNumResults(), 10); assertNull(request.getItemIds()); + assertNull(request.getVariationId()); assertNull(request.getTerm()); assertEquals(request.getSection(), "Products"); assertEquals(request.getFacets().size(), 0); @@ -54,6 +55,7 @@ public void settersShouldSet() throws Exception { request.setPodId("zero_results_1"); request.setNumResults(3); request.setItemIds(Arrays.asList("1", "2", "3")); + request.setVariationId("variation-1"); request.setSection("Search Suggestions"); request.setFacets(facets); request.setTerm(term); @@ -62,6 +64,7 @@ public void settersShouldSet() throws Exception { assertEquals(request.getPodId(), "zero_results_1"); assertEquals(request.getNumResults(), 3); + assertEquals(request.getVariationId(), "variation-1"); assertEquals(request.getSection(), "Search Suggestions"); assertEquals(request.getFacets(), facets); assertEquals(request.getTerm(), term);