@talkpilot/core-db 1.3.45 → 1.3.47

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.
Files changed (215) hide show
  1. package/.cursor/rules/development.mdc +65 -65
  2. package/AGENTS.md +49 -0
  3. package/DEVELOPMENT.md +141 -141
  4. package/README.md +747 -747
  5. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts +1 -0
  6. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts.map +1 -1
  7. package/jest.config.js +20 -20
  8. package/package.json +46 -46
  9. package/src/__tests__/setup.ts +20 -20
  10. package/src/bulkWrite/__tests__/bulkWrite.spec.ts +65 -65
  11. package/src/bulkWrite/bulkWrite.ops.ts +45 -45
  12. package/src/bulkWrite/bulkWrite.types.ts +4 -4
  13. package/src/bulkWrite/index.ts +2 -2
  14. package/src/config.ts +9 -9
  15. package/src/configuration/index.ts +17 -17
  16. package/src/configuration/internalModels/index.ts +3 -3
  17. package/src/configuration/internalModels/internalModels.constants.ts +1 -1
  18. package/src/configuration/internalModels/internalModels.getters.ts +33 -33
  19. package/src/configuration/internalModels/internalModels.types.ts +12 -12
  20. package/src/configuration/models/index.ts +25 -25
  21. package/src/configuration/models/models.constants.ts +13 -13
  22. package/src/configuration/models/models.getters.ts +53 -53
  23. package/src/configuration/models/models.types.ts +79 -79
  24. package/src/configuration/mongodb-client.ts +62 -62
  25. package/src/configuration/prompts/index.ts +2 -2
  26. package/src/configuration/prompts/prompts.getters.ts +49 -49
  27. package/src/configuration/prompts/prompts.types.ts +11 -11
  28. package/src/connection.ts +81 -81
  29. package/src/index.ts +46 -46
  30. package/src/municipal/__tests__/validation.spec.ts +62 -62
  31. package/src/municipal/cities/cities.getters.ts +50 -50
  32. package/src/municipal/cities/cities.types.ts +11 -11
  33. package/src/municipal/cities/index.ts +2 -2
  34. package/src/municipal/departmentsSubjects/__tests__/departmentsSubjects.spec.ts +272 -272
  35. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +317 -317
  36. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +73 -73
  37. package/src/municipal/departmentsSubjects/index.ts +9 -9
  38. package/src/municipal/index.ts +22 -22
  39. package/src/municipal/mongodb-client.ts +61 -61
  40. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +94 -94
  41. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +92 -92
  42. package/src/municipal/muniIssues/index.ts +17 -17
  43. package/src/municipal/muniIssues/muniIssues.constants.ts +18 -18
  44. package/src/municipal/muniIssues/muniIssues.getters.ts +24 -24
  45. package/src/municipal/muniIssues/muniIssues.schema.ts +66 -66
  46. package/src/municipal/muniIssues/muniIssues.setters.ts +24 -24
  47. package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
  48. package/src/municipal/muniIssues/muniIssues.types.ts +37 -37
  49. package/src/municipal/streets/__tests__/streets.spec.ts +253 -253
  50. package/src/municipal/streets/index.ts +2 -2
  51. package/src/municipal/streets/streets.getters.ts +140 -140
  52. package/src/municipal/streets/streets.types.ts +19 -19
  53. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  54. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  55. package/src/municipal/systemInstructions/index.ts +7 -7
  56. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  57. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  58. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  59. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
  60. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +99 -99
  61. package/src/municipal/tickets/index.ts +9 -9
  62. package/src/municipal/tickets/tickets.constants.ts +8 -8
  63. package/src/municipal/tickets/tickets.getters.ts +121 -121
  64. package/src/municipal/tickets/tickets.statistics.aggregation.ts +110 -110
  65. package/src/municipal/tickets/tickets.statistics.getters.ts +145 -145
  66. package/src/municipal/tickets/tickets.types.ts +54 -54
  67. package/src/municipal/utils/types.ts +11 -11
  68. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  69. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  70. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  71. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  72. package/src/talkpilot/agents/agents.getters.ts +34 -34
  73. package/src/talkpilot/agents/agents.types.ts +14 -14
  74. package/src/talkpilot/agents/index.ts +2 -2
  75. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  76. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  77. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  78. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  79. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  80. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +229 -229
  81. package/src/talkpilot/calls/__tests__/calls.spec.ts +471 -471
  82. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +483 -483
  83. package/src/talkpilot/calls/calls.constants.ts +49 -49
  84. package/src/talkpilot/calls/calls.getters.ts +277 -277
  85. package/src/talkpilot/calls/calls.statistics.getters.ts +668 -668
  86. package/src/talkpilot/calls/calls.statistics.types.ts +48 -48
  87. package/src/talkpilot/calls/calls.types.ts +134 -134
  88. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +295 -295
  89. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
  90. package/src/talkpilot/calls/index.ts +6 -6
  91. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  92. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  93. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  94. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  95. package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -123
  96. package/src/talkpilot/clients/clients.getters.ts +16 -16
  97. package/src/talkpilot/clients/clients.quota.getters.ts +119 -119
  98. package/src/talkpilot/clients/clients.quota.types.ts +27 -27
  99. package/src/talkpilot/clients/clients.types.ts +18 -18
  100. package/src/talkpilot/clients/index.ts +4 -4
  101. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +423 -423
  102. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +212 -212
  103. package/src/talkpilot/clientsConfig/clientsConfig.constants.ts +2 -2
  104. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +247 -247
  105. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +136 -135
  106. package/src/talkpilot/clientsConfig/index.ts +3 -3
  107. package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +217 -217
  108. package/src/talkpilot/contextNotes/contextNotes.getters.ts +85 -85
  109. package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -20
  110. package/src/talkpilot/contextNotes/index.ts +2 -2
  111. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +99 -99
  112. package/src/talkpilot/flows/flows.getter.ts +14 -14
  113. package/src/talkpilot/flows/flows.schema.ts +155 -155
  114. package/src/talkpilot/flows/flows.types.ts +189 -189
  115. package/src/talkpilot/flows/index.ts +2 -2
  116. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  117. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  118. package/src/talkpilot/groups/groups.getters.ts +30 -30
  119. package/src/talkpilot/groups/groups.types.ts +29 -29
  120. package/src/talkpilot/groups/index.ts +3 -3
  121. package/src/talkpilot/groups/phone.utils.ts +46 -46
  122. package/src/talkpilot/index.ts +31 -31
  123. package/src/talkpilot/leads/index.ts +2 -2
  124. package/src/talkpilot/leads/leads.getter.ts +6 -6
  125. package/src/talkpilot/leads/leads.schema.ts +33 -33
  126. package/src/talkpilot/leads/leads.types.ts +20 -20
  127. package/src/talkpilot/mongodb-client.ts +78 -78
  128. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +282 -282
  129. package/src/talkpilot/phone_numbers/index.ts +2 -2
  130. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +176 -176
  131. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  132. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  133. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  134. package/src/talkpilot/plans/index.ts +2 -2
  135. package/src/talkpilot/plans/plans.getters.ts +132 -132
  136. package/src/talkpilot/plans/plans.types.ts +89 -89
  137. package/src/talkpilot/products/__tests__/products.getters.spec.ts +44 -44
  138. package/src/talkpilot/products/index.ts +2 -2
  139. package/src/talkpilot/products/products.getters.ts +12 -12
  140. package/src/talkpilot/products/products.types.ts +9 -9
  141. package/src/talkpilot/results/index.ts +7 -7
  142. package/src/talkpilot/results/results.getter.ts +39 -39
  143. package/src/talkpilot/results/results.schema.ts +25 -25
  144. package/src/talkpilot/results/results.types.ts +34 -34
  145. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  146. package/src/talkpilot/retry_analyze/index.ts +2 -2
  147. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
  148. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  149. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  150. package/src/talkpilot/sessions/index.ts +2 -2
  151. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  152. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  153. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  154. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  155. package/src/talkpilot/subscriptions/index.ts +3 -3
  156. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  157. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  158. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  159. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  160. package/src/talkpilot/utils/query.utils.ts +21 -21
  161. package/src/test-utils/db-utils.ts +33 -33
  162. package/src/test-utils/factories/index.ts +18 -18
  163. package/src/test-utils/factories/municipal/cities.ts +16 -16
  164. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  165. package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
  166. package/src/test-utils/factories/municipal/streets.ts +22 -22
  167. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  168. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  169. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  170. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  171. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  172. package/src/test-utils/factories/talkpilot/contextNotes.ts +40 -40
  173. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  174. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  175. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  176. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  177. package/src/test-utils/factories/websitalk/knowledgeDocuments.ts +29 -29
  178. package/src/test-utils/factories/websitalk/scanResources.ts +26 -26
  179. package/src/test-utils/factories/websitalk/scans.ts +29 -29
  180. package/src/test-utils/factories/websitalk/websiteUrls.ts +17 -17
  181. package/src/utils/date.utils.ts +126 -126
  182. package/src/utils/shared.types.ts +4 -4
  183. package/src/utils/validation.ts +23 -23
  184. package/src/websitalk/index.ts +18 -18
  185. package/src/websitalk/knowledgeDocuments/__tests__/knowledgeDocuments.spec.ts +186 -186
  186. package/src/websitalk/knowledgeDocuments/index.ts +3 -3
  187. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.constants.ts +17 -17
  188. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.getters.ts +78 -78
  189. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.types.ts +62 -62
  190. package/src/websitalk/mongodb-client.ts +61 -61
  191. package/src/websitalk/scanResources/__tests__/scanResources.spec.ts +136 -136
  192. package/src/websitalk/scanResources/index.ts +4 -4
  193. package/src/websitalk/scanResources/scanResources.constants.ts +47 -47
  194. package/src/websitalk/scanResources/scanResources.getters.ts +94 -94
  195. package/src/websitalk/scanResources/scanResources.types.ts +90 -90
  196. package/src/websitalk/scanResources/scanResources.utils.ts +28 -28
  197. package/src/websitalk/scans/__tests__/scans.spec.ts +313 -313
  198. package/src/websitalk/scans/index.ts +4 -4
  199. package/src/websitalk/scans/scans.constants.ts +15 -15
  200. package/src/websitalk/scans/scans.getters.ts +166 -166
  201. package/src/websitalk/scans/scans.types.ts +54 -54
  202. package/src/websitalk/scans/scans.utils.ts +5 -5
  203. package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +77 -77
  204. package/src/websitalk/websiteUrls/index.ts +2 -2
  205. package/src/websitalk/websiteUrls/websiteUrls.getters.ts +65 -65
  206. package/src/websitalk/websiteUrls/websiteUrls.types.ts +13 -13
  207. package/tsconfig.json +23 -23
  208. package/dist/talkpilot/clients/clients.quota.constants.d.ts +0 -2
  209. package/dist/talkpilot/clients/clients.quota.constants.d.ts.map +0 -1
  210. package/dist/talkpilot/clients/clients.quota.constants.js +0 -5
  211. package/dist/talkpilot/clients/clients.quota.constants.js.map +0 -1
  212. package/dist/talkpilot/clients/clients.quota.utils.d.ts +0 -8
  213. package/dist/talkpilot/clients/clients.quota.utils.d.ts.map +0 -1
  214. package/dist/talkpilot/clients/clients.quota.utils.js +0 -45
  215. package/dist/talkpilot/clients/clients.quota.utils.js.map +0 -1
