@talkpilot/core-db 1.3.5 → 1.3.7

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 (234) hide show
  1. package/.cursor/rules/development.mdc +65 -65
  2. package/DEVELOPMENT.md +141 -126
  3. package/README.md +190 -190
  4. package/README_OLD.md +160 -160
  5. package/dist/talkpilot/calls/calls.types.d.ts +5 -0
  6. package/dist/talkpilot/calls/calls.types.d.ts.map +1 -1
  7. package/dist/talkpilot/contextNotes/contextNotes.getters.d.ts +19 -0
  8. package/dist/talkpilot/contextNotes/contextNotes.getters.d.ts.map +1 -0
  9. package/dist/talkpilot/contextNotes/contextNotes.getters.js +57 -0
  10. package/dist/talkpilot/contextNotes/contextNotes.getters.js.map +1 -0
  11. package/dist/talkpilot/contextNotes/contextNotes.types.d.ts +19 -0
  12. package/dist/talkpilot/contextNotes/contextNotes.types.d.ts.map +1 -0
  13. package/dist/talkpilot/contextNotes/contextNotes.types.js +3 -0
  14. package/dist/talkpilot/contextNotes/contextNotes.types.js.map +1 -0
  15. package/dist/talkpilot/contextNotes/index.d.ts +3 -0
  16. package/dist/talkpilot/contextNotes/index.d.ts.map +1 -0
  17. package/dist/talkpilot/contextNotes/index.js +19 -0
  18. package/dist/talkpilot/contextNotes/index.js.map +1 -0
  19. package/dist/talkpilot/flows/flows.schema.d.ts +3 -0
  20. package/dist/talkpilot/flows/flows.schema.d.ts.map +1 -1
  21. package/dist/talkpilot/flows/flows.schema.js +1 -0
  22. package/dist/talkpilot/flows/flows.schema.js.map +1 -1
  23. package/dist/talkpilot/flows/flows.types.d.ts +2 -0
  24. package/dist/talkpilot/flows/flows.types.d.ts.map +1 -1
  25. package/dist/talkpilot/index.d.ts +2 -0
  26. package/dist/talkpilot/index.d.ts.map +1 -1
  27. package/dist/talkpilot/index.js +2 -0
  28. package/dist/talkpilot/index.js.map +1 -1
  29. package/dist/talkpilot/products/index.d.ts +3 -0
  30. package/dist/talkpilot/products/index.d.ts.map +1 -0
  31. package/dist/talkpilot/products/index.js +19 -0
  32. package/dist/talkpilot/products/index.js.map +1 -0
  33. package/dist/talkpilot/products/products.getters.d.ts +6 -0
  34. package/dist/talkpilot/products/products.getters.d.ts.map +1 -0
  35. package/dist/talkpilot/products/products.getters.js +14 -0
  36. package/dist/talkpilot/products/products.getters.js.map +1 -0
  37. package/dist/talkpilot/products/products.types.d.ts +9 -0
  38. package/dist/talkpilot/products/products.types.d.ts.map +1 -0
  39. package/dist/talkpilot/products/products.types.js +3 -0
  40. package/dist/talkpilot/products/products.types.js.map +1 -0
  41. package/dist/test-utils/factories/index.d.ts +1 -0
  42. package/dist/test-utils/factories/index.d.ts.map +1 -1
  43. package/dist/test-utils/factories/index.js +1 -0
  44. package/dist/test-utils/factories/index.js.map +1 -1
  45. package/dist/test-utils/factories/talkpilot/contextNotes.d.ts +16 -0
  46. package/dist/test-utils/factories/talkpilot/contextNotes.d.ts.map +1 -0
  47. package/dist/test-utils/factories/talkpilot/contextNotes.js +30 -0
  48. package/dist/test-utils/factories/talkpilot/contextNotes.js.map +1 -0
  49. package/jest.config.js +20 -19
  50. package/package.json +46 -46
  51. package/src/__tests__/setup.ts +20 -20
  52. package/src/connection.ts +54 -54
  53. package/src/index.ts +26 -26
  54. package/src/municipal/__tests__/validation.spec.ts +62 -62
  55. package/src/municipal/cities/cities.getters.ts +50 -50
  56. package/src/municipal/cities/cities.types.ts +11 -11
  57. package/src/municipal/cities/index.ts +2 -2
  58. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +282 -282
  59. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +72 -72
  60. package/src/municipal/departmentsSubjects/index.ts +9 -9
  61. package/src/municipal/index.ts +22 -22
  62. package/src/municipal/mongodb-client.ts +61 -61
  63. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +92 -92
  64. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +92 -92
  65. package/src/municipal/muniIssues/index.ts +17 -17
  66. package/src/municipal/muniIssues/muniIssues.constants.ts +18 -18
  67. package/src/municipal/muniIssues/muniIssues.getters.ts +24 -24
  68. package/src/municipal/muniIssues/muniIssues.schema.ts +66 -66
  69. package/src/municipal/muniIssues/muniIssues.setters.ts +24 -24
  70. package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
  71. package/src/municipal/muniIssues/muniIssues.types.ts +37 -37
  72. package/src/municipal/streets/index.ts +2 -2
  73. package/src/municipal/streets/streets.getters.ts +125 -125
  74. package/src/municipal/streets/streets.types.ts +18 -18
  75. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  76. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  77. package/src/municipal/systemInstructions/index.ts +7 -7
  78. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  79. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  80. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  81. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
  82. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +51 -51
  83. package/src/municipal/tickets/index.ts +3 -3
  84. package/src/municipal/tickets/tickets.constants.ts +8 -8
  85. package/src/municipal/tickets/tickets.getters.ts +121 -121
  86. package/src/municipal/tickets/tickets.statistics.aggregation.ts +96 -96
  87. package/src/municipal/tickets/tickets.statistics.getters.ts +71 -71
  88. package/src/municipal/tickets/tickets.types.ts +53 -53
  89. package/src/municipal/utils/types.ts +11 -11
  90. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  91. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  92. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  93. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  94. package/src/talkpilot/agents/agents.getters.ts +34 -34
  95. package/src/talkpilot/agents/agents.types.ts +14 -14
  96. package/src/talkpilot/agents/index.ts +2 -2
  97. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  98. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  99. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  100. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  101. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  102. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +149 -149
  103. package/src/talkpilot/calls/__tests__/calls.spec.ts +270 -270
  104. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +344 -344
  105. package/src/talkpilot/calls/calls.constants.ts +20 -20
  106. package/src/talkpilot/calls/calls.getters.ts +248 -248
  107. package/src/talkpilot/calls/calls.statistics.getters.ts +587 -587
  108. package/src/talkpilot/calls/calls.statistics.types.ts +44 -44
  109. package/src/talkpilot/calls/calls.types.ts +119 -116
  110. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +292 -292
  111. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
  112. package/src/talkpilot/calls/index.ts +6 -6
  113. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  114. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  115. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  116. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  117. package/src/talkpilot/clients/clients.getters.ts +16 -16
  118. package/src/talkpilot/clients/clients.types.ts +14 -14
  119. package/src/talkpilot/clients/index.ts +2 -2
  120. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +53 -53
  121. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +190 -190
  122. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +55 -55
  123. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +127 -127
  124. package/src/talkpilot/clientsConfig/index.ts +2 -2
  125. package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +176 -0
  126. package/src/talkpilot/contextNotes/contextNotes.getters.ts +86 -0
  127. package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -0
  128. package/src/talkpilot/contextNotes/index.ts +2 -0
  129. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +96 -71
  130. package/src/talkpilot/flows/flows.getter.ts +14 -14
  131. package/src/talkpilot/flows/flows.schema.ts +154 -153
  132. package/src/talkpilot/flows/flows.types.ts +187 -184
  133. package/src/talkpilot/flows/index.ts +2 -2
  134. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  135. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  136. package/src/talkpilot/groups/groups.getters.ts +30 -30
  137. package/src/talkpilot/groups/groups.types.ts +29 -29
  138. package/src/talkpilot/groups/index.ts +3 -3
  139. package/src/talkpilot/groups/phone.utils.ts +46 -46
  140. package/src/talkpilot/index.ts +31 -29
  141. package/src/talkpilot/leads/index.ts +2 -2
  142. package/src/talkpilot/leads/leads.getter.ts +6 -6
  143. package/src/talkpilot/leads/leads.schema.ts +33 -33
  144. package/src/talkpilot/leads/leads.types.ts +20 -20
  145. package/src/talkpilot/mongodb-client.ts +78 -78
  146. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +252 -252
  147. package/src/talkpilot/phone_numbers/index.ts +2 -2
  148. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +158 -158
  149. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  150. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  151. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  152. package/src/talkpilot/plans/index.ts +2 -2
  153. package/src/talkpilot/plans/plans.getters.ts +132 -132
  154. package/src/talkpilot/plans/plans.types.ts +89 -89
  155. package/src/talkpilot/products/__tests__/products.getters.spec.ts +45 -0
  156. package/src/talkpilot/products/index.ts +2 -0
  157. package/src/talkpilot/products/products.getters.ts +12 -0
  158. package/src/talkpilot/products/products.types.ts +9 -0
  159. package/src/talkpilot/results/index.ts +7 -7
  160. package/src/talkpilot/results/results.getter.ts +39 -39
  161. package/src/talkpilot/results/results.schema.ts +25 -25
  162. package/src/talkpilot/results/results.types.ts +34 -34
  163. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  164. package/src/talkpilot/retry_analyze/index.ts +2 -2
  165. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
  166. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  167. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  168. package/src/talkpilot/sessions/index.ts +2 -2
  169. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  170. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  171. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  172. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  173. package/src/talkpilot/subscriptions/index.ts +3 -3
  174. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  175. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  176. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  177. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  178. package/src/talkpilot/utils/query.utils.ts +21 -21
  179. package/src/test-utils/db-utils.ts +26 -26
  180. package/src/test-utils/factories/index.ts +15 -14
  181. package/src/test-utils/factories/municipal/cities.ts +16 -16
  182. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  183. package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
  184. package/src/test-utils/factories/municipal/streets.ts +22 -22
  185. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  186. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  187. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  188. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  189. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  190. package/src/test-utils/factories/talkpilot/contextNotes.ts +33 -0
  191. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  192. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  193. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  194. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  195. package/src/test-utils/factories/websitalk/scans.ts +23 -23
  196. package/src/utils/date.utils.ts +116 -116
  197. package/src/utils/shared.types.ts +4 -4
  198. package/src/utils/validation.ts +23 -23
  199. package/src/websitalk/index.ts +15 -15
  200. package/src/websitalk/mongodb-client.ts +61 -61
  201. package/src/websitalk/scans/__tests__/scans.spec.ts +218 -218
  202. package/src/websitalk/scans/index.ts +2 -2
  203. package/src/websitalk/scans/scans.getters.ts +113 -113
  204. package/src/websitalk/scans/scans.types.ts +53 -53
  205. package/tsconfig.json +23 -23
  206. package/.claude/settings.local.json +0 -11
  207. package/dist/municipal/tickets/tickets.deprecated.getters.d.ts +0 -12
  208. package/dist/municipal/tickets/tickets.deprecated.getters.d.ts.map +0 -1
  209. package/dist/municipal/tickets/tickets.deprecated.getters.js +0 -131
  210. package/dist/municipal/tickets/tickets.deprecated.getters.js.map +0 -1
  211. package/dist/municipal/tickets/tickets.statistics.dates.d.ts +0 -7
  212. package/dist/municipal/tickets/tickets.statistics.dates.d.ts.map +0 -1
  213. package/dist/municipal/tickets/tickets.statistics.dates.js +0 -40
  214. package/dist/municipal/tickets/tickets.statistics.dates.js.map +0 -1
  215. package/dist/municipal/tickets/tickets.statistics.pipeline.d.ts +0 -53
  216. package/dist/municipal/tickets/tickets.statistics.pipeline.d.ts.map +0 -1
  217. package/dist/municipal/tickets/tickets.statistics.pipeline.js +0 -112
  218. package/dist/municipal/tickets/tickets.statistics.pipeline.js.map +0 -1
  219. package/dist/municipal/tickets/tickets.statistics.utils.d.ts +0 -7
  220. package/dist/municipal/tickets/tickets.statistics.utils.d.ts.map +0 -1
  221. package/dist/municipal/tickets/tickets.statistics.utils.js +0 -40
  222. package/dist/municipal/tickets/tickets.statistics.utils.js.map +0 -1
  223. package/dist/talkpilot/calls/calls.statistics.ticketScope.d.ts +0 -12
  224. package/dist/talkpilot/calls/calls.statistics.ticketScope.d.ts.map +0 -1
  225. package/dist/talkpilot/calls/calls.statistics.ticketScope.js +0 -37
  226. package/dist/talkpilot/calls/calls.statistics.ticketScope.js.map +0 -1
  227. package/dist/talkpilot/calls/calls.statistics.tickets.d.ts +0 -17
  228. package/dist/talkpilot/calls/calls.statistics.tickets.d.ts.map +0 -1
  229. package/dist/talkpilot/calls/calls.statistics.tickets.js +0 -33
  230. package/dist/talkpilot/calls/calls.statistics.tickets.js.map +0 -1
  231. package/dist/utils/statistics.aggregation.d.ts +0 -20
  232. package/dist/utils/statistics.aggregation.d.ts.map +0 -1
  233. package/dist/utils/statistics.aggregation.js +0 -43
  234. package/dist/utils/statistics.aggregation.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/products/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./products.types"), exports);
