@talkpilot/core-db 1.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/development.mdc +65 -65
- package/DEVELOPMENT.md +98 -98
- package/README.md +160 -160
- package/dist/talkpilot/calls/calls.getters.d.ts +1 -2
- package/dist/talkpilot/calls/calls.getters.d.ts.map +1 -1
- package/dist/talkpilot/calls/calls.getters.js +0 -176
- package/dist/talkpilot/calls/calls.getters.js.map +1 -1
- package/dist/talkpilot/calls/calls.types.d.ts +0 -48
- package/dist/talkpilot/calls/calls.types.d.ts.map +1 -1
- package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts +0 -1
- package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts.map +1 -1
- package/dist/talkpilot/clientsConfig/clientsConfig.getters.js +0 -13
- package/dist/talkpilot/clientsConfig/clientsConfig.getters.js.map +1 -1
- package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts +16 -8
- package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts.map +1 -1
- package/jest.config.js +19 -19
- package/package.json +45 -45
- package/src/__tests__/setup.ts +20 -20
- package/src/connection.ts +42 -42
- package/src/index.ts +16 -16
- package/src/municipal/__tests__/validation.spec.ts +62 -62
- package/src/municipal/cities/cities.getters.ts +50 -50
- package/src/municipal/cities/cities.types.ts +11 -11
- package/src/municipal/cities/index.ts +2 -2
- package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +282 -282
- package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +72 -72
- package/src/municipal/departmentsSubjects/index.ts +9 -9
- package/src/municipal/index.ts +21 -21
- package/src/municipal/mongodb-client.ts +61 -61
- package/src/municipal/streets/index.ts +2 -2
- package/src/municipal/streets/streets.getters.ts +125 -125
- package/src/municipal/streets/streets.types.ts +18 -18
- package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
- package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
- package/src/municipal/systemInstructions/index.ts +7 -7
- package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
- package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
- package/src/municipal/systemInstructions/instructions.types.ts +30 -30
- package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +66 -66
- package/src/municipal/tickets/index.ts +2 -2
- package/src/municipal/tickets/tickets.getters.ts +261 -261
- package/src/municipal/tickets/tickets.types.ts +43 -43
- package/src/municipal/utils/types.ts +11 -11
- package/src/talkpilot/__tests__/db.spec.ts +38 -38
- package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
- package/src/talkpilot/__tests__/validation.spec.ts +68 -68
- package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
- package/src/talkpilot/agents/agents.getters.ts +34 -34
- package/src/talkpilot/agents/agents.types.ts +14 -14
- package/src/talkpilot/agents/index.ts +2 -2
- package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
- package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
- package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
- package/src/talkpilot/backgroundToolResults/index.ts +2 -2
- package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
- package/src/talkpilot/calls/__tests__/calls.spec.ts +252 -252
- package/src/talkpilot/calls/calls.getters.ts +248 -446
- package/src/talkpilot/calls/calls.types.ts +115 -171
- package/src/talkpilot/calls/index.ts +2 -2
- package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
- package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
- package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
- package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
- package/src/talkpilot/clients/clients.getters.ts +16 -16
- package/src/talkpilot/clients/clients.types.ts +14 -14
- package/src/talkpilot/clients/index.ts +2 -2
- package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +187 -106
- package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +22 -44
- package/src/talkpilot/clientsConfig/clientsConfig.types.ts +119 -94
- package/src/talkpilot/clientsConfig/index.ts +2 -2
- package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +67 -67
- package/src/talkpilot/flows/flows.getter.ts +14 -14
- package/src/talkpilot/flows/flows.schema.ts +153 -153
- package/src/talkpilot/flows/flows.types.ts +184 -184
- package/src/talkpilot/flows/index.ts +2 -2
- package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
- package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
- package/src/talkpilot/groups/groups.getters.ts +30 -30
- package/src/talkpilot/groups/groups.types.ts +29 -29
- package/src/talkpilot/groups/index.ts +3 -3
- package/src/talkpilot/groups/phone.utils.ts +46 -46
- package/src/talkpilot/index.ts +29 -29
- package/src/talkpilot/leads/index.ts +2 -2
- package/src/talkpilot/leads/leads.getter.ts +6 -6
- package/src/talkpilot/leads/leads.schema.ts +33 -33
- package/src/talkpilot/leads/leads.types.ts +20 -20
- package/src/talkpilot/mongodb-client.ts +78 -78
- package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +247 -247
- package/src/talkpilot/phone_numbers/index.ts +2 -2
- package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +154 -154
- package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
- package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
- package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
- package/src/talkpilot/plans/index.ts +2 -2
- package/src/talkpilot/plans/plans.getters.ts +132 -132
- package/src/talkpilot/plans/plans.types.ts +89 -89
- package/src/talkpilot/results/index.ts +7 -7
- package/src/talkpilot/results/results.getter.ts +35 -35
- package/src/talkpilot/results/results.schema.ts +25 -25
- package/src/talkpilot/results/results.types.ts +34 -34
- package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
- package/src/talkpilot/retry_analyze/index.ts +2 -2
- package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +75 -75
- package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
- package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
- package/src/talkpilot/sessions/index.ts +2 -2
- package/src/talkpilot/sessions/sessions.getter.ts +92 -92
- package/src/talkpilot/sessions/sessions.schema.ts +34 -34
- package/src/talkpilot/sessions/sessions.types.ts +30 -30
- package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
- package/src/talkpilot/subscriptions/index.ts +3 -3
- package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
- package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
- package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
- package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
- package/src/talkpilot/utils/query.utils.ts +21 -21
- package/src/test-utils/db-utils.ts +24 -24
- package/src/test-utils/factories/index.ts +12 -12
- package/src/test-utils/factories/municipal/cities.ts +16 -16
- package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
- package/src/test-utils/factories/municipal/streets.ts +22 -22
- package/src/test-utils/factories/municipal/tickets.ts +39 -39
- package/src/test-utils/factories/talkpilot/agents.ts +19 -19
- package/src/test-utils/factories/talkpilot/calls.ts +37 -37
- package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
- package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
- package/src/test-utils/factories/talkpilot/flows.ts +33 -33
- package/src/test-utils/factories/talkpilot/groups.ts +33 -33
- package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
- package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
- package/src/utils/validation.ts +23 -23
- package/tsconfig.json +23 -23
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { getFlowsCollection, findFlowById } from "./flows.getter";
|
|
2
|
-
export type * from "./flows.types";
|
|
1
|
+
export { getFlowsCollection, findFlowById } from "./flows.getter";
|
|
2
|
+
export type * from "./flows.types";
|
|
@@ -1,90 +1,90 @@
|
|
|
1
|
-
import { ObjectId } from "mongodb";
|
|
2
|
-
import { faker } from "@faker-js/faker";
|
|
3
|
-
import {
|
|
4
|
-
getGroupsCollection,
|
|
5
|
-
findGroups,
|
|
6
|
-
createGroup,
|
|
7
|
-
updateGroup,
|
|
8
|
-
removeGroup,
|
|
9
|
-
} from "../groups.getters";
|
|
10
|
-
import { createGroup as createGroupDoc } from "../../../test-utils/factories";
|
|
11
|
-
|
|
12
|
-
describe("db.groups", () => {
|
|
13
|
-
describe("getGroupsCollection", () => {
|
|
14
|
-
it('returns the "groups" collection', () => {
|
|
15
|
-
expect(getGroupsCollection().collectionName).toBe("groups");
|
|
16
|
-
});
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
describe("findGroups", () => {
|
|
20
|
-
it("returns groups matching the provided filter", async () => {
|
|
21
|
-
const clientId = faker.string.uuid();
|
|
22
|
-
const g1 = createGroupDoc({ clientId, name: "Group A" });
|
|
23
|
-
const g2 = createGroupDoc({ clientId, name: "Group B" });
|
|
24
|
-
const gOther = createGroupDoc({
|
|
25
|
-
clientId: faker.string.uuid(),
|
|
26
|
-
name: "Group C",
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
await getGroupsCollection().insertMany([g1, g2, gOther]);
|
|
30
|
-
|
|
31
|
-
const result = await findGroups({ clientId });
|
|
32
|
-
const names = result.map((g) => g.name).sort();
|
|
33
|
-
|
|
34
|
-
expect(result).toHaveLength(2);
|
|
35
|
-
expect(names).toEqual(["Group A", "Group B"]);
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
describe("createGroup", () => {
|
|
40
|
-
it("inserts a group and returns insertedId", async () => {
|
|
41
|
-
const toInsert = createGroupDoc({ name: "New Group" });
|
|
42
|
-
|
|
43
|
-
const insertedId = await createGroup(toInsert);
|
|
44
|
-
expect(insertedId).toBeInstanceOf(ObjectId);
|
|
45
|
-
|
|
46
|
-
const fromDb = await getGroupsCollection().findOne({ _id: insertedId });
|
|
47
|
-
expect(fromDb?.name).toBe("New Group");
|
|
48
|
-
expect(fromDb?.clientId).toBe(toInsert.clientId);
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
describe("updateGroup", () => {
|
|
53
|
-
it("updates the group and sets updatedAt, returning the updated document", async () => {
|
|
54
|
-
const original = createGroupDoc({
|
|
55
|
-
name: "Before",
|
|
56
|
-
description: "Old desc",
|
|
57
|
-
});
|
|
58
|
-
const { insertedId } = await getGroupsCollection().insertOne(original);
|
|
59
|
-
const before = await getGroupsCollection().findOne({ _id: insertedId });
|
|
60
|
-
|
|
61
|
-
// Add a small delay to ensure updatedAt will be different
|
|
62
|
-
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
63
|
-
|
|
64
|
-
const res = await updateGroup(
|
|
65
|
-
{ _id: insertedId },
|
|
66
|
-
{ name: "After", description: "New desc" },
|
|
67
|
-
);
|
|
68
|
-
|
|
69
|
-
expect(res?._id).toEqual(insertedId);
|
|
70
|
-
expect(res?.name).toBe("After");
|
|
71
|
-
expect(res?.description).toBe("New desc");
|
|
72
|
-
expect(new Date(res!.updatedAt).getTime()).toBeGreaterThan(
|
|
73
|
-
new Date(before!.updatedAt).getTime(),
|
|
74
|
-
);
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
describe("removeGroup", () => {
|
|
79
|
-
it("removes a group by string id", async () => {
|
|
80
|
-
const { insertedId } =
|
|
81
|
-
await getGroupsCollection().insertOne(createGroupDoc());
|
|
82
|
-
|
|
83
|
-
const result = await removeGroup(insertedId.toHexString());
|
|
84
|
-
expect(result.deletedCount).toBe(1);
|
|
85
|
-
|
|
86
|
-
const check = await getGroupsCollection().findOne({ _id: insertedId });
|
|
87
|
-
expect(check).toBeNull();
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
});
|
|
1
|
+
import { ObjectId } from "mongodb";
|
|
2
|
+
import { faker } from "@faker-js/faker";
|
|
3
|
+
import {
|
|
4
|
+
getGroupsCollection,
|
|
5
|
+
findGroups,
|
|
6
|
+
createGroup,
|
|
7
|
+
updateGroup,
|
|
8
|
+
removeGroup,
|
|
9
|
+
} from "../groups.getters";
|
|
10
|
+
import { createGroup as createGroupDoc } from "../../../test-utils/factories";
|
|
11
|
+
|
|
12
|
+
describe("db.groups", () => {
|
|
13
|
+
describe("getGroupsCollection", () => {
|
|
14
|
+
it('returns the "groups" collection', () => {
|
|
15
|
+
expect(getGroupsCollection().collectionName).toBe("groups");
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
describe("findGroups", () => {
|
|
20
|
+
it("returns groups matching the provided filter", async () => {
|
|
21
|
+
const clientId = faker.string.uuid();
|
|
22
|
+
const g1 = createGroupDoc({ clientId, name: "Group A" });
|
|
23
|
+
const g2 = createGroupDoc({ clientId, name: "Group B" });
|
|
24
|
+
const gOther = createGroupDoc({
|
|
25
|
+
clientId: faker.string.uuid(),
|
|
26
|
+
name: "Group C",
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
await getGroupsCollection().insertMany([g1, g2, gOther]);
|
|
30
|
+
|
|
31
|
+
const result = await findGroups({ clientId });
|
|
32
|
+
const names = result.map((g) => g.name).sort();
|
|
33
|
+
|
|
34
|
+
expect(result).toHaveLength(2);
|
|
35
|
+
expect(names).toEqual(["Group A", "Group B"]);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
describe("createGroup", () => {
|
|
40
|
+
it("inserts a group and returns insertedId", async () => {
|
|
41
|
+
const toInsert = createGroupDoc({ name: "New Group" });
|
|
42
|
+
|
|
43
|
+
const insertedId = await createGroup(toInsert);
|
|
44
|
+
expect(insertedId).toBeInstanceOf(ObjectId);
|
|
45
|
+
|
|
46
|
+
const fromDb = await getGroupsCollection().findOne({ _id: insertedId });
|
|
47
|
+
expect(fromDb?.name).toBe("New Group");
|
|
48
|
+
expect(fromDb?.clientId).toBe(toInsert.clientId);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
describe("updateGroup", () => {
|
|
53
|
+
it("updates the group and sets updatedAt, returning the updated document", async () => {
|
|
54
|
+
const original = createGroupDoc({
|
|
55
|
+
name: "Before",
|
|
56
|
+
description: "Old desc",
|
|
57
|
+
});
|
|
58
|
+
const { insertedId } = await getGroupsCollection().insertOne(original);
|
|
59
|
+
const before = await getGroupsCollection().findOne({ _id: insertedId });
|
|
60
|
+
|
|
61
|
+
// Add a small delay to ensure updatedAt will be different
|
|
62
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
63
|
+
|
|
64
|
+
const res = await updateGroup(
|
|
65
|
+
{ _id: insertedId },
|
|
66
|
+
{ name: "After", description: "New desc" },
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
expect(res?._id).toEqual(insertedId);
|
|
70
|
+
expect(res?.name).toBe("After");
|
|
71
|
+
expect(res?.description).toBe("New desc");
|
|
72
|
+
expect(new Date(res!.updatedAt).getTime()).toBeGreaterThan(
|
|
73
|
+
new Date(before!.updatedAt).getTime(),
|
|
74
|
+
);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
describe("removeGroup", () => {
|
|
79
|
+
it("removes a group by string id", async () => {
|
|
80
|
+
const { insertedId } =
|
|
81
|
+
await getGroupsCollection().insertOne(createGroupDoc());
|
|
82
|
+
|
|
83
|
+
const result = await removeGroup(insertedId.toHexString());
|
|
84
|
+
expect(result.deletedCount).toBe(1);
|
|
85
|
+
|
|
86
|
+
const check = await getGroupsCollection().findOne({ _id: insertedId });
|
|
87
|
+
expect(check).toBeNull();
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
});
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import { enrichPhoneNumber, isValidE164 } from "../phone.utils";
|
|
2
|
-
|
|
3
|
-
describe("Phone Utilities", () => {
|
|
4
|
-
describe("enrichPhoneNumber", () => {
|
|
5
|
-
it("should enrich Israeli number", () => {
|
|
6
|
-
const result = enrichPhoneNumber("+972507725874");
|
|
7
|
-
expect(result?.e164).toBe("+972507725874");
|
|
8
|
-
expect(result?.region).toBeDefined();
|
|
9
|
-
expect(result?.countryCallingCode).toBe("972");
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
it("should enrich US number", () => {
|
|
13
|
-
const result = enrichPhoneNumber("+12025551234");
|
|
14
|
-
expect(result?.region).toBe("US");
|
|
15
|
-
expect(result?.countryCallingCode).toBe("1");
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
it("should return null for invalid", () => {
|
|
19
|
-
expect(enrichPhoneNumber("invalid")).toBeNull();
|
|
20
|
-
expect(enrichPhoneNumber("0507725874")).toBeNull();
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
describe("isValidE164", () => {
|
|
25
|
-
it("should validate E.164 format", () => {
|
|
26
|
-
expect(isValidE164("+972508832983")).toBe(true);
|
|
27
|
-
expect(isValidE164("+12025551234")).toBe(true);
|
|
28
|
-
expect(isValidE164("0501234567")).toBe(false);
|
|
29
|
-
expect(isValidE164("invalid")).toBe(false);
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
});
|
|
1
|
+
import { enrichPhoneNumber, isValidE164 } from "../phone.utils";
|
|
2
|
+
|
|
3
|
+
describe("Phone Utilities", () => {
|
|
4
|
+
describe("enrichPhoneNumber", () => {
|
|
5
|
+
it("should enrich Israeli number", () => {
|
|
6
|
+
const result = enrichPhoneNumber("+972507725874");
|
|
7
|
+
expect(result?.e164).toBe("+972507725874");
|
|
8
|
+
expect(result?.region).toBeDefined();
|
|
9
|
+
expect(result?.countryCallingCode).toBe("972");
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it("should enrich US number", () => {
|
|
13
|
+
const result = enrichPhoneNumber("+12025551234");
|
|
14
|
+
expect(result?.region).toBe("US");
|
|
15
|
+
expect(result?.countryCallingCode).toBe("1");
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("should return null for invalid", () => {
|
|
19
|
+
expect(enrichPhoneNumber("invalid")).toBeNull();
|
|
20
|
+
expect(enrichPhoneNumber("0507725874")).toBeNull();
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
describe("isValidE164", () => {
|
|
25
|
+
it("should validate E.164 format", () => {
|
|
26
|
+
expect(isValidE164("+972508832983")).toBe(true);
|
|
27
|
+
expect(isValidE164("+12025551234")).toBe(true);
|
|
28
|
+
expect(isValidE164("0501234567")).toBe(false);
|
|
29
|
+
expect(isValidE164("invalid")).toBe(false);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import { getDb, ObjectId, Group } from "../index";
|
|
2
|
-
import { Collection, Filter } from "mongodb";
|
|
3
|
-
|
|
4
|
-
export const getGroupsCollection = (): Collection<Group> => {
|
|
5
|
-
return getDb().collection<Group>("groups");
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
export const findGroups = async (filter: Filter<Group>): Promise<Group[]> => {
|
|
9
|
-
return await getGroupsCollection().find(filter).toArray();
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
export const createGroup = async (group: Group) => {
|
|
13
|
-
const { insertedId } = await getGroupsCollection().insertOne(group);
|
|
14
|
-
return insertedId;
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export const updateGroup = async (
|
|
18
|
-
filter: Filter<Group>,
|
|
19
|
-
data: Partial<Group>,
|
|
20
|
-
) => {
|
|
21
|
-
return await getGroupsCollection().findOneAndUpdate(
|
|
22
|
-
filter,
|
|
23
|
-
{ $set: { ...data, updatedAt: new Date() } },
|
|
24
|
-
{ returnDocument: "after" },
|
|
25
|
-
);
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
export const removeGroup = async (groupId: string) => {
|
|
29
|
-
return await getGroupsCollection().deleteOne({ _id: new ObjectId(groupId) });
|
|
30
|
-
};
|
|
1
|
+
import { getDb, ObjectId, Group } from "../index";
|
|
2
|
+
import { Collection, Filter } from "mongodb";
|
|
3
|
+
|
|
4
|
+
export const getGroupsCollection = (): Collection<Group> => {
|
|
5
|
+
return getDb().collection<Group>("groups");
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export const findGroups = async (filter: Filter<Group>): Promise<Group[]> => {
|
|
9
|
+
return await getGroupsCollection().find(filter).toArray();
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export const createGroup = async (group: Group) => {
|
|
13
|
+
const { insertedId } = await getGroupsCollection().insertOne(group);
|
|
14
|
+
return insertedId;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const updateGroup = async (
|
|
18
|
+
filter: Filter<Group>,
|
|
19
|
+
data: Partial<Group>,
|
|
20
|
+
) => {
|
|
21
|
+
return await getGroupsCollection().findOneAndUpdate(
|
|
22
|
+
filter,
|
|
23
|
+
{ $set: { ...data, updatedAt: new Date() } },
|
|
24
|
+
{ returnDocument: "after" },
|
|
25
|
+
);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const removeGroup = async (groupId: string) => {
|
|
29
|
+
return await getGroupsCollection().deleteOne({ _id: new ObjectId(groupId) });
|
|
30
|
+
};
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import { WithId } from "mongodb";
|
|
2
|
-
export type E164 = `+${string}`;
|
|
3
|
-
export type CountryISO = Uppercase<string>;
|
|
4
|
-
|
|
5
|
-
export type Phone = {
|
|
6
|
-
e164: E164;
|
|
7
|
-
region?: CountryISO;
|
|
8
|
-
countryCallingCode?: string;
|
|
9
|
-
national?: string;
|
|
10
|
-
ext?: string;
|
|
11
|
-
formatted?: string;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
export type GroupContact = {
|
|
15
|
-
name: string;
|
|
16
|
-
phone: Phone;
|
|
17
|
-
gender: string;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export type Group = {
|
|
21
|
-
clientId: string;
|
|
22
|
-
createdAt: Date;
|
|
23
|
-
updatedAt: Date;
|
|
24
|
-
name: string;
|
|
25
|
-
description: string;
|
|
26
|
-
contacts: GroupContact[];
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export type GroupDoc = WithId<Group>;
|
|
1
|
+
import { WithId } from "mongodb";
|
|
2
|
+
export type E164 = `+${string}`;
|
|
3
|
+
export type CountryISO = Uppercase<string>;
|
|
4
|
+
|
|
5
|
+
export type Phone = {
|
|
6
|
+
e164: E164;
|
|
7
|
+
region?: CountryISO;
|
|
8
|
+
countryCallingCode?: string;
|
|
9
|
+
national?: string;
|
|
10
|
+
ext?: string;
|
|
11
|
+
formatted?: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export type GroupContact = {
|
|
15
|
+
name: string;
|
|
16
|
+
phone: Phone;
|
|
17
|
+
gender: string;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type Group = {
|
|
21
|
+
clientId: string;
|
|
22
|
+
createdAt: Date;
|
|
23
|
+
updatedAt: Date;
|
|
24
|
+
name: string;
|
|
25
|
+
description: string;
|
|
26
|
+
contacts: GroupContact[];
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export type GroupDoc = WithId<Group>;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export * from "./groups.getters";
|
|
2
|
-
export * from "./groups.types";
|
|
3
|
-
export * from "./phone.utils";
|
|
1
|
+
export * from "./groups.getters";
|
|
2
|
+
export * from "./groups.types";
|
|
3
|
+
export * from "./phone.utils";
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
import { PhoneNumberUtil, PhoneNumberFormat } from "google-libphonenumber";
|
|
2
|
-
import type { Phone, E164, CountryISO } from "./groups.types";
|
|
3
|
-
|
|
4
|
-
const phoneUtil = PhoneNumberUtil.getInstance();
|
|
5
|
-
|
|
6
|
-
export const enrichPhoneNumber = (e164: string): Phone | null => {
|
|
7
|
-
try {
|
|
8
|
-
const phoneNumber = phoneUtil.parse(e164, "ZZ");
|
|
9
|
-
if (!phoneUtil.isValidNumber(phoneNumber)) {
|
|
10
|
-
return null;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const normalizedE164 = phoneUtil.format(
|
|
14
|
-
phoneNumber,
|
|
15
|
-
PhoneNumberFormat.E164,
|
|
16
|
-
) as E164;
|
|
17
|
-
const region = phoneUtil.getRegionCodeForNumber(phoneNumber) as CountryISO;
|
|
18
|
-
const countryCallingCode = phoneNumber.getCountryCode()?.toString();
|
|
19
|
-
const national = phoneNumber.getNationalNumber()?.toString();
|
|
20
|
-
const ext = phoneNumber.getExtension() || undefined;
|
|
21
|
-
const formatted = phoneUtil.format(
|
|
22
|
-
phoneNumber,
|
|
23
|
-
PhoneNumberFormat.INTERNATIONAL,
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
return {
|
|
27
|
-
e164: normalizedE164,
|
|
28
|
-
region,
|
|
29
|
-
countryCallingCode,
|
|
30
|
-
national,
|
|
31
|
-
ext,
|
|
32
|
-
formatted,
|
|
33
|
-
};
|
|
34
|
-
} catch (error) {
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
export const isValidE164 = (e164: string): boolean => {
|
|
40
|
-
try {
|
|
41
|
-
const phoneNumber = phoneUtil.parse(e164, "ZZ");
|
|
42
|
-
return phoneUtil.isValidNumber(phoneNumber);
|
|
43
|
-
} catch (error) {
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
|
-
};
|
|
1
|
+
import { PhoneNumberUtil, PhoneNumberFormat } from "google-libphonenumber";
|
|
2
|
+
import type { Phone, E164, CountryISO } from "./groups.types";
|
|
3
|
+
|
|
4
|
+
const phoneUtil = PhoneNumberUtil.getInstance();
|
|
5
|
+
|
|
6
|
+
export const enrichPhoneNumber = (e164: string): Phone | null => {
|
|
7
|
+
try {
|
|
8
|
+
const phoneNumber = phoneUtil.parse(e164, "ZZ");
|
|
9
|
+
if (!phoneUtil.isValidNumber(phoneNumber)) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const normalizedE164 = phoneUtil.format(
|
|
14
|
+
phoneNumber,
|
|
15
|
+
PhoneNumberFormat.E164,
|
|
16
|
+
) as E164;
|
|
17
|
+
const region = phoneUtil.getRegionCodeForNumber(phoneNumber) as CountryISO;
|
|
18
|
+
const countryCallingCode = phoneNumber.getCountryCode()?.toString();
|
|
19
|
+
const national = phoneNumber.getNationalNumber()?.toString();
|
|
20
|
+
const ext = phoneNumber.getExtension() || undefined;
|
|
21
|
+
const formatted = phoneUtil.format(
|
|
22
|
+
phoneNumber,
|
|
23
|
+
PhoneNumberFormat.INTERNATIONAL,
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
return {
|
|
27
|
+
e164: normalizedE164,
|
|
28
|
+
region,
|
|
29
|
+
countryCallingCode,
|
|
30
|
+
national,
|
|
31
|
+
ext,
|
|
32
|
+
formatted,
|
|
33
|
+
};
|
|
34
|
+
} catch (error) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const isValidE164 = (e164: string): boolean => {
|
|
40
|
+
try {
|
|
41
|
+
const phoneNumber = phoneUtil.parse(e164, "ZZ");
|
|
42
|
+
return phoneUtil.isValidNumber(phoneNumber);
|
|
43
|
+
} catch (error) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
};
|
package/src/talkpilot/index.ts
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import { Db, ObjectId as MongoObjectId } from "mongodb";
|
|
2
|
-
|
|
3
|
-
export * from "./flows";
|
|
4
|
-
export * from "./results";
|
|
5
|
-
export * from "./sessions";
|
|
6
|
-
export * from "./phone_numbers";
|
|
7
|
-
export * from "./leads";
|
|
8
|
-
export * from "./clients";
|
|
9
|
-
export * from "./agents";
|
|
10
|
-
export * from "./plans";
|
|
11
|
-
export * from "./subscriptions";
|
|
12
|
-
export * from "./groups";
|
|
13
|
-
export * from "./calls";
|
|
14
|
-
export * from "./clientAudioBuffers";
|
|
15
|
-
export * from "./clientsConfig";
|
|
16
|
-
export * from "./backgroundToolResults";
|
|
17
|
-
export * from "./retry_analyze";
|
|
18
|
-
export { mongodbClient } from "./mongodb-client";
|
|
19
|
-
|
|
20
|
-
let db: Db;
|
|
21
|
-
export const setDb = (d: Db) => {
|
|
22
|
-
db = d;
|
|
23
|
-
};
|
|
24
|
-
export const getDb = (): Db => {
|
|
25
|
-
if (!db) throw new Error("DB not initialised");
|
|
26
|
-
return db;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export const ObjectId = MongoObjectId;
|
|
1
|
+
import { Db, ObjectId as MongoObjectId } from "mongodb";
|
|
2
|
+
|
|
3
|
+
export * from "./flows";
|
|
4
|
+
export * from "./results";
|
|
5
|
+
export * from "./sessions";
|
|
6
|
+
export * from "./phone_numbers";
|
|
7
|
+
export * from "./leads";
|
|
8
|
+
export * from "./clients";
|
|
9
|
+
export * from "./agents";
|
|
10
|
+
export * from "./plans";
|
|
11
|
+
export * from "./subscriptions";
|
|
12
|
+
export * from "./groups";
|
|
13
|
+
export * from "./calls";
|
|
14
|
+
export * from "./clientAudioBuffers";
|
|
15
|
+
export * from "./clientsConfig";
|
|
16
|
+
export * from "./backgroundToolResults";
|
|
17
|
+
export * from "./retry_analyze";
|
|
18
|
+
export { mongodbClient } from "./mongodb-client";
|
|
19
|
+
|
|
20
|
+
let db: Db;
|
|
21
|
+
export const setDb = (d: Db) => {
|
|
22
|
+
db = d;
|
|
23
|
+
};
|
|
24
|
+
export const getDb = (): Db => {
|
|
25
|
+
if (!db) throw new Error("DB not initialised");
|
|
26
|
+
return db;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const ObjectId = MongoObjectId;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { getLeadsCollection } from "./leads.getter";
|
|
2
|
-
export type { Lead, LeadItem, LeadProperty } from "./leads.types";
|
|
1
|
+
export { getLeadsCollection } from "./leads.getter";
|
|
2
|
+
export type { Lead, LeadItem, LeadProperty } from "./leads.types";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { Collection } from "mongodb";
|
|
2
|
-
import { getDb } from "../index";
|
|
3
|
-
import type { Lead } from "./leads.types";
|
|
4
|
-
|
|
5
|
-
export const getLeadsCollection = (): Collection<Lead> =>
|
|
6
|
-
getDb().collection<Lead>("leads");
|
|
1
|
+
import type { Collection } from "mongodb";
|
|
2
|
+
import { getDb } from "../index";
|
|
3
|
+
import type { Lead } from "./leads.types";
|
|
4
|
+
|
|
5
|
+
export const getLeadsCollection = (): Collection<Lead> =>
|
|
6
|
+
getDb().collection<Lead>("leads");
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
export const leadsMongoSchema = {
|
|
2
|
-
bsonType: "object",
|
|
3
|
-
required: ["flowId", "clientId", "createdAt", "leads"],
|
|
4
|
-
properties: {
|
|
5
|
-
_id: { bsonType: "objectId" },
|
|
6
|
-
flowId: { bsonType: "string" },
|
|
7
|
-
clientId: { bsonType: "string" },
|
|
8
|
-
createdAt: { bsonType: "date" },
|
|
9
|
-
leads: {
|
|
10
|
-
bsonType: "array",
|
|
11
|
-
items: {
|
|
12
|
-
bsonType: "object",
|
|
13
|
-
required: ["callSid", "timestamp"],
|
|
14
|
-
properties: {
|
|
15
|
-
callSid: { bsonType: "string" },
|
|
16
|
-
timestamp: { bsonType: "date" },
|
|
17
|
-
properties: {
|
|
18
|
-
bsonType: "array",
|
|
19
|
-
items: {
|
|
20
|
-
bsonType: "object",
|
|
21
|
-
required: ["name", "value"],
|
|
22
|
-
properties: {
|
|
23
|
-
name: { bsonType: "string" },
|
|
24
|
-
value: { bsonType: "string" },
|
|
25
|
-
},
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
additionalProperties: false,
|
|
33
|
-
} as const;
|
|
1
|
+
export const leadsMongoSchema = {
|
|
2
|
+
bsonType: "object",
|
|
3
|
+
required: ["flowId", "clientId", "createdAt", "leads"],
|
|
4
|
+
properties: {
|
|
5
|
+
_id: { bsonType: "objectId" },
|
|
6
|
+
flowId: { bsonType: "string" },
|
|
7
|
+
clientId: { bsonType: "string" },
|
|
8
|
+
createdAt: { bsonType: "date" },
|
|
9
|
+
leads: {
|
|
10
|
+
bsonType: "array",
|
|
11
|
+
items: {
|
|
12
|
+
bsonType: "object",
|
|
13
|
+
required: ["callSid", "timestamp"],
|
|
14
|
+
properties: {
|
|
15
|
+
callSid: { bsonType: "string" },
|
|
16
|
+
timestamp: { bsonType: "date" },
|
|
17
|
+
properties: {
|
|
18
|
+
bsonType: "array",
|
|
19
|
+
items: {
|
|
20
|
+
bsonType: "object",
|
|
21
|
+
required: ["name", "value"],
|
|
22
|
+
properties: {
|
|
23
|
+
name: { bsonType: "string" },
|
|
24
|
+
value: { bsonType: "string" },
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
additionalProperties: false,
|
|
33
|
+
} as const;
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { ObjectId } from "mongodb";
|
|
2
|
-
|
|
3
|
-
export interface LeadProperty {
|
|
4
|
-
name: string;
|
|
5
|
-
value: string;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export interface LeadItem {
|
|
9
|
-
callSid: string;
|
|
10
|
-
timestamp: Date;
|
|
11
|
-
properties?: LeadProperty[];
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface Lead {
|
|
15
|
-
_id?: ObjectId;
|
|
16
|
-
flowId: ObjectId;
|
|
17
|
-
clientId: string;
|
|
18
|
-
createdAt: Date;
|
|
19
|
-
leads: LeadItem[];
|
|
20
|
-
}
|
|
1
|
+
import { ObjectId } from "mongodb";
|
|
2
|
+
|
|
3
|
+
export interface LeadProperty {
|
|
4
|
+
name: string;
|
|
5
|
+
value: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface LeadItem {
|
|
9
|
+
callSid: string;
|
|
10
|
+
timestamp: Date;
|
|
11
|
+
properties?: LeadProperty[];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface Lead {
|
|
15
|
+
_id?: ObjectId;
|
|
16
|
+
flowId: ObjectId;
|
|
17
|
+
clientId: string;
|
|
18
|
+
createdAt: Date;
|
|
19
|
+
leads: LeadItem[];
|
|
20
|
+
}
|