@@ -1,38 +1,38 @@
1
- import {
2
- getFlowsCollection,
3
- getSessionsCollection,
4
- getResultsCollection,
5
- getLeadsCollection,
6
- getPhoneNumbersCollection,
7
- getClientsCollection,
8
- ObjectId,
9
- getPlansCollection,
10
- getSubscriptionsCollection,
11
- } from "../index";
12
-
13
- import { ObjectId as MongoObjectId } from "mongodb";
14
-
15
- describe("talkpilot core/db", () => {
16
- it.each([
17
- ["flows", getFlowsCollection],
18
- ["sessions", getSessionsCollection],
19
- ["results", getResultsCollection],
20
- ["leads", getLeadsCollection],
21
- ["phone_numbers", getPhoneNumbersCollection],
22
- ["clients", getClientsCollection],
23
- ["plans", getPlansCollection],
24
- ["subscriptions", getSubscriptionsCollection],
25
- ])('%s collection helper returns a "%s" collection', (name, getter) => {
26
- expect(getter().collectionName).toBe(name);
27
- });
28
-
29
- it("ObjectId re-export behaves like mongodb.ObjectId", () => {
30
- expect(ObjectId).toBe(MongoObjectId);
31
-
32
- const id = new ObjectId();
33
-
34
- expect(id).toBeInstanceOf(MongoObjectId);
35
- expect(ObjectId.isValid(id)).toBe(true);
36
- expect(id.toHexString()).toHaveLength(24);
37
- });
38
- });
1
+ import {
2
+ getFlowsCollection,
3
+ getSessionsCollection,
4
+ getResultsCollection,
5
+ getLeadsCollection,
6
+ getPhoneNumbersCollection,
7
+ getClientsCollection,
8
+ ObjectId,
9
+ getPlansCollection,
10
+ getSubscriptionsCollection,
11
+ } from "../index";
12
+
13
+ import { ObjectId as MongoObjectId } from "mongodb";
14
+
15
+ describe("talkpilot core/db", () => {
16
+ it.each([
17
+ ["flows", getFlowsCollection],
18
+ ["sessions", getSessionsCollection],
19
+ ["results", getResultsCollection],
20
+ ["leads", getLeadsCollection],
21
+ ["phone_numbers", getPhoneNumbersCollection],
22
+ ["clients", getClientsCollection],
23
+ ["plans", getPlansCollection],
24
+ ["subscriptions", getSubscriptionsCollection],
25
+ ])('%s collection helper returns a "%s" collection', (name, getter) => {
26
+ expect(getter().collectionName).toBe(name);
27
+ });
28
+
29
+ it("ObjectId re-export behaves like mongodb.ObjectId", () => {
30
+ expect(ObjectId).toBe(MongoObjectId);
31
+
32
+ const id = new ObjectId();
33
+
34
+ expect(id).toBeInstanceOf(MongoObjectId);
35
+ expect(ObjectId.isValid(id)).toBe(true);
36
+ expect(id.toHexString()).toHaveLength(24);
37
+ });
38
+ });
@@ -1,18 +1,18 @@
1
- import { getDb } from "../index";
2
-
3
- describe("MongoDBClient", () => {
4
- it("should have a connected database instance from global setup", () => {
5
- const db = getDb();
6
- expect(db).toBeDefined();
7
- expect(db.databaseName).toBe("test"); // Based on our setup.ts
8
- });
9
-
10
- it("should report as connected", async () => {
11
- // Note: mongodbClient.connect() was called in global setup
12
- // but through setDb, not necessarily through the client singleton instance
13
- // since initTestDb calls setDb directly.
14
-
15
- // In a real scenario, you'd use the client.
16
- expect(true).toBe(true);
17
- });
18
- });
1
+ import { getDb } from "../index";
2
+
3
+ describe("MongoDBClient", () => {
4
+ it("should have a connected database instance from global setup", () => {
5
+ const db = getDb();
6
+ expect(db).toBeDefined();
7
+ expect(db.databaseName).toBe("test"); // Based on our setup.ts
8
+ });
9
+
10
+ it("should report as connected", async () => {
11
+ // Note: mongodbClient.connect() was called in global setup
12
+ // but through setDb, not necessarily through the client singleton instance
13
+ // since initTestDb calls setDb directly.
14
+
15
+ // In a real scenario, you'd use the client.
16
+ expect(true).toBe(true);
17
+ });
18
+ });
@@ -1,68 +1,68 @@
1
- import { mongodbClient } from "../mongodb-client";
2
- import { MongoClient } from "mongodb";
3
-
4
- describe("MongoDBClient Validation", () => {
5
- const originalEnv = process.env;
6
-
7
- beforeEach(() => {
8
- process.env = { ...originalEnv };
9
- delete process.env.MONGO_URI;
10
- delete process.env.MONGODB_URI;
11
- delete process.env.MONGODB_DB_NAME;
12
-
13
- // Force reset singleton state
14
- (mongodbClient as any).client = null;
15
- (mongodbClient as any).db = null;
16
- });
17
-
18
- afterAll(async () => {
19
- process.env = originalEnv;
20
- // Ensure we are disconnected
21
- await mongodbClient.disconnect();
22
- });
23
-
24
- it("should throw error if no URI is provided", async () => {
25
- await expect(mongodbClient.connect()).rejects.toThrow(
26
- "[core-db] Configuration Error: 'MONGO_URI' is missing",
27
- );
28
- });
29
-
30
- it("should throw error if an invalid URI format is provided", async () => {
31
- await expect(mongodbClient.connect("not-a-mongo-uri")).rejects.toThrow(
32
- "[core-db] Connection Error: The provided MongoDB URI is invalid",
33
- );
34
- });
35
-
36
- it("should throw error if URI is valid but database name is missing", async () => {
37
- // We mock the actual MongoClient connection so it doesn't try to hit a real network
38
- const connectSpy = jest
39
- .spyOn(MongoClient.prototype, "connect")
40
- .mockResolvedValue({} as any);
41
-
42
- const uriWithoutDb = "mongodb://127.0.0.1:27017";
43
- await expect(mongodbClient.connect(uriWithoutDb)).rejects.toThrow(
44
- "[core-db] Database name not specified",
45
- );
46
-
47
- connectSpy.mockRestore();
48
- });
49
-
50
- it("should succeed when valid URI and DB name are provided", async () => {
51
- const mockDb = { databaseName: "my-db" };
52
- const connectSpy = jest
53
- .spyOn(MongoClient.prototype, "connect")
54
- .mockResolvedValue({} as any);
55
- const dbSpy = jest
56
- .spyOn(MongoClient.prototype, "db")
57
- .mockReturnValue(mockDb as any);
58
-
59
- const validUri = "mongodb://127.0.0.1:27017/my-db";
60
- await mongodbClient.connect(validUri);
61
-
62
- expect(mongodbClient.getDb()).toBeDefined();
63
- expect(mongodbClient.getDb().databaseName).toBe("my-db");
64
-
65
- connectSpy.mockRestore();
66
- dbSpy.mockRestore();
67
- });
68
- });
1
+ import { mongodbClient } from "../mongodb-client";
2
+ import { MongoClient } from "mongodb";
3
+
4
+ describe("MongoDBClient Validation", () => {
5
+ const originalEnv = process.env;
6
+
7
+ beforeEach(() => {
8
+ process.env = { ...originalEnv };
9
+ delete process.env.MONGO_URI;
10
+ delete process.env.MONGODB_URI;
11
+ delete process.env.MONGODB_DB_NAME;
12
+
13
+ // Force reset singleton state
14
+ (mongodbClient as any).client = null;
15
+ (mongodbClient as any).db = null;
16
+ });
17
+
18
+ afterAll(async () => {
19
+ process.env = originalEnv;
20
+ // Ensure we are disconnected
21
+ await mongodbClient.disconnect();
22
+ });
23
+
24
+ it("should throw error if no URI is provided", async () => {
25
+ await expect(mongodbClient.connect()).rejects.toThrow(
26
+ "[core-db] Configuration Error: 'MONGO_URI' is missing",
27
+ );
28
+ });
29
+
30
+ it("should throw error if an invalid URI format is provided", async () => {
31
+ await expect(mongodbClient.connect("not-a-mongo-uri")).rejects.toThrow(
32
+ "[core-db] Connection Error: The provided MongoDB URI is invalid",
33
+ );
34
+ });
35
+
36
+ it("should throw error if URI is valid but database name is missing", async () => {
37
+ // We mock the actual MongoClient connection so it doesn't try to hit a real network
38
+ const connectSpy = jest
39
+ .spyOn(MongoClient.prototype, "connect")
40
+ .mockResolvedValue({} as any);
41
+
42
+ const uriWithoutDb = "mongodb://127.0.0.1:27017";
43
+ await expect(mongodbClient.connect(uriWithoutDb)).rejects.toThrow(
44
+ "[core-db] Database name not specified",
45
+ );
46
+
47
+ connectSpy.mockRestore();
48
+ });
49
+
50
+ it("should succeed when valid URI and DB name are provided", async () => {
51
+ const mockDb = { databaseName: "my-db" };
52
+ const connectSpy = jest
53
+ .spyOn(MongoClient.prototype, "connect")
54
+ .mockResolvedValue({} as any);
55
+ const dbSpy = jest
56
+ .spyOn(MongoClient.prototype, "db")
57
+ .mockReturnValue(mockDb as any);
58
+
59
+ const validUri = "mongodb://127.0.0.1:27017/my-db";
60
+ await mongodbClient.connect(validUri);
61
+
62
+ expect(mongodbClient.getDb()).toBeDefined();
63
+ expect(mongodbClient.getDb().databaseName).toBe("my-db");
64
+
65
+ connectSpy.mockRestore();
66
+ dbSpy.mockRestore();
67
+ });
68
+ });
@@ -1,29 +1,29 @@
1
- import { findAgents } from "../agents.getters";
2
- import { setDb } from "../../index";
3
- import { Db, Collection } from "mongodb";
4
- import { createAgent } from "../../../test-utils/factories";
5
-
6
- describe("agents getters", () => {
7
- let mockDb: Partial<Db>;
8
- let mockCollection: Partial<Collection>;
9
-
10
- beforeEach(() => {
11
- const mockAgent = createAgent({ name: "Agent Smith" });
12
- mockCollection = {
13
- find: jest.fn().mockReturnValue({
14
- toArray: jest.fn().mockResolvedValue([mockAgent]),
15
- }),
16
- };
17
- mockDb = {
18
- collection: jest.fn().mockReturnValue(mockCollection),
19
- };
20
- setDb(mockDb as Db);
21
- });
22
-
23
- it("findAgents should return agents", async () => {
24
- const result = await findAgents();
25
-
26
- expect(mockDb.collection).toHaveBeenCalledWith("agents");
27
- expect(result[0].name).toBe("Agent Smith");
28
- });
29
- });
1
+ import { findAgents } from "../agents.getters";
2
+ import { setDb } from "../../index";
3
+ import { Db, Collection } from "mongodb";
4
+ import { createAgent } from "../../../test-utils/factories";
5
+
6
+ describe("agents getters", () => {
7
+ let mockDb: Partial<Db>;
8
+ let mockCollection: Partial<Collection>;
9
+
10
+ beforeEach(() => {
11
+ const mockAgent = createAgent({ name: "Agent Smith" });
12
+ mockCollection = {
13
+ find: jest.fn().mockReturnValue({
14
+ toArray: jest.fn().mockResolvedValue([mockAgent]),
15
+ }),
16
+ };
17
+ mockDb = {
18
+ collection: jest.fn().mockReturnValue(mockCollection),
19
+ };
20
+ setDb(mockDb as Db);
21
+ });
22
+
23
+ it("findAgents should return agents", async () => {
24
+ const result = await findAgents();
25
+
26
+ expect(mockDb.collection).toHaveBeenCalledWith("agents");
27
+ expect(result[0].name).toBe("Agent Smith");
28
+ });
29
+ });
@@ -1,34 +1,34 @@
1
- import { getDb, Agent, ObjectId } from "../index";
2
-
3
- export const getAgentsCollection = () => {
4
- return getDb().collection<Agent>("agents");
5
- };
6
-
7
- export const findAgents = async (filter: any = {}) => {
8
- return getAgentsCollection().find(filter).toArray();
9
- };
10
-
11
- export const findAgentById = (agentId: string) => {
12
- return getAgentsCollection().findOne({ _id: new ObjectId(agentId) });
13
- };
14
-
15
- export const findAgentsByClientId = (clientId: string) => {
16
- return getAgentsCollection().find({ clientId }).toArray();
17
- };
18
-
19
- export const createAgent = async (agent: Agent) => {
20
- const { insertedId } = await getAgentsCollection().insertOne(agent);
21
- return findAgentById(String(insertedId));
22
- };
23
-
24
- export const updateAgent = (agentId: string, data: Partial<Agent>) => {
25
- return getAgentsCollection().findOneAndUpdate(
26
- { _id: new ObjectId(agentId) },
27
- { $set: data },
28
- { returnDocument: "after" },
29
- );
30
- };
31
-
32
- export const removeAgent = (agentId: string) => {
33
- return getAgentsCollection().deleteOne({ _id: new ObjectId(agentId) });
34
- };
1
+ import { getDb, Agent, ObjectId } from "../index";
2
+
3
+ export const getAgentsCollection = () => {
4
+ return getDb().collection<Agent>("agents");
5
+ };
6
+
7
+ export const findAgents = async (filter: any = {}) => {
8
+ return getAgentsCollection().find(filter).toArray();
9
+ };
10
+
11
+ export const findAgentById = (agentId: string) => {
12
+ return getAgentsCollection().findOne({ _id: new ObjectId(agentId) });
13
+ };
14
+
15
+ export const findAgentsByClientId = (clientId: string) => {
16
+ return getAgentsCollection().find({ clientId }).toArray();
17
+ };
18
+
19
+ export const createAgent = async (agent: Agent) => {
20
+ const { insertedId } = await getAgentsCollection().insertOne(agent);
21
+ return findAgentById(String(insertedId));
22
+ };
23
+
24
+ export const updateAgent = (agentId: string, data: Partial<Agent>) => {
25
+ return getAgentsCollection().findOneAndUpdate(
26
+ { _id: new ObjectId(agentId) },
27
+ { $set: data },
28
+ { returnDocument: "after" },
29
+ );
30
+ };
31
+
32
+ export const removeAgent = (agentId: string) => {
33
+ return getAgentsCollection().deleteOne({ _id: new ObjectId(agentId) });
34
+ };
@@ -1,14 +1,14 @@
1
- import { WithId } from "mongodb";
2
-
3
- export type Agent = {
4
- name: string;
5
- language: string;
6
- voice: string;
7
- instructions: string;
8
- labels: string[];
9
- clientId: string;
10
- role: string;
11
- gender: "male" | "female";
12
- };
13
-
14
- export type AgentDoc = WithId<Agent>;
1
+ import { WithId } from "mongodb";
2
+
3
+ export type Agent = {
4
+ name: string;
5
+ language: string;
6
+ voice: string;
7
+ instructions: string;
8
+ labels: string[];
9
+ clientId: string;
10
+ role: string;
11
+ gender: "male" | "female";
12
+ };
13
+
14
+ export type AgentDoc = WithId<Agent>;
@@ -1,2 +1,2 @@
1
- export * from "./agents.getters";
2
- export * from "./agents.types";
1
+ export * from "./agents.getters";
2
+ export * from "./agents.types";