Skip to content

Commit 48a9868

Browse files
authored
Merge pull request #312 from harisarang/v30-analytics
add: v30 analytics + synonym_set/items APIs
2 parents 912bbdf + 3542ee2 commit 48a9868

22 files changed

+714
-63
lines changed

doc/examples/server/synonymSets.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ async function synonymSetsExample(): Promise<void> {
1717
// Create a synonym set
1818
const synonymSet = await client.synonymSets().upsert({
1919
name: "foobar",
20-
synonyms: [
20+
items: [
2121
{
2222
id: "dummy",
2323
synonyms: ["foo", "bar", "baz"],

src/Typesense/AnalyticsEvent.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export interface AnalyticsEventCreateSchema {
2-
type: string;
2+
type?: string;
33
name: string;
44
data: Record<string, unknown>;
55
}

src/Typesense/AnalyticsEvents.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,19 @@ import { AnalyticsEventCreateSchema } from "./AnalyticsEvent";
33

44
const RESOURCEPATH = "/analytics/events";
55

6+
export interface AnalyticsEventsRetrieveSchema {
7+
events: {
8+
name: string;
9+
event_type: string;
10+
collection: string;
11+
timestamp: number;
12+
user_id: string;
13+
doc_id?: string;
14+
doc_ids?: string[];
15+
query?: string;
16+
}[];
17+
}
18+
619
export default class AnalyticsEvents {
720
constructor(private readonly apiCall: ApiCall) {
821
this.apiCall = apiCall;
@@ -17,6 +30,17 @@ export default class AnalyticsEvents {
1730
);
1831
}
1932

33+
async retrieve(params: {
34+
user_id: string;
35+
name: string;
36+
n: number;
37+
}): Promise<AnalyticsEventsRetrieveSchema> {
38+
return this.apiCall.get<AnalyticsEventsRetrieveSchema>(
39+
this.endpointPath(),
40+
params,
41+
);
42+
}
43+
2044
private endpointPath(operation?: string): string {
2145
return `${AnalyticsEvents.RESOURCEPATH}${
2246
operation === undefined ? "" : "/" + encodeURIComponent(operation)

src/Typesense/AnalyticsRule.ts

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,36 @@ import ApiCall from "./ApiCall";
22
import AnalyticsRules from "./AnalyticsRules";
33

44
export interface AnalyticsRuleCreateSchema {
5-
type: "popular_queries" | "nohits_queries" | "counter" | "log";
6-
params: {
7-
enable_auto_aggregation?: boolean;
8-
source: {
9-
collections: string[];
10-
events?: Array<{
11-
type: string;
12-
weight?: number;
13-
name: string;
14-
}>;
15-
};
5+
name: string;
6+
type: string;
7+
collection: string;
8+
event_type: string;
9+
rule_tag?: string;
10+
params?: {
11+
destination_collection?: string;
12+
limit?: number;
13+
capture_search_requests?: boolean;
14+
meta_fields?: string[];
1615
expand_query?: boolean;
17-
destination?: {
18-
collection: string;
19-
counter_field?: string;
20-
};
16+
counter_field?: string;
17+
weight?: number;
18+
};
19+
}
20+
21+
export interface AnalyticsRuleUpsertSchema {
22+
name?: string;
23+
type?: string;
24+
collection?: string;
25+
event_type?: string;
26+
rule_tag?: string;
27+
params?: {
28+
destination_collection?: string;
2129
limit?: number;
30+
capture_search_requests?: boolean;
31+
meta_fields?: string[];
32+
expand_query?: boolean;
33+
counter_field?: string;
34+
weight?: number;
2235
};
2336
}
2437

src/Typesense/AnalyticsRuleV1.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import ApiCall from "./ApiCall";
2+
import AnalyticsRulesV1 from "./AnalyticsRulesV1";
3+
4+
export interface AnalyticsRuleCreateSchemaV1 {
5+
type: "popular_queries" | "nohits_queries" | "counter" | "log";
6+
params: {
7+
enable_auto_aggregation?: boolean;
8+
source: {
9+
collections: string[];
10+
events?: {
11+
type: string;
12+
weight?: number;
13+
name: string;
14+
}[];
15+
};
16+
expand_query?: boolean;
17+
destination?: {
18+
collection: string;
19+
counter_field?: string;
20+
};
21+
limit?: number;
22+
};
23+
}
24+
25+
export interface AnalyticsRuleDeleteSchemaV1 {
26+
name: string;
27+
}
28+
29+
export interface AnalyticsRuleSchemaV1 extends AnalyticsRuleCreateSchemaV1 {
30+
name: string;
31+
}
32+
33+
export default class AnalyticsRuleV1 {
34+
constructor(
35+
private name: string,
36+
private apiCall: ApiCall,
37+
) {}
38+
39+
async retrieve(): Promise<AnalyticsRuleSchemaV1> {
40+
return this.apiCall.get<AnalyticsRuleSchemaV1>(this.endpointPath());
41+
}
42+
43+
async delete(): Promise<AnalyticsRuleDeleteSchemaV1> {
44+
return this.apiCall.delete<AnalyticsRuleDeleteSchemaV1>(this.endpointPath());
45+
}
46+
47+
private endpointPath(): string {
48+
return `${AnalyticsRulesV1.RESOURCEPATH}/${encodeURIComponent(this.name)}`;
49+
}
50+
}
51+
52+

src/Typesense/AnalyticsRules.ts

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import ApiCall from "./ApiCall";
22
import {
33
AnalyticsRuleCreateSchema,
44
AnalyticsRuleSchema,
5+
AnalyticsRuleUpsertSchema,
56
} from "./AnalyticsRule";
67

78
export interface AnalyticsRulesRetrieveSchema {
@@ -15,18 +16,46 @@ export default class AnalyticsRules {
1516
this.apiCall = apiCall;
1617
}
1718

19+
async create(
20+
params:
21+
| AnalyticsRuleCreateSchema
22+
| AnalyticsRuleCreateSchema[],
23+
): Promise<
24+
| AnalyticsRuleSchema
25+
| (
26+
| AnalyticsRuleSchema
27+
| {
28+
error?: string;
29+
}
30+
)[]
31+
> {
32+
return this.apiCall.post(
33+
this.endpointPath(),
34+
params,
35+
{},
36+
{},
37+
);
38+
}
39+
1840
async upsert(
1941
name: string,
20-
params: AnalyticsRuleCreateSchema
42+
params: AnalyticsRuleUpsertSchema
2143
): Promise<AnalyticsRuleSchema> {
2244
return this.apiCall.put<AnalyticsRuleSchema>(
2345
this.endpointPath(name),
2446
params
2547
);
2648
}
2749

28-
async retrieve(): Promise<AnalyticsRulesRetrieveSchema> {
29-
return this.apiCall.get<AnalyticsRulesRetrieveSchema>(this.endpointPath());
50+
async retrieve(ruleTag?: string): Promise<AnalyticsRulesRetrieveSchema> {
51+
const query: Record<string, string> = {};
52+
if (ruleTag) {
53+
query["rule_tag"] = ruleTag;
54+
}
55+
return this.apiCall.get<AnalyticsRulesRetrieveSchema>(
56+
this.endpointPath(),
57+
query,
58+
);
3059
}
3160

3261
private endpointPath(operation?: string): string {

src/Typesense/AnalyticsRulesV1.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import ApiCall from "./ApiCall";
2+
import {
3+
AnalyticsRuleCreateSchemaV1,
4+
AnalyticsRuleSchemaV1,
5+
} from "./AnalyticsRuleV1";
6+
7+
export interface AnalyticsRulesRetrieveSchemaV1 {
8+
rules: AnalyticsRuleSchemaV1[];
9+
}
10+
11+
const RESOURCEPATH = "/analytics/rules";
12+
13+
export default class AnalyticsRulesV1 {
14+
constructor(private readonly apiCall: ApiCall) {
15+
this.apiCall = apiCall;
16+
}
17+
18+
async upsert(
19+
name: string,
20+
params: AnalyticsRuleCreateSchemaV1
21+
): Promise<AnalyticsRuleSchemaV1> {
22+
return this.apiCall.put<AnalyticsRuleSchemaV1>(
23+
this.endpointPath(name),
24+
params
25+
);
26+
}
27+
28+
async retrieve(): Promise<AnalyticsRulesRetrieveSchemaV1> {
29+
return this.apiCall.get<AnalyticsRulesRetrieveSchemaV1>(this.endpointPath());
30+
}
31+
32+
private endpointPath(operation?: string): string {
33+
return `${AnalyticsRulesV1.RESOURCEPATH}${
34+
operation === undefined ? "" : "/" + encodeURIComponent(operation)
35+
}`;
36+
}
37+
38+
static get RESOURCEPATH() {
39+
return RESOURCEPATH;
40+
}
41+
}
42+
43+

src/Typesense/AnalyticsV1.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import ApiCall from "./ApiCall";
2+
import AnalyticsRulesV1 from "./AnalyticsRulesV1";
3+
import AnalyticsRuleV1 from "./AnalyticsRuleV1";
4+
import AnalyticsEvents from "./AnalyticsEvents";
5+
6+
const RESOURCEPATH = "/analytics";
7+
8+
/**
9+
* @deprecated Deprecated starting with Typesense Server v30. Please migrate to `client.analytics` (new Analytics APIs).
10+
*/
11+
export default class AnalyticsV1 {
12+
private static hasWarnedDeprecation = false;
13+
private readonly _analyticsRules: AnalyticsRulesV1;
14+
private readonly individualAnalyticsRules: Record<string, AnalyticsRuleV1> = {};
15+
private readonly _analyticsEvents: AnalyticsEvents;
16+
17+
constructor(private readonly apiCall: ApiCall) {
18+
this.apiCall = apiCall;
19+
this._analyticsRules = new AnalyticsRulesV1(this.apiCall);
20+
this._analyticsEvents = new AnalyticsEvents(this.apiCall);
21+
}
22+
23+
rules(): AnalyticsRulesV1;
24+
rules(id: string): AnalyticsRuleV1;
25+
rules(id?: string): AnalyticsRulesV1 | AnalyticsRuleV1 {
26+
if (!AnalyticsV1.hasWarnedDeprecation) {
27+
// eslint-disable-next-line no-console
28+
console.warn(
29+
"[typesense] 'analyticsV1' is deprecated starting with Typesense Server v30 and will be removed in a future release. Please use 'analytics' instead.",
30+
);
31+
AnalyticsV1.hasWarnedDeprecation = true;
32+
}
33+
if (id === undefined) {
34+
return this._analyticsRules;
35+
} else {
36+
if (this.individualAnalyticsRules[id] === undefined) {
37+
this.individualAnalyticsRules[id] = new AnalyticsRuleV1(id, this.apiCall);
38+
}
39+
return this.individualAnalyticsRules[id];
40+
}
41+
}
42+
43+
events(): AnalyticsEvents {
44+
return this._analyticsEvents;
45+
}
46+
47+
static get RESOURCEPATH() {
48+
return RESOURCEPATH;
49+
}
50+
}
51+
52+

src/Typesense/Client.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import Operations from "./Operations";
1616
import MultiSearch from "./MultiSearch";
1717
import Presets from "./Presets";
1818
import Preset from "./Preset";
19+
import AnalyticsV1 from "./AnalyticsV1";
1920
import Analytics from "./Analytics";
2021
import Stopwords from "./Stopwords";
2122
import Stopword from "./Stopword";
@@ -37,6 +38,7 @@ export default class Client {
3738
operations: Operations;
3839
multiSearch: MultiSearch;
3940
analytics: Analytics;
41+
analyticsV1: AnalyticsV1;
4042
stemming: Stemming;
4143
private readonly _collections: Collections;
4244
private readonly individualCollections: Record<string, Collection>;
@@ -77,6 +79,7 @@ export default class Client {
7779
this._stopwords = new Stopwords(this.apiCall);
7880
this.individualStopwords = {};
7981
this.analytics = new Analytics(this.apiCall);
82+
this.analyticsV1 = new AnalyticsV1(this.apiCall);
8083
this.stemming = new Stemming(this.apiCall);
8184
this._conversations = new Conversations(this.apiCall);
8285
this.individualConversations = {};

src/Typesense/Synonym.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ export interface SynonymDeleteSchema {
1010
id: string;
1111
}
1212

13+
/**
14+
* @deprecated Deprecated starting with Typesense Server v30. Please migrate to `client.synonymSets` (new Synonym Sets APIs).
15+
*/
1316
export default class Synonym {
17+
private static hasWarnedDeprecation = false;
1418
constructor(
1519
private collectionName: string,
1620
private synonymId: string,
@@ -26,6 +30,13 @@ export default class Synonym {
2630
}
2731

2832
private endpointPath(): string {
33+
if (!Synonym.hasWarnedDeprecation) {
34+
// eslint-disable-next-line no-console
35+
console.warn(
36+
"[typesense] 'synonym' APIs are deprecated starting with Typesense Server v30. Please migrate to synonym sets 'synonym_sets'.",
37+
);
38+
Synonym.hasWarnedDeprecation = true;
39+
}
2940
return `${Collections.RESOURCEPATH}/${encodeURIComponent(this.collectionName)}${Synonyms.RESOURCEPATH}/${encodeURIComponent(this.synonymId)}`;
3041
}
3142
}

0 commit comments

Comments
 (0)