Skip to content

Commit 82f9e84

Browse files
committed
Add support for upsert and retrieve for analytics rules
1 parent 60260f3 commit 82f9e84

16 files changed

+325
-234
lines changed

dist/typesense.js

Lines changed: 220 additions & 206 deletions
Large diffs are not rendered by default.

dist/typesense.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/typesense.min.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

doc/examples/server/searchSuggestions.js renamed to doc/examples/server/searchSuggestions.mjs

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
/*
2-
These examples walk you through key management operations.
2+
These examples walk you through how to use search suggestions in Typesense.
33
44
See clientInitalization.js for quick instructions on starting the Typesense server.
55
*/
6-
require("@babel/register");
6+
import "@babel/register";
7+
/* eslint-disable @typescript-eslint/no-var-requires */
8+
import Typesense from "../../../lib/Typesense.js";
79

8-
// eslint-disable-next-line @typescript-eslint/no-var-requires
9-
const Typesense = require("../../../lib/Typesense");
10+
// import axios from "axios";
11+
// import curlirize from "axios-curlirize";
1012

1113
const masterApiKey = "xyz";
1214

@@ -21,6 +23,8 @@ const typesense = new Typesense.Client({
2123
apiKey: masterApiKey,
2224
});
2325

26+
// curlirize(axios);
27+
2428
async function runExample() {
2529
await deleteDataFromPreviousRuns();
2630
try {
@@ -45,9 +49,8 @@ async function runExample() {
4549
],
4650
});
4751

