@talkpilot/core-db 1.3.38 → 1.3.39

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 (233) hide show
  1. package/.cursor/rules/development.mdc +65 -65
  2. package/DEVELOPMENT.md +141 -141
  3. package/README.md +721 -721
  4. package/dist/talkpilot/clientsConfig/clientsConfig.constants.d.ts +3 -0
  5. package/dist/talkpilot/clientsConfig/clientsConfig.constants.d.ts.map +1 -0
  6. package/dist/talkpilot/clientsConfig/clientsConfig.constants.js +6 -0
  7. package/dist/talkpilot/clientsConfig/clientsConfig.constants.js.map +1 -0
  8. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts +39 -0
  9. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts.map +1 -1
  10. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js +92 -1
  11. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js.map +1 -1
  12. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts +4 -0
  13. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts.map +1 -1
  14. package/dist/talkpilot/clientsConfig/index.d.ts +1 -0
  15. package/dist/talkpilot/clientsConfig/index.d.ts.map +1 -1
  16. package/dist/talkpilot/clientsConfig/index.js +1 -0
  17. package/dist/talkpilot/clientsConfig/index.js.map +1 -1
  18. package/jest.config.js +20 -20
  19. package/package.json +46 -46
  20. package/src/__tests__/setup.ts +20 -20
  21. package/src/bulkWrite/__tests__/bulkWrite.spec.ts +65 -65
  22. package/src/bulkWrite/bulkWrite.ops.ts +45 -45
  23. package/src/bulkWrite/bulkWrite.types.ts +4 -4
  24. package/src/bulkWrite/index.ts +2 -2
  25. package/src/config.ts +9 -9
  26. package/src/configuration/index.ts +17 -17
  27. package/src/configuration/internalModels/index.ts +3 -3
  28. package/src/configuration/internalModels/internalModels.constants.ts +1 -1
  29. package/src/configuration/internalModels/internalModels.getters.ts +33 -33
  30. package/src/configuration/internalModels/internalModels.types.ts +12 -12
  31. package/src/configuration/models/index.ts +25 -25
  32. package/src/configuration/models/models.constants.ts +13 -13
  33. package/src/configuration/models/models.getters.ts +53 -53
  34. package/src/configuration/models/models.types.ts +79 -79
  35. package/src/configuration/mongodb-client.ts +62 -62
  36. package/src/configuration/prompts/index.ts +2 -2
  37. package/src/configuration/prompts/prompts.getters.ts +49 -49
  38. package/src/configuration/prompts/prompts.types.ts +11 -11
  39. package/src/connection.ts +81 -81
  40. package/src/index.ts +42 -42
  41. package/src/municipal/__tests__/validation.spec.ts +62 -62
  42. package/src/municipal/cities/cities.getters.ts +50 -50
  43. package/src/municipal/cities/cities.types.ts +11 -11
  44. package/src/municipal/cities/index.ts +2 -2
  45. package/src/municipal/departmentsSubjects/__tests__/departmentsSubjects.spec.ts +272 -272
  46. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +317 -317
  47. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +73 -73
  48. package/src/municipal/departmentsSubjects/index.ts +9 -9
  49. package/src/municipal/index.ts +22 -22
  50. package/src/municipal/mongodb-client.ts +61 -61
  51. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +94 -94
  52. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +92 -92
  53. package/src/municipal/muniIssues/index.ts +17 -17
  54. package/src/municipal/muniIssues/muniIssues.constants.ts +18 -18
  55. package/src/municipal/muniIssues/muniIssues.getters.ts +24 -24
  56. package/src/municipal/muniIssues/muniIssues.schema.ts +66 -66
  57. package/src/municipal/muniIssues/muniIssues.setters.ts +24 -24
  58. package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
  59. package/src/municipal/muniIssues/muniIssues.types.ts +37 -37
  60. package/src/municipal/streets/__tests__/streets.spec.ts +253 -253
  61. package/src/municipal/streets/index.ts +2 -2
  62. package/src/municipal/streets/streets.getters.ts +140 -140
  63. package/src/municipal/streets/streets.types.ts +19 -19
  64. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  65. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  66. package/src/municipal/systemInstructions/index.ts +7 -7
  67. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  68. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  69. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  70. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
  71. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +99 -99
  72. package/src/municipal/tickets/index.ts +9 -9
  73. package/src/municipal/tickets/tickets.constants.ts +8 -8
  74. package/src/municipal/tickets/tickets.getters.ts +121 -121
  75. package/src/municipal/tickets/tickets.statistics.aggregation.ts +110 -110
  76. package/src/municipal/tickets/tickets.statistics.getters.ts +145 -145
  77. package/src/municipal/tickets/tickets.types.ts +54 -54
  78. package/src/municipal/utils/types.ts +11 -11
  79. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  80. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  81. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  82. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  83. package/src/talkpilot/agents/agents.getters.ts +34 -34
  84. package/src/talkpilot/agents/agents.types.ts +14 -14
  85. package/src/talkpilot/agents/index.ts +2 -2
  86. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  87. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  88. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  89. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  90. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  91. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +229 -229
  92. package/src/talkpilot/calls/__tests__/calls.spec.ts +471 -471
  93. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +483 -483
  94. package/src/talkpilot/calls/calls.constants.ts +49 -49
  95. package/src/talkpilot/calls/calls.getters.ts +277 -277
  96. package/src/talkpilot/calls/calls.statistics.getters.ts +668 -668
  97. package/src/talkpilot/calls/calls.statistics.types.ts +48 -48
  98. package/src/talkpilot/calls/calls.types.ts +134 -134
  99. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +295 -295
  100. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
  101. package/src/talkpilot/calls/index.ts +6 -6
  102. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  103. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  104. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  105. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  106. package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -123
  107. package/src/talkpilot/clients/clients.getters.ts +16 -16
  108. package/src/talkpilot/clients/clients.quota.getters.ts +119 -119
  109. package/src/talkpilot/clients/clients.quota.types.ts +27 -27
  110. package/src/talkpilot/clients/clients.types.ts +18 -18
  111. package/src/talkpilot/clients/index.ts +4 -4
  112. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +318 -0
  113. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +212 -212
  114. package/src/talkpilot/clientsConfig/clientsConfig.constants.ts +2 -0
  115. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +116 -2
  116. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +4 -0
  117. package/src/talkpilot/clientsConfig/index.ts +3 -2
  118. package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +217 -217
  119. package/src/talkpilot/contextNotes/contextNotes.getters.ts +85 -85
  120. package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -20
  121. package/src/talkpilot/contextNotes/index.ts +2 -2
  122. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +99 -99
  123. package/src/talkpilot/flows/flows.getter.ts +14 -14
  124. package/src/talkpilot/flows/flows.schema.ts +155 -155
  125. package/src/talkpilot/flows/flows.types.ts +189 -189
  126. package/src/talkpilot/flows/index.ts +2 -2
  127. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  128. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  129. package/src/talkpilot/groups/groups.getters.ts +30 -30
  130. package/src/talkpilot/groups/groups.types.ts +29 -29
  131. package/src/talkpilot/groups/index.ts +3 -3
  132. package/src/talkpilot/groups/phone.utils.ts +46 -46
  133. package/src/talkpilot/index.ts +31 -31
  134. package/src/talkpilot/leads/index.ts +2 -2
  135. package/src/talkpilot/leads/leads.getter.ts +6 -6
  136. package/src/talkpilot/leads/leads.schema.ts +33 -33
  137. package/src/talkpilot/leads/leads.types.ts +20 -20
  138. package/src/talkpilot/mongodb-client.ts +78 -78
  139. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +282 -282
  140. package/src/talkpilot/phone_numbers/index.ts +2 -2
  141. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +176 -176
  142. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  143. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  144. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  145. package/src/talkpilot/plans/index.ts +2 -2
  146. package/src/talkpilot/plans/plans.getters.ts +132 -132
  147. package/src/talkpilot/plans/plans.types.ts +89 -89
  148. package/src/talkpilot/products/__tests__/products.getters.spec.ts +44 -44
  149. package/src/talkpilot/products/index.ts +2 -2
  150. package/src/talkpilot/products/products.getters.ts +12 -12
  151. package/src/talkpilot/products/products.types.ts +9 -9
  152. package/src/talkpilot/results/index.ts +7 -7
  153. package/src/talkpilot/results/results.getter.ts +39 -39
  154. package/src/talkpilot/results/results.schema.ts +25 -25
  155. package/src/talkpilot/results/results.types.ts +34 -34
  156. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  157. package/src/talkpilot/retry_analyze/index.ts +2 -2
  158. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
  159. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  160. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  161. package/src/talkpilot/sessions/index.ts +2 -2
  162. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  163. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  164. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  165. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  166. package/src/talkpilot/subscriptions/index.ts +3 -3
  167. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  168. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  169. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  170. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  171. package/src/talkpilot/utils/query.utils.ts +21 -21
  172. package/src/test-utils/db-utils.ts +33 -33
  173. package/src/test-utils/factories/index.ts +16 -16
  174. package/src/test-utils/factories/municipal/cities.ts +16 -16
  175. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  176. package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
  177. package/src/test-utils/factories/municipal/streets.ts +22 -22
  178. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  179. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  180. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  181. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  182. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  183. package/src/test-utils/factories/talkpilot/contextNotes.ts +40 -40
  184. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  185. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  186. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  187. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  188. package/src/test-utils/factories/websitalk/scans.ts +24 -24
  189. package/src/test-utils/factories/websitalk/websiteUrls.ts +17 -17
  190. package/src/utils/date.utils.ts +126 -126
  191. package/src/utils/shared.types.ts +4 -4
  192. package/src/utils/validation.ts +23 -23
  193. package/src/websitalk/index.ts +16 -16
  194. package/src/websitalk/mongodb-client.ts +61 -61
  195. package/src/websitalk/scans/__tests__/scans.spec.ts +313 -313
  196. package/src/websitalk/scans/index.ts +4 -4
  197. package/src/websitalk/scans/scans.constants.ts +15 -15
  198. package/src/websitalk/scans/scans.getters.ts +160 -160
  199. package/src/websitalk/scans/scans.types.ts +45 -45
  200. package/src/websitalk/scans/scans.utils.ts +5 -5
  201. package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +77 -77
  202. package/src/websitalk/websiteUrls/index.ts +2 -2
  203. package/src/websitalk/websiteUrls/websiteUrls.getters.ts +65 -65
  204. package/src/websitalk/websiteUrls/websiteUrls.types.ts +13 -13
  205. package/tsconfig.json +23 -23
  206. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.d.ts +0 -10
  207. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.d.ts.map +0 -1
  208. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.js +0 -15
  209. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.js.map +0 -1
  210. package/dist/municipal/streets/streets.setters.d.ts +0 -10
  211. package/dist/municipal/streets/streets.setters.d.ts.map +0 -1
  212. package/dist/municipal/streets/streets.setters.js +0 -15
  213. package/dist/municipal/streets/streets.setters.js.map +0 -1
  214. package/dist/reconcile/index.d.ts +0 -5
  215. package/dist/reconcile/index.d.ts.map +0 -1
  216. package/dist/reconcile/index.js +0 -21
  217. package/dist/reconcile/index.js.map +0 -1
  218. package/dist/reconcile/reconcile.diff.d.ts +0 -4
  219. package/dist/reconcile/reconcile.diff.d.ts.map +0 -1
  220. package/dist/reconcile/reconcile.diff.js +0 -36
  221. package/dist/reconcile/reconcile.diff.js.map +0 -1
  222. package/dist/reconcile/reconcile.execute.d.ts +0 -7
  223. package/dist/reconcile/reconcile.execute.d.ts.map +0 -1
  224. package/dist/reconcile/reconcile.execute.js +0 -20
  225. package/dist/reconcile/reconcile.execute.js.map +0 -1
  226. package/dist/reconcile/reconcile.ops.d.ts +0 -12
  227. package/dist/reconcile/reconcile.ops.d.ts.map +0 -1
  228. package/dist/reconcile/reconcile.ops.js +0 -24
  229. package/dist/reconcile/reconcile.ops.js.map +0 -1
  230. package/dist/reconcile/reconcile.types.d.ts +0 -32
  231. package/dist/reconcile/reconcile.types.d.ts.map +0 -1
  232. package/dist/reconcile/reconcile.types.js +0 -3
  233. package/dist/reconcile/reconcile.types.js.map +0 -1
@@ -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";