18
+ __exportStar(require("./products.getters"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/talkpilot/products/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,qDAAmC"}
@@ -0,0 +1,6 @@
1
+ import { Collection, WithId } from "mongodb";
2
+ import type { Product } from "./products.types";
3
+ export declare const getProductsCollection: () => Collection<Product>;
4
+ /** Returns all product documents */
5
+ export declare const getAllProducts: () => Promise<WithId<Product>[]>;
6
+ //# sourceMappingURL=products.getters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"products.getters.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/products/products.getters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAE7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,eAAO,MAAM,qBAAqB,QAAO,UAAU,CAAC,OAAO,CAE1D,CAAC;AAEF,oCAAoC;AACpC,eAAO,MAAM,cAAc,QAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAE1D,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAllProducts = exports.getProductsCollection = void 0;
4
+ const index_1 = require("../index");
5
+ const getProductsCollection = () => {
6
+ return (0, index_1.getDb)().collection("products");
7
+ };
8
+ exports.getProductsCollection = getProductsCollection;
9
+ /** Returns all product documents */
10
+ const getAllProducts = () => {
11
+ return (0, exports.getProductsCollection)().find().toArray();
12
+ };
13
+ exports.getAllProducts = getAllProducts;
14
+ //# sourceMappingURL=products.getters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"products.getters.js","sourceRoot":"","sources":["../../../src/talkpilot/products/products.getters.ts"],"names":[],"mappings":";;;AACA,oCAAiC;AAG1B,MAAM,qBAAqB,GAAG,GAAwB,EAAE;IAC7D,OAAO,IAAA,aAAK,GAAE,CAAC,UAAU,CAAU,UAAU,CAAC,CAAC;AACjD,CAAC,CAAC;AAFW,QAAA,qBAAqB,yBAEhC;AAEF,oCAAoC;AAC7B,MAAM,cAAc,GAAG,GAA+B,EAAE;IAC7D,OAAO,IAAA,6BAAqB,GAAE,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;AAClD,CAAC,CAAC;AAFW,QAAA,cAAc,kBAEzB"}
@@ -0,0 +1,9 @@
1
+ import { ObjectId } from "mongodb";
2
+ export type Product = {
3
+ _id: ObjectId;
4
+ /** Internal product name */
5
+ name: string;
6
+ /** Map from language name to display name, e.g. {en, Municipal} */
7
+ displayName?: Record<string, string>;
8
+ };
9
+ //# sourceMappingURL=products.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"products.types.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/products/products.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,MAAM,MAAM,OAAO,GAAG;IACpB,GAAG,EAAE,QAAQ,CAAC;IACd,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=products.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"products.types.js","sourceRoot":"","sources":["../../../src/talkpilot/products/products.types.ts"],"names":[],"mappings":""}
@@ -3,6 +3,7 @@ export * from "./talkpilot/calls";
3
3
  export * from "./talkpilot/clientAudioBuffers";
4
4
  export * from "./talkpilot/clientsConfig";
5
5
  export * from "./talkpilot/flows";
6
+ export * from "./talkpilot/contextNotes";
6
7
  export * from "./talkpilot/groups";
7
8
  export * from "./talkpilot/phone_numbers";
8
9
  export * from "./talkpilot/sessions";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/test-utils/factories/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/test-utils/factories/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC"}
@@ -19,6 +19,7 @@ __exportStar(require("./talkpilot/calls"), exports);
19
19
  __exportStar(require("./talkpilot/clientAudioBuffers"), exports);
20
20
  __exportStar(require("./talkpilot/clientsConfig"), exports);
21
21
  __exportStar(require("./talkpilot/flows"), exports);
22
+ __exportStar(require("./talkpilot/contextNotes"), exports);
22
23
  __exportStar(require("./talkpilot/groups"), exports);
23
24
  __exportStar(require("./talkpilot/phone_numbers"), exports);
24
25
  __exportStar(require("./talkpilot/sessions"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/test-utils/factories/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,oDAAkC;AAClC,iEAA+C;AAC/C,4DAA0C;AAC1C,oDAAkC;AAClC,qDAAmC;AACnC,4DAA0C;AAC1C,uDAAqC;AACrC,qDAAmC;AACnC,kEAAgD;AAChD,yDAAuC;AACvC,sDAAoC;AACpC,sDAAoC;AACpC,oDAAkC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/test-utils/factories/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,oDAAkC;AAClC,iEAA+C;AAC/C,4DAA0C;AAC1C,oDAAkC;AAClC,2DAAyC;AACzC,qDAAmC;AACnC,4DAA0C;AAC1C,uDAAqC;AACrC,qDAAmC;AACnC,kEAAgD;AAChD,yDAAuC;AACvC,sDAAoC;AACpC,sDAAoC;AACpC,oDAAkC"}
@@ -0,0 +1,16 @@
1
+ import { Factory } from "fishery";
2
+ import { ObjectId } from "mongodb";
3
+ import type { ContextNote, ContextNoteEntry } from "../../../talkpilot";
4
+ export declare const contextNoteEntryFactory: Factory<ContextNoteEntry, any, ContextNoteEntry, import("fishery").DeepPartialObject<ContextNoteEntry>>;
5
+ export declare const contextNoteFactory: Factory<ContextNote & {
6
+ _id: ObjectId;
7
+ }, any, ContextNote & {
8
+ _id: ObjectId;
9
+ }, import("fishery").DeepPartialObject<ContextNote & {
10
+ _id: ObjectId;
11
+ }>>;
12
+ export declare function createContextNoteEntry(overrides?: Partial<ContextNoteEntry>): ContextNoteEntry;
13
+ export declare function createContextNote(overrides?: Partial<ContextNote>): ContextNote & {
14
+ _id: ObjectId;
15
+ };
16
+ //# sourceMappingURL=contextNotes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextNotes.d.ts","sourceRoot":"","sources":["../../../../src/test-utils/factories/talkpilot/contextNotes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAExE,eAAO,MAAM,uBAAuB,yGAQjC,CAAC;AAEJ,eAAO,MAAM,kBAAkB;SAAuC,QAAQ;;SAAR,QAAQ;;SAAR,QAAQ;GAK3E,CAAC;AAEJ,wBAAgB,sBAAsB,CACpC,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GACpC,gBAAgB,CAElB;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC/B,WAAW,GAAG;IAAE,GAAG,EAAE,QAAQ,CAAA;CAAE,CAEjC"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.contextNoteFactory = exports.contextNoteEntryFactory = void 0;
4
+ exports.createContextNoteEntry = createContextNoteEntry;
5
+ exports.createContextNote = createContextNote;
6
+ const fishery_1 = require("fishery");
7
+ const mongodb_1 = require("mongodb");
8
+ const faker_1 = require("@faker-js/faker");
9
+ exports.contextNoteEntryFactory = fishery_1.Factory.define(() => ({
10
+ _id: new mongodb_1.ObjectId(),
11
+ title: faker_1.faker.lorem.words(3),
12
+ content: faker_1.faker.lorem.sentences(2),
13
+ activeFrom: new Date(),
14
+ expiresAt: null,
15
+ createdAt: new Date(),
16
+ updatedAt: new Date(),
17
+ }));
18
+ exports.contextNoteFactory = fishery_1.Factory.define(() => ({
19
+ _id: new mongodb_1.ObjectId(),
20
+ clientId: faker_1.faker.string.uuid(),
21
+ product: "Municipal",
22
+ notes: [],
23
+ }));
24
+ function createContextNoteEntry(overrides) {
25
+ return { ...exports.contextNoteEntryFactory.build(), ...overrides };
26
+ }
27
+ function createContextNote(overrides) {
28
+ return { ...exports.contextNoteFactory.build(), ...overrides };
29
+ }
30
+ //# sourceMappingURL=contextNotes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextNotes.js","sourceRoot":"","sources":["../../../../src/test-utils/factories/talkpilot/contextNotes.ts"],"names":[],"mappings":";;;AAsBA,wDAIC;AAED,8CAIC;AAhCD,qCAAkC;AAClC,qCAAmC;AACnC,2CAAwC;AAG3B,QAAA,uBAAuB,GAAG,iBAAO,CAAC,MAAM,CAAmB,GAAG,EAAE,CAAC,CAAC;IAC7E,GAAG,EAAE,IAAI,kBAAQ,EAAE;IACnB,KAAK,EAAE,aAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE,aAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IACjC,UAAU,EAAE,IAAI,IAAI,EAAE;IACtB,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI,IAAI,EAAE;IACrB,SAAS,EAAE,IAAI,IAAI,EAAE;CACtB,CAAC,CAAC,CAAC;AAES,QAAA,kBAAkB,GAAG,iBAAO,CAAC,MAAM,CAAkC,GAAG,EAAE,CAAC,CAAC;IACvF,GAAG,EAAE,IAAI,kBAAQ,EAAE;IACnB,QAAQ,EAAE,aAAK,CAAC,MAAM,CAAC,IAAI,EAAE;IAC7B,OAAO,EAAE,WAAW;IACpB,KAAK,EAAE,EAAE;CACV,CAAC,CAAC,CAAC;AAEJ,SAAgB,sBAAsB,CACpC,SAAqC;IAErC,OAAO,EAAE,GAAG,+BAAuB,CAAC,KAAK,EAAE,EAAE,GAAG,SAAS,EAAsB,CAAC;AAClF,CAAC;AAED,SAAgB,iBAAiB,CAC/B,SAAgC;IAEhC,OAAO,EAAE,GAAG,0BAAkB,CAAC,KAAK,EAAE,EAAE,GAAG,SAAS,EAAqC,CAAC;AAC5F,CAAC"}
package/jest.config.js CHANGED
@@ -1,19 +1,20 @@
1
- /** @type {import('ts-jest').JestConfigWithTsJest} */
2
- module.exports = {
3
- preset: 'ts-jest',
4
- testEnvironment: 'node',
5
- roots: ['<rootDir>/src'],
6
- testPathIgnorePatterns: ['<rootDir>/src/__tests__/legacy/'],
7
- testMatch: ['**/__tests__/**/*.spec.ts', '**/*.spec.ts'],
8
- transform: {
9
- '^.+\\.tsx?$': ['ts-jest', {
10
- tsconfig: 'tsconfig.json',
11
- }],
12
- },
13
- setupFilesAfterEnv: ['<rootDir>/src/__tests__/setup.ts'],
14
- verbose: true,
15
- forceExit: true,
16
- clearMocks: true,
17
- resetMocks: true,
18
- restoreMocks: true,
19
- };
1
+ /** @type {import('ts-jest').JestConfigWithTsJest} */
2
+ module.exports = {
3
+ preset: 'ts-jest',
4
+ testEnvironment: 'node',
5
+ roots: ['<rootDir>/src'],
6
+ testPathIgnorePatterns: ['<rootDir>/src/__tests__/legacy/'],
7
+ testMatch: ['**/__tests__/**/*.spec.ts', '**/*.spec.ts'],
8
+ transform: {
9
+ '^.+\\.tsx?$': ['ts-jest', {
10
+ tsconfig: 'tsconfig.json',
11
+ }],
12
+ },
13
+ setupFilesAfterEnv: ['<rootDir>/src/__tests__/setup.ts'],
14
+ maxWorkers: 1,
15
+ verbose: true,
16
+ forceExit: true,
17
+ clearMocks: true,
18
+ resetMocks: true,
19
+ restoreMocks: true,
20
+ };
package/package.json CHANGED
@@ -1,46 +1,46 @@
1
- {
2
- "name": "@talkpilot/core-db",
3
- "version": "1.3.5",
4
- "description": "Core database package for centralized connections and ORM integration.",
5
- "main": "dist/index.js",
6
- "types": "dist/index.d.ts",
7
- "scripts": {
8
- "build": "tsc",
9
- "dev": "tsc --watch",
10
- "test": "jest",
11
- "lint": "eslint 'src/**/*.{ts,tsx}'",
12
- "format": "prettier --write \"src/**/*.{ts,tsx}\"",
13
- "prepare": "npm run build"
14
- },
15
- "keywords": [
16
- "database",
17
- "orm",
18
- "typescript",
19
- "postgres",
20
- "db-client"
21
- ],
22
- "author": "",
23
- "license": "MIT",
24
- "dependencies": {
25
- "dayjs": "^1.11.21",
26
- "express": "^4.18.0",
27
- "google-libphonenumber": "^3.2.0",
28
- "mongodb": "^6.11.0"
29
- },
30
- "devDependencies": {
31
- "@faker-js/faker": "^8.0.0",
32
- "@types/express": "^4.17.0",
33
- "@types/google-libphonenumber": "^7.4.0",
34
- "@types/jest": "^29.0.0",
35
- "@types/node": "^20.0.0",
36
- "fishery": "^2.4.0",
37
- "jest": "^29.0.0",
38
- "mongodb-memory-server": "^10.0.0",
39
- "prettier": "^3.8.2",
40
- "ts-jest": "^29.0.0",
41
- "typescript": "^5.0.0"
42
- },
43
- "publishConfig": {
44
- "access": "public"
45
- }
46
- }
1
+ {
2
+ "name": "@talkpilot/core-db",
3
+ "version": "1.3.7",
4
+ "description": "Core database package for centralized connections and ORM integration.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "dev": "tsc --watch",
10
+ "test": "jest",
11
+ "lint": "eslint 'src/**/*.{ts,tsx}'",
12
+ "format": "prettier --write \"src/**/*.{ts,tsx}\"",
13
+ "prepare": "npm run build"
14
+ },
15
+ "keywords": [
16
+ "database",
17
+ "orm",
18
+ "typescript",
19
+ "postgres",
20
+ "db-client"
21
+ ],
22
+ "author": "",
23
+ "license": "MIT",
24
+ "dependencies": {
25
+ "dayjs": "^1.11.21",
26
+ "express": "^4.18.0",
27
+ "google-libphonenumber": "^3.2.0",
28
+ "mongodb": "^6.11.0"
29
+ },
30
+ "devDependencies": {
31
+ "@faker-js/faker": "^8.0.0",
32
+ "@types/express": "^4.17.0",
33
+ "@types/google-libphonenumber": "^7.4.0",
34
+ "@types/jest": "^29.0.0",
35
+ "@types/node": "^20.0.0",
36
+ "fishery": "^2.4.0",
37
+ "jest": "^29.0.0",
38
+ "mongodb-memory-server": "^10.0.0",
39
+ "prettier": "^3.8.2",
40
+ "ts-jest": "^29.0.0",
41
+ "typescript": "^5.0.0"
42
+ },
43
+ "publishConfig": {
44
+ "access": "public"
45
+ }
46
+ }
@@ -1,20 +1,20 @@
1
- import { initTestDb, closeTestDb } from "../test-utils/db-utils";
2
-
3
- declare global {
4
- // eslint-disable-next-line no-var
5
- var db: import("mongodb").Db;
6
- }
7
-
8
- // Set up global mocks if needed
9
- // global.fetch = jest.fn();
10
-
11
- beforeEach(async () => {
12
- global.db = await initTestDb();
13
- }, 30_000);
14
-
15
- afterEach(async () => {
16
- await closeTestDb();
17
- jest.resetAllMocks();
18
- });
19
-
20
- process.env.NODE_ENV = "test";
1
+ import { initTestDb, closeTestDb } from "../test-utils/db-utils";
2
+
3
+ declare global {
4
+ // eslint-disable-next-line no-var
5
+ var db: import("mongodb").Db;
6
+ }
7
+
8
+ // Set up global mocks if needed
9
+ // global.fetch = jest.fn();
10
+
11
+ beforeEach(async () => {
12
+ global.db = await initTestDb();
13
+ }, 30_000);
14
+
15
+ afterEach(async () => {
16
+ await closeTestDb();
17
+ jest.resetAllMocks();
18
+ });
19
+
20
+ process.env.NODE_ENV = "test";
package/src/connection.ts CHANGED
@@ -1,54 +1,54 @@
1
- import { mongodbClient } from "./talkpilot";
2
- import { municipalDataMongodbClient } from "./municipal";
3
- import { websitalkMongodbClient } from "./websitalk";
4
-
5
- let isConnected = false;
6
-
7
- /**
8
- * Ensures the database clients are initialized.
9
- * This function reads from MONGO_URI.
10
- */
11
- export async function ensureDbConnected() {
12
- if (isConnected) {
13
- return;
14
- }
15
-
16
- const mongoUri = process.env.MONGO_URI || process.env.MONGODB_URI;
17
- const talkpilotUri = mongoUri;
18
- const municipalUri = mongoUri;
19
- const websiteTalkUri = mongoUri;
20
-
21
- if (!talkpilotUri) {
22
- console.warn("[core-db] MONGO_URI is not set");
23
- } else {
24
- const dbNameFromUri = talkpilotUri.split("/").pop()?.split("?")[0];
25
- const dbName = dbNameFromUri || process.env.TALKPILOT_DB_NAME;
26
- await mongodbClient.connect(talkpilotUri, dbName);
27
- console.info(
28
- `[core-db] Connected to TalkPilot MongoDB: ${dbName || "via env"}`,
29
- );
30
- }
31
-
32
- if (!municipalUri) {
33
- console.warn("[core-db] MONGO_URI is not set");
34
- } else {
35
- const dbNameFromUri = municipalUri.split("/").pop()?.split("?")[0];
36
- const dbName = dbNameFromUri || process.env.MUNICIPAL_DB_NAME;
37
- await municipalDataMongodbClient.connect(municipalUri, dbName);
38
- console.info(
39
- `[core-db] Connected to Municipal Data MongoDB: ${dbName || "via env"}`,
40
- );
41
- }
42
-
43
- if (!websiteTalkUri) {
44
- console.warn("[core-db] MONGO_URI is not set");
45
- } else {
46
- const dbName = process.env.WEBSITALK_DB_NAME;
47
- await websitalkMongodbClient.connect(websiteTalkUri, dbName);
48
- console.info(
49
- `[core-db] Connected to Website Talk MongoDB: ${dbName || "website-talk (default)"}`,
50
- );
51
- }
52
-
53
- isConnected = true;
54
- }
1
+ import { mongodbClient } from "./talkpilot";
2
+ import { municipalDataMongodbClient } from "./municipal";
3
+ import { websitalkMongodbClient } from "./websitalk";
4
+
5
+ let isConnected = false;
6
+
7
+ /**
8
+ * Ensures the database clients are initialized.
9
+ * This function reads from MONGO_URI.
10
+ */
11
+ export async function ensureDbConnected() {
12
+ if (isConnected) {
13
+ return;
14
+ }
15
+
16
+ const mongoUri = process.env.MONGO_URI || process.env.MONGODB_URI;
17
+ const talkpilotUri = mongoUri;
18
+ const municipalUri = mongoUri;
19
+ const websiteTalkUri = mongoUri;
20
+
21
+ if (!talkpilotUri) {
22
+ console.warn("[core-db] MONGO_URI is not set");
23
+ } else {
24
+ const dbNameFromUri = talkpilotUri.split("/").pop()?.split("?")[0];
25
+ const dbName = dbNameFromUri || process.env.TALKPILOT_DB_NAME;
26
+ await mongodbClient.connect(talkpilotUri, dbName);
27
+ console.info(
28
+ `[core-db] Connected to TalkPilot MongoDB: ${dbName || "via env"}`,
29
+ );
30
+ }
31
+
32
+ if (!municipalUri) {
33
+ console.warn("[core-db] MONGO_URI is not set");
34
+ } else {
35
+ const dbNameFromUri = municipalUri.split("/").pop()?.split("?")[0];
36
+ const dbName = dbNameFromUri || process.env.MUNICIPAL_DB_NAME;
37
+ await municipalDataMongodbClient.connect(municipalUri, dbName);
38
+ console.info(
39
+ `[core-db] Connected to Municipal Data MongoDB: ${dbName || "via env"}`,
40
+ );
41
+ }
42
+
43
+ if (!websiteTalkUri) {
44
+ console.warn("[core-db] MONGO_URI is not set");
45
+ } else {
46
+ const dbName = process.env.WEBSITALK_DB_NAME;
47
+ await websitalkMongodbClient.connect(websiteTalkUri, dbName);
48
+ console.info(
49
+ `[core-db] Connected to Website Talk MongoDB: ${dbName || "website-talk (default)"}`,
50
+ );
51
+ }
52
+
53
+ isConnected = true;
54
+ }
package/src/index.ts CHANGED
@@ -1,26 +1,26 @@
1
- // TalkPilot DB exports
2
- export * from "./talkpilot";
3
- export * from "./connection";
4
-
5
- export {
6
- municipalDataMongodbClient,
7
- getDb as getMunicipalDataDb,
8
- setDb as setMunicipalDataDb,
9
- ObjectId as MunicipalDataObjectId,
10
- } from "./municipal";
11
- export * from "./municipal/cities";
12
- export * from "./municipal/streets";
13
- export * from "./municipal/departmentsSubjects";
14
- export * from "./municipal/tickets";
15
- export * from "./municipal/systemInstructions";
16
- export * from "./municipal/muniIssues";
17
- export * from "./municipal/utils/types";
18
-
19
- export {
20
- websitalkMongodbClient,
21
- getDb as getWebsitalkDb,
22
- setDb as setWebsitalkDb,
23
- ObjectId as WebsitalkObjectId,
24
- } from "./websitalk";
25
- export * from "./websitalk/scans/scans.getters";
26
- export type * from "./websitalk/scans/scans.types";
1
+ // TalkPilot DB exports
2
+ export * from "./talkpilot";
3
+ export * from "./connection";
4
+
5
+ export {
6
+ municipalDataMongodbClient,
7
+ getDb as getMunicipalDataDb,
8
+ setDb as setMunicipalDataDb,
9
+ ObjectId as MunicipalDataObjectId,
10
+ } from "./municipal";
11
+ export * from "./municipal/cities";
12
+ export * from "./municipal/streets";
13
+ export * from "./municipal/departmentsSubjects";
14
+ export * from "./municipal/tickets";
15
+ export * from "./municipal/systemInstructions";
16
+ export * from "./municipal/muniIssues";
17
+ export * from "./municipal/utils/types";
18
+
19
+ export {
20
+ websitalkMongodbClient,
21
+ getDb as getWebsitalkDb,
22
+ setDb as setWebsitalkDb,
23
+ ObjectId as WebsitalkObjectId,
24
+ } from "./websitalk";
25
+ export * from "./websitalk/scans/scans.getters";
26
+ export type * from "./websitalk/scans/scans.types";
@@ -1,62 +1,62 @@
1
- import { municipalDataMongodbClient } from "../mongodb-client";
2
- import { MongoClient } from "mongodb";
3
-
4
- describe("MunicipalDataMongoDBClient 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
-
12
- // Force reset singleton state
13
- (municipalDataMongodbClient as any).client = null;
14
- (municipalDataMongodbClient as any).db = null;
15
- });
16
-
17
- afterAll(async () => {
18
- process.env = originalEnv;
19
- await municipalDataMongodbClient.disconnect();
20
- });
21
-
22
- it("should succeed with default database name if only URI is provided", async () => {
23
- const mockDb = { databaseName: "municipal-data" };
24
- const connectSpy = jest
25
- .spyOn(MongoClient.prototype, "connect")
26
- .mockResolvedValue({} as any);
27
- const dbSpy = jest
28
- .spyOn(MongoClient.prototype, "db")
29
- .mockReturnValue(mockDb as any);
30
-
31
- const validUri = "mongodb://127.0.0.1:27017";
32
- await municipalDataMongodbClient.connect(validUri);
33
-
34
- expect(municipalDataMongodbClient.getDb()).toBeDefined();
35
- expect(municipalDataMongodbClient.getDb().databaseName).toBe(
36
- "municipal-data",
37
- );
38
-
39
- connectSpy.mockRestore();
40
- dbSpy.mockRestore();
41
- });
42
-
43
- it("should allow overriding the default database name", async () => {
44
- const mockDb = { databaseName: "custom-municipal-db" };
45
- const connectSpy = jest
46
- .spyOn(MongoClient.prototype, "connect")
47
- .mockResolvedValue({} as any);
48
- const dbSpy = jest
49
- .spyOn(MongoClient.prototype, "db")
50
- .mockReturnValue(mockDb as any);
51
-
52
- const validUri = "mongodb://127.0.0.1:27017";
53
- await municipalDataMongodbClient.connect(validUri, "custom-municipal-db");
54
-
55
- expect(municipalDataMongodbClient.getDb().databaseName).toBe(
56
- "custom-municipal-db",
57
- );
58
-
59
- connectSpy.mockRestore();
60
- dbSpy.mockRestore();
61
- });
62
- });
1
+ import { municipalDataMongodbClient } from "../mongodb-client";
2
+ import { MongoClient } from "mongodb";
3
+
4
+ describe("MunicipalDataMongoDBClient 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
+
12
+ // Force reset singleton state
13
+ (municipalDataMongodbClient as any).client = null;
14
+ (municipalDataMongodbClient as any).db = null;
15
+ });
16
+
17
+ afterAll(async () => {
18
+ process.env = originalEnv;
19
+ await municipalDataMongodbClient.disconnect();
20
+ });
21
+
22
+ it("should succeed with default database name if only URI is provided", async () => {
23
+ const mockDb = { databaseName: "municipal-data" };
24
+ const connectSpy = jest
25
+ .spyOn(MongoClient.prototype, "connect")
26
+ .mockResolvedValue({} as any);
27
+ const dbSpy = jest
28
+ .spyOn(MongoClient.prototype, "db")
29
+ .mockReturnValue(mockDb as any);
30
+
31
+ const validUri = "mongodb://127.0.0.1:27017";
32
+ await municipalDataMongodbClient.connect(validUri);
33
+
34
+ expect(municipalDataMongodbClient.getDb()).toBeDefined();
35
+ expect(municipalDataMongodbClient.getDb().databaseName).toBe(
36
+ "municipal-data",
37
+ );
38
+
39
+ connectSpy.mockRestore();
40
+ dbSpy.mockRestore();
41
+ });
42
+
43
+ it("should allow overriding the default database name", async () => {
44
+ const mockDb = { databaseName: "custom-municipal-db" };
45
+ const connectSpy = jest
46
+ .spyOn(MongoClient.prototype, "connect")
47
+ .mockResolvedValue({} as any);
48
+ const dbSpy = jest
49
+ .spyOn(MongoClient.prototype, "db")
50
+ .mockReturnValue(mockDb as any);
51
+
52
+ const validUri = "mongodb://127.0.0.1:27017";
53
+ await municipalDataMongodbClient.connect(validUri, "custom-municipal-db");
54
+
55
+ expect(municipalDataMongodbClient.getDb().databaseName).toBe(
56
+ "custom-municipal-db",
57
+ );
58
+
59
+ connectSpy.mockRestore();
60
+ dbSpy.mockRestore();
61
+ });
62
+ });