@talkpilot/core-db 1.3.74 → 1.3.75

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 (274) hide show
  1. package/.cursor/rules/development.mdc +65 -65
  2. package/AGENTS.md +49 -49
  3. package/DEVELOPMENT.md +141 -141
  4. package/README.md +818 -844
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/municipal/index.d.ts +1 -0
  10. package/dist/municipal/index.d.ts.map +1 -1
  11. package/dist/municipal/index.js +1 -0
  12. package/dist/municipal/index.js.map +1 -1
  13. package/dist/municipal/residents/index.d.ts +5 -0
  14. package/dist/municipal/residents/index.d.ts.map +1 -0
  15. package/dist/municipal/residents/index.js +24 -0
  16. package/dist/municipal/residents/index.js.map +1 -0
  17. package/dist/municipal/residents/residents.constants.d.ts +3 -0
  18. package/dist/municipal/residents/residents.constants.d.ts.map +1 -0
  19. package/dist/municipal/residents/residents.constants.js +6 -0
  20. package/dist/municipal/residents/residents.constants.js.map +1 -0
  21. package/dist/municipal/residents/residents.getters.d.ts +9 -0
  22. package/dist/municipal/residents/residents.getters.d.ts.map +1 -0
  23. package/dist/municipal/residents/residents.getters.js +32 -0
  24. package/dist/municipal/residents/residents.getters.js.map +1 -0
  25. package/dist/municipal/residents/residents.schema.d.ts +4 -0
  26. package/dist/municipal/residents/residents.schema.d.ts.map +1 -0
  27. package/dist/municipal/residents/residents.schema.js +29 -0
  28. package/dist/municipal/residents/residents.schema.js.map +1 -0
  29. package/dist/municipal/residents/residents.types.d.ts +15 -0
  30. package/dist/municipal/residents/residents.types.d.ts.map +1 -0
  31. package/dist/municipal/residents/residents.types.js +3 -0
  32. package/dist/municipal/residents/residents.types.js.map +1 -0
  33. package/dist/talkpilot/calls/calls.constants.d.ts +0 -7
  34. package/dist/talkpilot/calls/calls.constants.d.ts.map +1 -1
  35. package/dist/talkpilot/calls/calls.constants.js +1 -8
  36. package/dist/talkpilot/calls/calls.constants.js.map +1 -1
  37. package/dist/talkpilot/calls/calls.getters.d.ts +1 -2
  38. package/dist/talkpilot/calls/calls.getters.d.ts.map +1 -1
  39. package/dist/talkpilot/calls/calls.getters.js +1 -6
  40. package/dist/talkpilot/calls/calls.getters.js.map +1 -1
  41. package/dist/talkpilot/calls/calls.types.d.ts +2 -4
  42. package/dist/talkpilot/calls/calls.types.d.ts.map +1 -1
  43. package/dist/talkpilot/flows/flows.schema.d.ts +28 -0
  44. package/dist/talkpilot/flows/flows.schema.d.ts.map +1 -1
  45. package/dist/talkpilot/flows/flows.schema.js +16 -0
  46. package/dist/talkpilot/flows/flows.schema.js.map +1 -1
  47. package/dist/talkpilot/flows/flows.types.d.ts +8 -0
  48. package/dist/talkpilot/flows/flows.types.d.ts.map +1 -1
  49. package/dist/talkpilot/subscriptions/subscriptions.utils.d.ts +4 -0
  50. package/dist/talkpilot/subscriptions/subscriptions.utils.d.ts.map +1 -0
  51. package/dist/talkpilot/subscriptions/subscriptions.utils.js +20 -0
  52. package/dist/talkpilot/subscriptions/subscriptions.utils.js.map +1 -0
  53. package/dist/test-utils/factories/index.d.ts +1 -0
  54. package/dist/test-utils/factories/index.d.ts.map +1 -1
  55. package/dist/test-utils/factories/index.js +1 -0
  56. package/dist/test-utils/factories/index.js.map +1 -1
  57. package/dist/test-utils/factories/municipal/residents.d.ts +5 -0
  58. package/dist/test-utils/factories/municipal/residents.d.ts.map +1 -0
  59. package/dist/test-utils/factories/municipal/residents.js +22 -0
  60. package/dist/test-utils/factories/municipal/residents.js.map +1 -0
  61. package/jest.config.js +20 -20
  62. package/package.json +46 -46
  63. package/src/__tests__/setup.ts +20 -20
  64. package/src/bulkWrite/__tests__/bulkWrite.spec.ts +65 -65
  65. package/src/bulkWrite/bulkWrite.ops.ts +45 -45
  66. package/src/bulkWrite/bulkWrite.types.ts +4 -4
  67. package/src/bulkWrite/index.ts +2 -2
  68. package/src/config.ts +9 -9
  69. package/src/configuration/index.ts +17 -17
  70. package/src/configuration/internalModels/index.ts +3 -3
  71. package/src/configuration/internalModels/internalModels.constants.ts +1 -1
  72. package/src/configuration/internalModels/internalModels.getters.ts +33 -33
  73. package/src/configuration/internalModels/internalModels.types.ts +12 -12
  74. package/src/configuration/models/__tests__/models.getters.spec.ts +67 -67
  75. package/src/configuration/models/index.ts +27 -27
  76. package/src/configuration/models/models.constants.ts +20 -20
  77. package/src/configuration/models/models.getters.ts +71 -71
  78. package/src/configuration/models/models.types.ts +80 -80
  79. package/src/configuration/mongodb-client.ts +62 -62
  80. package/src/configuration/prompts/index.ts +2 -2
  81. package/src/configuration/prompts/prompts.getters.ts +49 -49
  82. package/src/configuration/prompts/prompts.types.ts +11 -11
  83. package/src/connection.ts +81 -81
  84. package/src/index.ts +48 -47
  85. package/src/municipal/__tests__/validation.spec.ts +62 -62
  86. package/src/municipal/cities/cities.getters.ts +50 -50
  87. package/src/municipal/cities/cities.types.ts +11 -11
  88. package/src/municipal/cities/index.ts +2 -2
  89. package/src/municipal/departmentsSubjects/__tests__/departmentsSubjects.spec.ts +272 -272
  90. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +317 -317
  91. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +73 -73
  92. package/src/municipal/departmentsSubjects/index.ts +9 -9
  93. package/src/municipal/index.ts +23 -22
  94. package/src/municipal/mongodb-client.ts +61 -61
  95. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +94 -94
  96. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +92 -92
  97. package/src/municipal/muniIssues/index.ts +17 -17
  98. package/src/municipal/muniIssues/muniIssues.constants.ts +18 -18
  99. package/src/municipal/muniIssues/muniIssues.getters.ts +24 -24
  100. package/src/municipal/muniIssues/muniIssues.schema.ts +66 -66
  101. package/src/municipal/muniIssues/muniIssues.setters.ts +24 -24
  102. package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
  103. package/src/municipal/muniIssues/muniIssues.types.ts +37 -37
  104. package/src/municipal/residents/__tests__/residents.spec.ts +92 -0
  105. package/src/municipal/residents/index.ts +4 -0
  106. package/src/municipal/residents/residents.constants.ts +2 -0
  107. package/src/municipal/residents/residents.getters.ts +42 -0
  108. package/src/municipal/residents/residents.schema.ts +28 -0
  109. package/src/municipal/residents/residents.types.ts +17 -0
  110. package/src/municipal/streets/__tests__/streets.spec.ts +253 -253
  111. package/src/municipal/streets/index.ts +2 -2
  112. package/src/municipal/streets/streets.getters.ts +140 -140
  113. package/src/municipal/streets/streets.types.ts +19 -19
  114. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  115. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  116. package/src/municipal/systemInstructions/index.ts +7 -7
  117. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  118. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  119. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  120. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
  121. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +99 -99
  122. package/src/municipal/tickets/index.ts +9 -9
  123. package/src/municipal/tickets/tickets.constants.ts +8 -8
  124. package/src/municipal/tickets/tickets.getters.ts +121 -121
  125. package/src/municipal/tickets/tickets.statistics.aggregation.ts +110 -110
  126. package/src/municipal/tickets/tickets.statistics.getters.ts +145 -145
  127. package/src/municipal/tickets/tickets.types.ts +54 -54
  128. package/src/municipal/utils/types.ts +11 -11
  129. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  130. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  131. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  132. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  133. package/src/talkpilot/agents/agents.getters.ts +34 -34
  134. package/src/talkpilot/agents/agents.types.ts +14 -14
  135. package/src/talkpilot/agents/index.ts +2 -2
  136. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  137. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  138. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  139. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  140. package/src/talkpilot/callTokenUsage/__tests__/callTokenUsage.getters.spec.ts +57 -57
  141. package/src/talkpilot/callTokenUsage/callTokenUsage.getters.ts +42 -42
  142. package/src/talkpilot/callTokenUsage/callTokenUsage.types.ts +28 -28
  143. package/src/talkpilot/callTokenUsage/index.ts +2 -2
  144. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  145. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +229 -229
  146. package/src/talkpilot/calls/__tests__/calls.spec.ts +471 -519
  147. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +483 -483
  148. package/src/talkpilot/calls/calls.constants.ts +49 -57
  149. package/src/talkpilot/calls/calls.getters.ts +277 -295
  150. package/src/talkpilot/calls/calls.statistics.getters.ts +668 -668
  151. package/src/talkpilot/calls/calls.statistics.types.ts +48 -48
  152. package/src/talkpilot/calls/calls.types.ts +151 -155
  153. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +295 -295
  154. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
  155. package/src/talkpilot/calls/index.ts +6 -6
  156. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  157. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  158. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  159. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  160. package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -123
  161. package/src/talkpilot/clients/clients.getters.ts +19 -19
  162. package/src/talkpilot/clients/clients.quota.getters.ts +119 -119
  163. package/src/talkpilot/clients/clients.quota.types.ts +27 -27
  164. package/src/talkpilot/clients/clients.types.ts +18 -18
  165. package/src/talkpilot/clients/index.ts +4 -4
  166. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +423 -423
  167. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +212 -212
  168. package/src/talkpilot/clientsConfig/clientsConfig.constants.ts +2 -2
  169. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +247 -247
  170. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +137 -137
  171. package/src/talkpilot/clientsConfig/index.ts +3 -3
  172. package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +217 -217
  173. package/src/talkpilot/contextNotes/contextNotes.getters.ts +85 -85
  174. package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -20
  175. package/src/talkpilot/contextNotes/index.ts +2 -2
  176. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +152 -124
  177. package/src/talkpilot/flows/flows.getter.ts +34 -34
  178. package/src/talkpilot/flows/flows.schema.ts +196 -180
  179. package/src/talkpilot/flows/flows.types.ts +220 -211
  180. package/src/talkpilot/flows/index.ts +7 -7
  181. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  182. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  183. package/src/talkpilot/groups/groups.getters.ts +30 -30
  184. package/src/talkpilot/groups/groups.types.ts +29 -29
  185. package/src/talkpilot/groups/index.ts +3 -3
  186. package/src/talkpilot/groups/phone.utils.ts +46 -46
  187. package/src/talkpilot/index.ts +32 -32
  188. package/src/talkpilot/leads/index.ts +2 -2
  189. package/src/talkpilot/leads/leads.getter.ts +6 -6
  190. package/src/talkpilot/leads/leads.schema.ts +33 -33
  191. package/src/talkpilot/leads/leads.types.ts +20 -20
  192. package/src/talkpilot/mongodb-client.ts +78 -78
  193. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +530 -530
  194. package/src/talkpilot/phone_numbers/index.ts +2 -2
  195. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +240 -240
  196. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  197. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  198. package/src/talkpilot/phone_numbers/phone_numbers.utils.ts +9 -9
  199. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  200. package/src/talkpilot/plans/index.ts +2 -2
  201. package/src/talkpilot/plans/plans.getters.ts +132 -132
  202. package/src/talkpilot/plans/plans.types.ts +89 -89
  203. package/src/talkpilot/products/__tests__/products.getters.spec.ts +44 -44
  204. package/src/talkpilot/products/index.ts +2 -2
  205. package/src/talkpilot/products/products.getters.ts +12 -12
  206. package/src/talkpilot/products/products.types.ts +9 -9
  207. package/src/talkpilot/results/index.ts +7 -7
  208. package/src/talkpilot/results/results.getter.ts +39 -39
  209. package/src/talkpilot/results/results.schema.ts +25 -25
  210. package/src/talkpilot/results/results.types.ts +34 -34
  211. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  212. package/src/talkpilot/retry_analyze/index.ts +2 -2
  213. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
  214. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  215. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  216. package/src/talkpilot/sessions/index.ts +2 -2
  217. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  218. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  219. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  220. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  221. package/src/talkpilot/subscriptions/index.ts +3 -3
  222. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  223. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  224. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  225. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  226. package/src/talkpilot/utils/query.utils.ts +21 -21
  227. package/src/test-utils/db-utils.ts +33 -33
  228. package/src/test-utils/factories/index.ts +19 -18
  229. package/src/test-utils/factories/municipal/cities.ts +16 -16
  230. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  231. package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
  232. package/src/test-utils/factories/municipal/residents.ts +20 -0
  233. package/src/test-utils/factories/municipal/streets.ts +22 -22
  234. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  235. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  236. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  237. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  238. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  239. package/src/test-utils/factories/talkpilot/contextNotes.ts +40 -40
  240. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  241. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  242. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  243. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  244. package/src/test-utils/factories/websitalk/knowledgeDocuments.ts +29 -29
  245. package/src/test-utils/factories/websitalk/scanResources.ts +26 -26
  246. package/src/test-utils/factories/websitalk/scans.ts +30 -30
  247. package/src/test-utils/factories/websitalk/websiteUrls.ts +17 -17
  248. package/src/utils/date.utils.ts +126 -126
  249. package/src/utils/shared.types.ts +4 -4
  250. package/src/utils/validation.ts +23 -23
  251. package/src/websitalk/index.ts +18 -18
  252. package/src/websitalk/knowledgeDocuments/__tests__/knowledgeDocuments.spec.ts +238 -238
  253. package/src/websitalk/knowledgeDocuments/index.ts +3 -3
  254. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.constants.ts +26 -26
  255. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.getters.ts +95 -95
  256. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.types.ts +75 -75
  257. package/src/websitalk/mongodb-client.ts +61 -61
  258. package/src/websitalk/scanResources/__tests__/scanResources.spec.ts +267 -267
  259. package/src/websitalk/scanResources/index.ts +4 -4
  260. package/src/websitalk/scanResources/scanResources.constants.ts +60 -60
  261. package/src/websitalk/scanResources/scanResources.getters.ts +128 -128
  262. package/src/websitalk/scanResources/scanResources.types.ts +105 -105
  263. package/src/websitalk/scanResources/scanResources.utils.ts +31 -31
  264. package/src/websitalk/scans/__tests__/scans.spec.ts +362 -362
  265. package/src/websitalk/scans/index.ts +4 -4
  266. package/src/websitalk/scans/scans.constants.ts +18 -18
  267. package/src/websitalk/scans/scans.getters.ts +172 -172
  268. package/src/websitalk/scans/scans.types.ts +58 -58
  269. package/src/websitalk/scans/scans.utils.ts +5 -5
  270. package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +77 -77
  271. package/src/websitalk/websiteUrls/index.ts +2 -2
  272. package/src/websitalk/websiteUrls/websiteUrls.getters.ts +65 -65
  273. package/src/websitalk/websiteUrls/websiteUrls.types.ts +13 -13
  274. package/tsconfig.json +23 -23
