From 64d5f42f724c57335f4489a8ffdf8f9e5ee565e4 Mon Sep 17 00:00:00 2001 From: Fanis Tharropoulos Date: Fri, 1 Nov 2024 14:42:02 +0200 Subject: [PATCH] feat(analytics): add Analytics events API support Implements analytics events tracking capabilities to complement existing rules functionality. Adds ability to create custom analytics events with type, name and data fields. Changes include: - New AnalyticsEvents class for event operations - Integration with Analytics class - Test coverage with sample search event creation - Helper updates for events in analytics rules - Documentation updates on how to use new feature feat(analytics): add AnalyticsEvents class test(analytics): add AnalyticsEventsTest feat(analytics): integrate events into Analytics class refactor(helper): update createTestAnalyticsRule for events docs(analytics): add documenation on proper analytics rules usage --- README.md | 14 ++++++ .../java/org/typesense/api/Analytics.java | 6 +++ .../org/typesense/api/AnalyticsEvents.java | 18 +++++++ .../typesense/api/AnalyticsEventsTest.java | 47 +++++++++++++++++++ src/test/java/org/typesense/api/Helper.java | 7 ++- 5 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/typesense/api/AnalyticsEvents.java create mode 100644 src/test/java/org/typesense/api/AnalyticsEventsTest.java diff --git a/README.md b/README.md index a447138..c917dd4 100644 --- a/README.md +++ b/README.md @@ -192,6 +192,20 @@ AnalyticsRuleSchema rule = client.analytics().rules("failed-searches").retrieve( client.analytics().rules("failed-searches").delete(); ``` +#### Create an analytics event +```java +AnalyticsEventCreateSchema analyticsEvent = new AnalyticsEventCreateSchema() + .type("conversion") + .name("purchase_made") + .data(Map.of( + "product_id", "123", + "user_id", "user_456", + "amount", "99.99" + )); + +client.analytics().events().create(analyticsEvent); +``` + ### Create an API key ```java ApiKeySchema apiKeySchema = new ApiKeySchema(); diff --git a/src/main/java/org/typesense/api/Analytics.java b/src/main/java/org/typesense/api/Analytics.java index 6e26ab9..4503160 100644 --- a/src/main/java/org/typesense/api/Analytics.java +++ b/src/main/java/org/typesense/api/Analytics.java @@ -7,11 +7,13 @@ public class Analytics { private final ApiCall apiCall; private final AnalyticsRules rules; private final Map individualRules; + private final AnalyticsEvents events; public Analytics(ApiCall apiCall) { this.apiCall = apiCall; this.rules = new AnalyticsRules(this.apiCall); this.individualRules = new HashMap<>(); + this.events = new AnalyticsEvents(this.apiCall); } public AnalyticsRules rules() { @@ -28,4 +30,8 @@ public AnalyticsRule rules(String ruleId) { retVal = this.individualRules.get(ruleId); return retVal; } + + public AnalyticsEvents events() { + return this.events; + } } diff --git a/src/main/java/org/typesense/api/AnalyticsEvents.java b/src/main/java/org/typesense/api/AnalyticsEvents.java new file mode 100644 index 0000000..4889aa3 --- /dev/null +++ b/src/main/java/org/typesense/api/AnalyticsEvents.java @@ -0,0 +1,18 @@ +package org.typesense.api; + +import org.typesense.model.AnalyticsEventCreateResponse; +import org.typesense.model.AnalyticsEventCreateSchema; + + +public class AnalyticsEvents { + private final ApiCall apiCall; + public final static String RESOURCE_PATH = "/analytics/events"; + + public AnalyticsEvents(ApiCall apiCall) { + this.apiCall = apiCall; + } + + public AnalyticsEventCreateResponse create(AnalyticsEventCreateSchema event) throws Exception { + return this.apiCall.post(RESOURCE_PATH, event, null, AnalyticsEventCreateResponse.class); + } +} diff --git a/src/test/java/org/typesense/api/AnalyticsEventsTest.java b/src/test/java/org/typesense/api/AnalyticsEventsTest.java new file mode 100644 index 0000000..3777bf3 --- /dev/null +++ b/src/test/java/org/typesense/api/AnalyticsEventsTest.java @@ -0,0 +1,47 @@ +package org.typesense.api; + +import java.util.Map; + +import org.junit.jupiter.api.AfterEach; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.typesense.model.AnalyticsEventCreateResponse; +import org.typesense.model.AnalyticsEventCreateSchema; + +public class AnalyticsEventsTest { + + private Client client; + private Helper helper; + + @BeforeEach + void setUp() throws Exception { + helper = new Helper(); + client = helper.getClient(); + helper.teardown(); + helper.createTestCollection(); + helper.createTestQueryCollection(); + helper.createTestAnalyticsRule(); + } + + @AfterEach + void tearDown() throws Exception { + helper.teardown(); + } + + @Test + void testCreate() throws Exception { + AnalyticsEventCreateSchema analyticsEvent = new AnalyticsEventCreateSchema() + .type("search") + .name("products_search_event") + .data(Map.of( + "q", "running shoes", + "user_id", "1234")); + + AnalyticsEventCreateResponse result = this.client.analytics().events().create(analyticsEvent); + assertNotNull(result); + assertEquals(true, result.isOk()); + + } +} diff --git a/src/test/java/org/typesense/api/Helper.java b/src/test/java/org/typesense/api/Helper.java index eef4fb0..33781ea 100644 --- a/src/test/java/org/typesense/api/Helper.java +++ b/src/test/java/org/typesense/api/Helper.java @@ -9,6 +9,7 @@ import org.typesense.model.AnalyticsRuleParameters; import org.typesense.model.AnalyticsRuleParametersDestination; import org.typesense.model.AnalyticsRuleParametersSource; +import org.typesense.model.AnalyticsRuleParametersSourceEvents; import org.typesense.model.AnalyticsRuleSchema; import org.typesense.model.AnalyticsRuleUpsertSchema; import org.typesense.model.ApiKey; @@ -113,7 +114,11 @@ public void createTestAnalyticsRule() throws Exception { .type(AnalyticsRuleUpsertSchema.TypeEnum.NOHITS_QUERIES) .params(new AnalyticsRuleParameters() .source(new AnalyticsRuleParametersSource() - .collections(Arrays.asList("books"))) + .collections(Arrays.asList("books")) + .events(Arrays.asList( + new AnalyticsRuleParametersSourceEvents() + .type("search") + .name("products_search_event")))) .destination(new AnalyticsRuleParametersDestination() .collection("queries")));