48-
// Create a rule to capture top queries
49-
result = await typesense.analytics.rules().create({
50-
name: "search_suggestions",
52+
// Upsert a rule to capture top queries
53+
result = await typesense.analytics.rules().upsert("search_suggestions", {
5154
type: "popular_queries",
5255
params: {
5356
source: { collections: ["products"] },
@@ -57,10 +60,27 @@ async function runExample() {
5760
});
5861
console.dir(result);
5962

63+
// This will result in any search terms sent to the `products` to be logged in the `products_top_queries` along with a count of how many times it was searched for.
64+
6065
// Retrieve all rules
6166
result = await typesense.analytics.rules().retrieve();
6267
console.dir(result);
6368

69+
// Update the limit in the rule
70+
result = await typesense.analytics.rules().upsert("search_suggestions", {
71+
type: "popular_queries",
72+
params: {
73+
source: { collections: ["products"] },
74+
destination: { collection: "products_top_queries" },
75+
},
76+
limit: 10,
77+
});
78+
console.dir(result);
79+
80+
// Retrieve a single rule
81+
result = await typesense.analytics.rules("search_suggestions").retrieve();
82+
console.dir(result);
83+
6484
// Delete rule
6585
result = await typesense.analytics.rules("search_suggestions").delete();
6686
console.dir(result);

lib/Typesense/AnalyticsRule.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import ApiCall from "./ApiCall";
22
export interface AnalyticsRuleCreateSchema {
3-
name: string;
43
type: "popular_queries";
54
params: {
65
source: {
@@ -22,6 +21,7 @@ export default class AnalyticsRule {
2221
private name;
2322
private apiCall;
2423
constructor(name: string, apiCall: ApiCall);
24+
retrieve(): Promise<AnalyticsRuleSchema>;
2525
delete(): Promise<AnalyticsRuleDeleteSchema>;
2626
private endpointPath;
2727
}

lib/Typesense/AnalyticsRule.js

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/Typesense/AnalyticsRule.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/Typesense/AnalyticsRules.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ export interface AnalyticsRulesRetrieveSchema {
66
export default class AnalyticsRules {
77
private readonly apiCall;
88
constructor(apiCall: ApiCall);
9-
create(schema: AnalyticsRuleCreateSchema): Promise<AnalyticsRuleCreateSchema>;
9+
upsert(name: string, params: AnalyticsRuleCreateSchema): Promise<AnalyticsRuleCreateSchema>;
1010
retrieve(): Promise<AnalyticsRulesRetrieveSchema>;
11+
private endpointPath;
1112
static get RESOURCEPATH(): string;
1213
}

lib/Typesense/AnalyticsRules.js

Lines changed: 6 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/Typesense/AnalyticsRules.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package-lock.json

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"@types/node": "^17.0.21",
5252
"@typescript-eslint/eslint-plugin": "^5.61.0",
5353
"@typescript-eslint/parser": "^5.61.0",
54+
"axios-curlirize": "^2.0.0",
5455
"axios-mock-adapter": "^1.20.0",
5556
"babel-plugin-istanbul": "^6.1.1",
5657
"babelify": "^10.0.0",

src/Typesense/AnalyticsRule.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import ApiCall from "./ApiCall";
22
import AnalyticsRules from "./AnalyticsRules";
33

44
export interface AnalyticsRuleCreateSchema {
5-
name: string;
65
type: "popular_queries";
76
params: {
87
source: {
@@ -26,6 +25,10 @@ export interface AnalyticsRuleSchema extends AnalyticsRuleCreateSchema {
2625
export default class AnalyticsRule {
2726
constructor(private name: string, private apiCall: ApiCall) {}
2827

28+
async retrieve(): Promise<AnalyticsRuleSchema> {
29+
return this.apiCall.get<AnalyticsRuleSchema>(this.endpointPath());
30+
}
31+
2932
async delete(): Promise<AnalyticsRuleDeleteSchema> {
3033
return this.apiCall.delete<AnalyticsRuleDeleteSchema>(this.endpointPath());
3134
}

src/Typesense/AnalyticsRules.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,24 @@ export default class AnalyticsRules {
1515
this.apiCall = apiCall;
1616
}
1717

18-
async create(
19-
schema: AnalyticsRuleCreateSchema
18+
async upsert(
19+
name: string,
20+
params: AnalyticsRuleCreateSchema
2021
): Promise<AnalyticsRuleCreateSchema> {
21-
return this.apiCall.post<AnalyticsRuleCreateSchema>(RESOURCEPATH, schema);
22+
return this.apiCall.put<AnalyticsRuleCreateSchema>(
23+
this.endpointPath(name),
24+
params
25+
);
2226
}
2327

2428
async retrieve(): Promise<AnalyticsRulesRetrieveSchema> {
25-
return this.apiCall.get<AnalyticsRulesRetrieveSchema>(RESOURCEPATH);
29+
return this.apiCall.get<AnalyticsRulesRetrieveSchema>(this.endpointPath());
30+
}
31+
32+
private endpointPath(operation?: string): string {
33+
return `${AnalyticsRules.RESOURCEPATH}${
34+
operation === undefined ? "" : "/" + operation
35+
}`;
2636
}
2737

2838
static get RESOURCEPATH() {

test/Typesense/AnalyticsRule.spec.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,31 @@ describe("AnalyticsRule", function () {
3030
mockAxios = new MockAxiosAdapter(axios);
3131
});
3232

33+
describe(".retrieve", function () {
34+
it("retrieves the rule", function (done) {
35+
mockAxios
36+
.onGet(
37+
apiCall.uriFor(
38+
"/analytics/rules/123",
39+
typesense.configuration.nodes[0]
40+
),
41+
null,
42+
{
43+
Accept: "application/json, text/plain, */*",
44+
"Content-Type": "application/json",
45+
"X-TYPESENSE-API-KEY": typesense.configuration.apiKey,
46+
}
47+
)
48+
.reply(200, "{}", { "content-type": "application/json" });
49+
50+
// console.log(mockAxios.handlers)
51+
52+
let returnData = analyticsRule.retrieve();
53+
54+
expect(returnData).to.eventually.deep.equal({}).notify(done);
55+
});
56+
});
57+
3358
describe(".delete", function () {
3459
it("deletes a key", function (done) {
3560
mockAxios

test/Typesense/AnalyticsRules.spec.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,15 @@ describe("AnalyticsRules", function () {
3030
mockAxios = new MockAxiosAdapter(axios);
3131
});
3232

33-
describe(".create", function () {
34-
it("creates an analytics rule", function (done) {
33+
describe(".upsert", function () {
34+
it("upserts an analytics rule", function (done) {
3535
mockAxios
36-
.onPost(
37-
apiCall.uriFor("/analytics/rules", typesense.configuration.nodes[0]),
36+
.onPut(
37+
apiCall.uriFor(
38+
"/analytics/rules/search_suggestions",
39+
typesense.configuration.nodes[0]
40+
),
3841
{
39-
name: "search_suggestions",
4042
type: "popular_queries",
4143
params: {
4244
source: { collections: ["products"] },
@@ -52,8 +54,7 @@ describe("AnalyticsRules", function () {
5254
)
5355
.reply(201, "{}", { "content-type": "application/json" });
5456

55-
let returnData = analyticsRules.create({
56-
name: "search_suggestions",
57+
let returnData = analyticsRules.upsert("search_suggestions", {
5758
type: "popular_queries",
5859
params: {
5960
source: { collections: ["products"] },

0 commit comments

Comments
 (0)