@@ -1,2 +1,2 @@
1
- export * from "./products.types";
2
- export * from "./products.getters";
1
+ export * from "./products.types";
2
+ export * from "./products.getters";
@@ -1,12 +1,12 @@
1
- import { Collection, WithId } from "mongodb";
2
- import { getDb } from "../index";
3
- import type { Product } from "./products.types";
4
-
5
- export const getProductsCollection = (): Collection<Product> => {
6
- return getDb().collection<Product>("products");
7
- };
8
-
9
- /** Returns all product documents */
10
- export const getAllProducts = (): Promise<WithId<Product>[]> => {
11
- return getProductsCollection().find().toArray();
12
- };
1
+ import { Collection, WithId } from "mongodb";
2
+ import { getDb } from "../index";
3
+ import type { Product } from "./products.types";
4
+
5
+ export const getProductsCollection = (): Collection<Product> => {
6
+ return getDb().collection<Product>("products");
7
+ };
8
+
9
+ /** Returns all product documents */
10
+ export const getAllProducts = (): Promise<WithId<Product>[]> => {
11
+ return getProductsCollection().find().toArray();
12
+ };
@@ -1,9 +1,9 @@
1
- import { ObjectId } from "mongodb";
2
-
3
- export type Product = {
4
- _id: ObjectId;
5
- /** Internal product name */
6
- name: string;
7
- /** Map from language name to display name, e.g. {en, Municipal} */
8
- displayName?: Record<string, string>;
9
- };
1
+ import { ObjectId } from "mongodb";
2
+
3
+ export type Product = {
4
+ _id: ObjectId;
5
+ /** Internal product name */
6
+ name: string;
7
+ /** Map from language name to display name, e.g. {en, Municipal} */
8
+ displayName?: Record<string, string>;
9
+ };
@@ -1,7 +1,7 @@
1
- export {
2
- getResultsCollection,
3
- initializeResultDocument,
4
- findResultById,
5
- findResultByCallSid,
6
- } from "./results.getter";
7
- export type * from "./results.types";
1
+ export {
2
+ getResultsCollection,
3
+ initializeResultDocument,
4
+ findResultById,
5
+ findResultByCallSid,
6
+ } from "./results.getter";
7
+ export type * from "./results.types";
@@ -1,39 +1,39 @@
1
- import { Collection, ObjectId } from "mongodb";
2
- import { getDb, Session } from "../index";
3
- import type { Result } from "./results.types";
4
-
5
- export const getResultsCollection = (): Collection<Result> =>
6
- getDb().collection<Result>("results");
7
-
8
- export const createRunId = (): string => {
9
- return `run_${new ObjectId().toString()}`;
10
- };
11
-
12
- export const initializeResultDocument = async (
13
- clientId: string,
14
- session?: Session,
15
- ): Promise<Result> => {
16
- const { insertedId } = await getResultsCollection().insertOne({
17
- runId: createRunId(),
18
- date: new Date(),
19
- calls: [],
20
- sessionId: session ? session._id!.toString() : "incomingCall",
21
- sessionName: session ? session.session_name : "incomingCall",
22
- clientId,
23
- });
24
- const result = await getResultsCollection().findOne({ _id: insertedId });
25
- if (!result) throw new Error("Failed to initialized result");
26
- return result;
27
- };
28
-
29
- export const findResultById = async (
30
- resultId: string | ObjectId,
31
- ): Promise<Result | null> => {
32
- return getResultsCollection().findOne({ _id: new ObjectId(resultId) });
33
- };
34
-
35
- export const findResultByCallSid = async (
36
- callSid: string,
37
- ): Promise<Result | null> => {
38
- return getResultsCollection().findOne({ "calls.callSid": callSid });
39
- };
1
+ import { Collection, ObjectId } from "mongodb";
2
+ import { getDb, Session } from "../index";
3
+ import type { Result } from "./results.types";
4
+
5
+ export const getResultsCollection = (): Collection<Result> =>
6
+ getDb().collection<Result>("results");
7
+
8
+ export const createRunId = (): string => {
9
+ return `run_${new ObjectId().toString()}`;
10
+ };
11
+
12
+ export const initializeResultDocument = async (
13
+ clientId: string,
14
+ session?: Session,
15
+ ): Promise<Result> => {
16
+ const { insertedId } = await getResultsCollection().insertOne({
17
+ runId: createRunId(),
18
+ date: new Date(),
19
+ calls: [],
20
+ sessionId: session ? session._id!.toString() : "incomingCall",
21
+ sessionName: session ? session.session_name : "incomingCall",
22
+ clientId,
23
+ });
24
+ const result = await getResultsCollection().findOne({ _id: insertedId });
25
+ if (!result) throw new Error("Failed to initialized result");
26
+ return result;
27
+ };
28
+
29
+ export const findResultById = async (
30
+ resultId: string | ObjectId,
31
+ ): Promise<Result | null> => {
32
+ return getResultsCollection().findOne({ _id: new ObjectId(resultId) });
33
+ };
34
+
35
+ export const findResultByCallSid = async (
36
+ callSid: string,
37
+ ): Promise<Result | null> => {
38
+ return getResultsCollection().findOne({ "calls.callSid": callSid });
39
+ };
@@ -1,25 +1,25 @@
1
- export const resultMongoSchema = {
2
- bsonType: "object",
3
- required: [
4
- "_id",
5
- "sessionId",
6
- "status",
7
- "callLength",
8
- "date",
9
- "userAnswer",
10
- "systemSessionId",
11
- "clientId",
12
- ],
13
- properties: {
14
- _id: { bsonType: "objectId" },
15
- sessionId: { bsonType: "string" },
16
- status: { bsonType: "string" },
17
- callLength: { bsonType: "string" },
18
- date: { bsonType: "date" },
19
- userAnswer: { bsonType: "string" },
20
- recordingUrl: { bsonType: ["string", "null"] },
21
- systemSessionId: { bsonType: "string" },
22
- clientId: { bsonType: "string" },
23
- },
24
- additionalProperties: false,
25
- } as const;
1
+ export const resultMongoSchema = {
2
+ bsonType: "object",
3
+ required: [
4
+ "_id",
5
+ "sessionId",
6
+ "status",
7
+ "callLength",
8
+ "date",
9
+ "userAnswer",
10
+ "systemSessionId",
11
+ "clientId",
12
+ ],
13
+ properties: {
14
+ _id: { bsonType: "objectId" },
15
+ sessionId: { bsonType: "string" },
16
+ status: { bsonType: "string" },
17
+ callLength: { bsonType: "string" },
18
+ date: { bsonType: "date" },
19
+ userAnswer: { bsonType: "string" },
20
+ recordingUrl: { bsonType: ["string", "null"] },
21
+ systemSessionId: { bsonType: "string" },
22
+ clientId: { bsonType: "string" },
23
+ },
24
+ additionalProperties: false,
25
+ } as const;
@@ -1,34 +1,34 @@
1
- import { ObjectId } from "mongodb";
2
-
3
- export interface Result {
4
- _id?: ObjectId;
5
- calls: CallResult[];
6
- clientId: string;
7
- date: Date;
8
- runId: string;
9
- sessionId: ObjectId | string;
10
- sessionName: string;
11
- }
12
-
13
- export interface CallResult {
14
- callSid: string;
15
- status: string;
16
- date: Date;
17
- statuses: string[];
18
- userAnswer: string | null;
19
- color: string | null;
20
- name: string | null;
21
- callLength: string;
22
- answeredBy: string | null;
23
- to: string;
24
- from: string;
25
- transcription: TranscriptionSegment[];
26
- flowId: ObjectId | string;
27
- recordingUrl: string | null;
28
- agentHungUp?: boolean;
29
- endReason?: string;
30
- }
31
-
32
- export type TranscriptionSegment =
33
- | { assistant: string; user?: never }
34
- | { user: string; assistant?: never };
1
+ import { ObjectId } from "mongodb";
2
+
3
+ export interface Result {
4
+ _id?: ObjectId;
5
+ calls: CallResult[];
6
+ clientId: string;
7
+ date: Date;
8
+ runId: string;
9
+ sessionId: ObjectId | string;
10
+ sessionName: string;
11
+ }
12
+
13
+ export interface CallResult {
14
+ callSid: string;
15
+ status: string;
16
+ date: Date;
17
+ statuses: string[];
18
+ userAnswer: string | null;
19
+ color: string | null;
20
+ name: string | null;
21
+ callLength: string;
22
+ answeredBy: string | null;
23
+ to: string;
24
+ from: string;
25
+ transcription: TranscriptionSegment[];
26
+ flowId: ObjectId | string;
27
+ recordingUrl: string | null;
28
+ agentHungUp?: boolean;
29
+ endReason?: string;
30
+ }
31
+
32
+ export type TranscriptionSegment =
33
+ | { assistant: string; user?: never }
34
+ | { user: string; assistant?: never };
@@ -1,156 +1,156 @@
1
- import { describe, it, expect, beforeEach, jest } from "@jest/globals";
2
- import { ObjectId } from "mongodb";
3
- import {
4
- getAllRetryAnalyzeDocs,
5
- upsertRetryAnalyzeDoc,
6
- insertRetryAnalyzeDoc,
7
- updateRetryAnalyzeErrorLog,
8
- } from "../retryAnalyze.getters";
9
- import { setDb } from "../../index";
10
- import { RetryAnalyzeDoc } from "../retryAnalyze.types";
11
-
12
- describe("retryAnalyze.getters", () => {
13
- let mockCollection: any;
14
- let mockDb: any;
15
-
16
- beforeEach(() => {
17
- mockCollection = {
18
- find: jest.fn().mockReturnThis(),
19
- toArray: jest.fn(),
20
- insertOne: jest.fn(),
21
- updateOne: jest.fn(),
22
- deleteOne: jest.fn(),
23
- };
24
- mockDb = {
25
- collection: jest.fn().mockReturnValue(mockCollection),
26
- };
27
- setDb(mockDb as any);
28
- });
29
-
30
- describe("getAllRetryAnalyzeDocs", () => {
31
- it("should filter documents with retry >= 5 and include old format docs", async () => {
32
- const mockDocs = [
33
- { _id: new ObjectId(), callSid: "old-doc", errorLog: "{}" },
34
- { _id: new ObjectId(), callSid: "retry-1", errorLog: "{}", retry: 1 },
35
- { _id: new ObjectId(), callSid: "retry-5", errorLog: "{}", retry: 5 },
36
- ];
37
-
38
- mockCollection.toArray.mockResolvedValue(mockDocs);
39
-
40
- await getAllRetryAnalyzeDocs();
41
-
42
- expect(mockCollection.find).toHaveBeenCalledWith({
43
- $or: [{ retry: { $lt: 5 } }, { retry: { $exists: false } }],
44
- });
45
- });
46
- });
47
-
48
- describe("upsertRetryAnalyzeDoc", () => {
49
- const error429 = JSON.stringify({
50
- error: {
51
- code: 429,
52
- message: "Resource exhausted. Please try again later.",
53
- status: "RESOURCE_EXHAUSTED",
54
- },
55
- });
56
-
57
- it("should upsert document correctly with $setOnInsert for clientId and createdAt", async () => {
58
- const doc = {
59
- callSid: "call-123",
60
- errorLog: error429,
61
- clientId: "client-1",
62
- };
63
-
64
- mockCollection.updateOne.mockResolvedValue({
65
- upsertedId: new ObjectId(),
66
- matchedCount: 0,
67
- });
68
-
69
- await upsertRetryAnalyzeDoc(doc);
70
-
71
- expect(mockCollection.updateOne).toHaveBeenCalledWith(
72
- { callSid: doc.callSid },
73
- expect.objectContaining({
74
- $set: expect.objectContaining({
75
- errorLog: doc.errorLog,
76
- updatedAt: expect.any(Date),
77
- }),
78
- $setOnInsert: expect.objectContaining({
79
- createdAt: expect.any(Date),
80
- clientId: doc.clientId,
81
- retry: 0,
82
- }),
83
- }),
84
- { upsert: true },
85
- );
86
- });
87
-
88
- it("should ensure only one document exists for the same callSid even on multiple failures", async () => {
89
- const doc = {
90
- callSid: "CA_SINGLE_DOC",
91
- errorLog: error429,
92
- clientId: "client-1",
93
- };
94
-
95
- mockCollection.updateOne
96
- .mockResolvedValueOnce({ upsertedId: new ObjectId(), matchedCount: 0 })
97
- .mockResolvedValueOnce({ upsertedId: null, matchedCount: 1 });
98
-
99
- await upsertRetryAnalyzeDoc(doc);
100
- await upsertRetryAnalyzeDoc(doc);
101
-
102
- expect(mockCollection.updateOne).toHaveBeenCalledWith(
103
- { callSid: doc.callSid },
104
- expect.objectContaining({
105
- $setOnInsert: expect.objectContaining({ retry: 0 }),
106
- }),
107
- { upsert: true },
108
- );
109
-
110
- expect(mockCollection.updateOne).toHaveBeenLastCalledWith(
111
- { callSid: doc.callSid },
112
- { $inc: { retry: 1 } },
113
- );
114
- });
115
- });
116
-
117
- describe("insertRetryAnalyzeDoc", () => {
118
- it("should perform a simple insert", async () => {
119
- const doc: Omit<RetryAnalyzeDoc, "_id"> = {
120
- callSid: "call-456",
121
- retry: 0,
122
- clientId: "client-2",
123
- errorLog: "err",
124
- updatedAt: new Date(),
125
- createdAt: new Date(),
126
- };
127
-
128
- mockCollection.insertOne.mockResolvedValue({
129
- insertedId: new ObjectId(),
130
- });
131
-
132
- await insertRetryAnalyzeDoc(doc);
133
-
134
- expect(mockCollection.insertOne).toHaveBeenCalledWith(doc);
135
- });
136
- });
137
-
138
- describe("updateRetryAnalyzeErrorLog", () => {
139
- it("should update errorLog, updatedAt and increment retry", async () => {
140
- const id = new ObjectId();
141
- const errorLog = "new retry error";
142
-
143
- mockCollection.updateOne.mockResolvedValue({ modifiedCount: 1 });
144
-
145
- await updateRetryAnalyzeErrorLog(id, errorLog);
146
-
147
- expect(mockCollection.updateOne).toHaveBeenCalledWith(
148
- { _id: id },
149
- {
150
- $set: { errorLog, updatedAt: expect.any(Date) },
151
- $inc: { retry: 1 },
152
- },
153
- );
154
- });
155
- });
156
- });
1
+ import { describe, it, expect, beforeEach, jest } from "@jest/globals";
2
+ import { ObjectId } from "mongodb";
3
+ import {
4
+ getAllRetryAnalyzeDocs,
5
+ upsertRetryAnalyzeDoc,
6
+ insertRetryAnalyzeDoc,
7
+ updateRetryAnalyzeErrorLog,
8
+ } from "../retryAnalyze.getters";
9
+ import { setDb } from "../../index";
10
+ import { RetryAnalyzeDoc } from "../retryAnalyze.types";
11
+
12
+ describe("retryAnalyze.getters", () => {
13
+ let mockCollection: any;
14
+ let mockDb: any;
15
+
16
+ beforeEach(() => {
17
+ mockCollection = {
18
+ find: jest.fn().mockReturnThis(),
19
+ toArray: jest.fn(),
20
+ insertOne: jest.fn(),
21
+ updateOne: jest.fn(),
22
+ deleteOne: jest.fn(),
23
+ };
24
+ mockDb = {
25
+ collection: jest.fn().mockReturnValue(mockCollection),
26
+ };
27
+ setDb(mockDb as any);
28
+ });
29
+
30
+ describe("getAllRetryAnalyzeDocs", () => {
31
+ it("should filter documents with retry >= 5 and include old format docs", async () => {
32
+ const mockDocs = [
33
+ { _id: new ObjectId(), callSid: "old-doc", errorLog: "{}" },
34
+ { _id: new ObjectId(), callSid: "retry-1", errorLog: "{}", retry: 1 },
35
+ { _id: new ObjectId(), callSid: "retry-5", errorLog: "{}", retry: 5 },
36
+ ];
37
+
38
+ mockCollection.toArray.mockResolvedValue(mockDocs);
39
+
40
+ await getAllRetryAnalyzeDocs();
41
+
42
+ expect(mockCollection.find).toHaveBeenCalledWith({
43
+ $or: [{ retry: { $lt: 5 } }, { retry: { $exists: false } }],
44
+ });
45
+ });
46
+ });
47
+
48
+ describe("upsertRetryAnalyzeDoc", () => {
49
+ const error429 = JSON.stringify({
50
+ error: {
51
+ code: 429,
52
+ message: "Resource exhausted. Please try again later.",
53
+ status: "RESOURCE_EXHAUSTED",
54
+ },
55
+ });
56
+
57
+ it("should upsert document correctly with $setOnInsert for clientId and createdAt", async () => {
58
+ const doc = {
59
+ callSid: "call-123",
60
+ errorLog: error429,
61
+ clientId: "client-1",
62
+ };
63
+
64
+ mockCollection.updateOne.mockResolvedValue({
65
+ upsertedId: new ObjectId(),
66
+ matchedCount: 0,
67
+ });
68
+
69
+ await upsertRetryAnalyzeDoc(doc);
70
+
71
+ expect(mockCollection.updateOne).toHaveBeenCalledWith(
72
+ { callSid: doc.callSid },
73
+ expect.objectContaining({
74
+ $set: expect.objectContaining({
75
+ errorLog: doc.errorLog,
76
+ updatedAt: expect.any(Date),
77
+ }),
78
+ $setOnInsert: expect.objectContaining({
79
+ createdAt: expect.any(Date),
80
+ clientId: doc.clientId,
81
+ retry: 0,
82
+ }),
83
+ }),
84
+ { upsert: true },
85
+ );
86
+ });
87
+
88
+ it("should ensure only one document exists for the same callSid even on multiple failures", async () => {
89
+ const doc = {
90
+ callSid: "CA_SINGLE_DOC",
91
+ errorLog: error429,
92
+ clientId: "client-1",
93
+ };
94
+
95
+ mockCollection.updateOne
96
+ .mockResolvedValueOnce({ upsertedId: new ObjectId(), matchedCount: 0 })
97
+ .mockResolvedValueOnce({ upsertedId: null, matchedCount: 1 });
98
+
99
+ await upsertRetryAnalyzeDoc(doc);
100
+ await upsertRetryAnalyzeDoc(doc);
101
+
102
+ expect(mockCollection.updateOne).toHaveBeenCalledWith(
103
+ { callSid: doc.callSid },
104
+ expect.objectContaining({
105
+ $setOnInsert: expect.objectContaining({ retry: 0 }),
106
+ }),
107
+ { upsert: true },
108
+ );
109
+
110
+ expect(mockCollection.updateOne).toHaveBeenLastCalledWith(
111
+ { callSid: doc.callSid },
112
+ { $inc: { retry: 1 } },
113
+ );
114
+ });
115
+ });
116
+
117
+ describe("insertRetryAnalyzeDoc", () => {
118
+ it("should perform a simple insert", async () => {
119
+ const doc: Omit<RetryAnalyzeDoc, "_id"> = {
120
+ callSid: "call-456",
121
+ retry: 0,
122
+ clientId: "client-2",
123
+ errorLog: "err",
124
+ updatedAt: new Date(),
125
+ createdAt: new Date(),
126
+ };
127
+
128
+ mockCollection.insertOne.mockResolvedValue({
129
+ insertedId: new ObjectId(),
130
+ });
131
+
132
+ await insertRetryAnalyzeDoc(doc);
133
+
134
+ expect(mockCollection.insertOne).toHaveBeenCalledWith(doc);
135
+ });
136
+ });
137
+
138
+ describe("updateRetryAnalyzeErrorLog", () => {
139
+ it("should update errorLog, updatedAt and increment retry", async () => {
140
+ const id = new ObjectId();
141
+ const errorLog = "new retry error";
142
+
143
+ mockCollection.updateOne.mockResolvedValue({ modifiedCount: 1 });
144
+
145
+ await updateRetryAnalyzeErrorLog(id, errorLog);
146
+
147
+ expect(mockCollection.updateOne).toHaveBeenCalledWith(
148
+ { _id: id },
149
+ {
150
+ $set: { errorLog, updatedAt: expect.any(Date) },
151
+ $inc: { retry: 1 },
152
+ },
153
+ );
154
+ });
155
+ });
156
+ });
@@ -1,2 +1,2 @@
1
- export * from "./retryAnalyze.types";
2
- export * from "./retryAnalyze.getters";
1
+ export * from "./retryAnalyze.types";
2
+ export * from "./retryAnalyze.getters";