@talkpilot/core-db 1.3.28 → 1.3.30

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 (104) hide show
  1. package/README.md +23 -12
  2. package/dist/index.d.ts +0 -6
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -6
  5. package/dist/index.js.map +1 -1
  6. package/dist/municipal/departmentsSubjects/departmentsSubjects.getters.d.ts +1 -15
  7. package/dist/municipal/departmentsSubjects/departmentsSubjects.getters.d.ts.map +1 -1
  8. package/dist/municipal/departmentsSubjects/departmentsSubjects.getters.js +1 -24
  9. package/dist/municipal/departmentsSubjects/departmentsSubjects.getters.js.map +1 -1
  10. package/dist/municipal/departmentsSubjects/departmentsSubjects.types.d.ts +0 -1
  11. package/dist/municipal/departmentsSubjects/departmentsSubjects.types.d.ts.map +1 -1
  12. package/dist/municipal/streets/streets.getters.d.ts +1 -2
  13. package/dist/municipal/streets/streets.getters.d.ts.map +1 -1
  14. package/dist/municipal/streets/streets.getters.js +1 -6
  15. package/dist/municipal/streets/streets.getters.js.map +1 -1
  16. package/dist/municipal/streets/streets.types.d.ts +0 -1
  17. package/dist/municipal/streets/streets.types.d.ts.map +1 -1
  18. package/dist/talkpilot/clients/clients.quota.constants.d.ts +2 -0
  19. package/dist/talkpilot/clients/clients.quota.constants.d.ts.map +1 -0
  20. package/dist/talkpilot/clients/clients.quota.constants.js +5 -0
  21. package/dist/talkpilot/clients/clients.quota.constants.js.map +1 -0
  22. package/dist/talkpilot/clients/clients.quota.getters.d.ts +7 -0
  23. package/dist/talkpilot/clients/clients.quota.getters.d.ts.map +1 -0
  24. package/dist/talkpilot/clients/clients.quota.getters.js +80 -0
  25. package/dist/talkpilot/clients/clients.quota.getters.js.map +1 -0
  26. package/dist/talkpilot/clients/clients.quota.types.d.ts +22 -0
  27. package/dist/talkpilot/clients/clients.quota.types.d.ts.map +1 -0
  28. package/dist/{bulkWrite/bulkWrite.types.js → talkpilot/clients/clients.quota.types.js} +1 -1
  29. package/dist/talkpilot/clients/clients.quota.types.js.map +1 -0
  30. package/dist/talkpilot/clients/clients.quota.utils.d.ts +8 -0
  31. package/dist/talkpilot/clients/clients.quota.utils.d.ts.map +1 -0
  32. package/dist/talkpilot/clients/clients.quota.utils.js +45 -0
  33. package/dist/talkpilot/clients/clients.quota.utils.js.map +1 -0
  34. package/dist/talkpilot/clients/clients.types.d.ts +3 -0
  35. package/dist/talkpilot/clients/clients.types.d.ts.map +1 -1
  36. package/dist/talkpilot/clients/index.d.ts +2 -0
  37. package/dist/talkpilot/clients/index.d.ts.map +1 -1
  38. package/dist/talkpilot/clients/index.js +2 -0
  39. package/dist/talkpilot/clients/index.js.map +1 -1
  40. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts +5 -0
  41. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts.map +1 -1
  42. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js +37 -1
  43. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js.map +1 -1
  44. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts +3 -0
  45. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts.map +1 -1
  46. package/package.json +1 -1
  47. package/src/index.ts +0 -7
  48. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +3 -38
  49. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +0 -1
  50. package/src/municipal/streets/streets.getters.ts +1 -16
  51. package/src/municipal/streets/streets.types.ts +0 -1
  52. package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -0
  53. package/src/talkpilot/clients/clients.quota.getters.ts +119 -0
  54. package/src/talkpilot/clients/clients.quota.types.ts +25 -0
  55. package/src/talkpilot/clients/clients.types.ts +4 -0
  56. package/src/talkpilot/clients/index.ts +2 -0
  57. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +21 -0
  58. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +54 -0
  59. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +4 -0
  60. package/dist/bulkWrite/bulkWrite.ops.d.ts +0 -17
  61. package/dist/bulkWrite/bulkWrite.ops.d.ts.map +0 -1
  62. package/dist/bulkWrite/bulkWrite.ops.js +0 -35
  63. package/dist/bulkWrite/bulkWrite.ops.js.map +0 -1
  64. package/dist/bulkWrite/bulkWrite.types.d.ts +0 -4
  65. package/dist/bulkWrite/bulkWrite.types.d.ts.map +0 -1
  66. package/dist/bulkWrite/bulkWrite.types.js.map +0 -1
  67. package/dist/bulkWrite/index.d.ts +0 -3
  68. package/dist/bulkWrite/index.d.ts.map +0 -1
  69. package/dist/bulkWrite/index.js +0 -19
  70. package/dist/bulkWrite/index.js.map +0 -1
  71. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.d.ts +0 -10
  72. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.d.ts.map +0 -1
  73. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.js +0 -15
  74. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.js.map +0 -1
  75. package/dist/municipal/streets/streets.setters.d.ts +0 -10
  76. package/dist/municipal/streets/streets.setters.d.ts.map +0 -1
  77. package/dist/municipal/streets/streets.setters.js +0 -15
  78. package/dist/municipal/streets/streets.setters.js.map +0 -1
  79. package/dist/reconcile/index.d.ts +0 -5
  80. package/dist/reconcile/index.d.ts.map +0 -1
  81. package/dist/reconcile/index.js +0 -21
  82. package/dist/reconcile/index.js.map +0 -1
  83. package/dist/reconcile/reconcile.diff.d.ts +0 -4
  84. package/dist/reconcile/reconcile.diff.d.ts.map +0 -1
  85. package/dist/reconcile/reconcile.diff.js +0 -36
  86. package/dist/reconcile/reconcile.diff.js.map +0 -1
  87. package/dist/reconcile/reconcile.execute.d.ts +0 -7
  88. package/dist/reconcile/reconcile.execute.d.ts.map +0 -1
  89. package/dist/reconcile/reconcile.execute.js +0 -20
  90. package/dist/reconcile/reconcile.execute.js.map +0 -1
  91. package/dist/reconcile/reconcile.ops.d.ts +0 -12
  92. package/dist/reconcile/reconcile.ops.d.ts.map +0 -1
  93. package/dist/reconcile/reconcile.ops.js +0 -24
  94. package/dist/reconcile/reconcile.ops.js.map +0 -1
  95. package/dist/reconcile/reconcile.types.d.ts +0 -32
  96. package/dist/reconcile/reconcile.types.d.ts.map +0 -1
  97. package/dist/reconcile/reconcile.types.js +0 -3
  98. package/dist/reconcile/reconcile.types.js.map +0 -1
  99. package/src/bulkWrite/__tests__/bulkWrite.spec.ts +0 -65
  100. package/src/bulkWrite/bulkWrite.ops.ts +0 -45
  101. package/src/bulkWrite/bulkWrite.types.ts +0 -4
  102. package/src/bulkWrite/index.ts +0 -2
  103. package/src/municipal/departmentsSubjects/__tests__/departmentsSubjects.spec.ts +0 -272
  104. package/src/municipal/streets/__tests__/streets.spec.ts +0 -253
@@ -7,6 +7,7 @@ import {
7
7
  KnownProductKey,
8
8
  } from "../index";
9
9
  import { Collection } from "mongodb";
10
+ import { resetClientQuotaSettings } from "../clients/clients.quota.getters";
10
11
 
11
12
  export const getClientsConfigCollection = (): Collection<ClientConfigDoc> => {
12
13
  return getDb().collection<ClientConfigDoc>("clientsConfig");
@@ -16,6 +17,15 @@ export const getClientConfig = (clientId: string) => {
16
17
  return getClientsConfigCollection().findOne({ clientId });
17
18
  };
18
19
 
20
+ export const getClientDisplayName = async (clientId: string): Promise<string> => {
21
+ const doc = await getClientsConfigCollection().findOne(
22
+ { clientId },
23
+ { projection: { displayName: 1, _id: 0 } },
24
+ );
25
+ const name = doc?.displayName?.trim();
26
+ return name || clientId;
27
+ };
28
+
19
29
  export const getClientConfigByPhone = async (phone: string) => {
20
30
  const client = await findClientByPhoneNumber(phone);
21
31
  if (!client) return null;
@@ -77,3 +87,47 @@ export const clearActiveScanId = async (clientId: string): Promise<void> => {
77
87
  throw new Error(`No client config found for clientId: ${clientId}`);
78
88
  }
79
89
  };
90
+
91
+ export async function listClientIdsWithConfiguredQuota(): Promise<string[]> {
92
+ const docs = await getClientsConfigCollection()
93
+ .find({ "quota.totalQuota": { $exists: true, $ne: null } })
94
+ .project({ clientId: 1, _id: 0 })
95
+ .toArray();
96
+
97
+ return docs.map(({ clientId }) => clientId);
98
+ }
99
+
100
+ export async function incrementClientQuotaUsage(
101
+ clientId: string,
102
+ amount: number = 1,
103
+ ): Promise<void> {
104
+ const result = await getClientsConfigCollection().updateOne(
105
+ { clientId, "quota.totalQuota": { $exists: true } },
106
+ { $inc: { "quota.usedQuota": amount } },
107
+ );
108
+
109
+ if (result.matchedCount === 0) {
110
+ return;
111
+ }
112
+ }
113
+
114
+ export async function resetClientQuotaUsage(clientId: string): Promise<void> {
115
+ const result = await getClientsConfigCollection().updateOne(
116
+ { clientId },
117
+ { $set: { "quota.usedQuota": 0 } },
118
+ );
119
+
120
+ if (result.matchedCount === 0) {
121
+ throw new Error(`No client config found for clientId: ${clientId}`);
122
+ }
123
+
124
+ await resetClientQuotaSettings(clientId);
125
+ }
126
+
127
+ export {
128
+ getClientQuotaState,
129
+ updateQuotaAlertsConfig,
130
+ markQuotaAlertSent,
131
+ markQuotaExpiredSent,
132
+ resetClientQuotaSettings,
133
+ } from "../clients/clients.quota.getters";
@@ -111,14 +111,18 @@ export type CommunicationsConfig = {
111
111
  whatsapp?: WhatsappConfig;
112
112
  };
113
113
 
114
+ import type { ClientQuotaUsage } from "../clients/clients.quota.types";
115
+
114
116
  export type ClientConfig<P extends Products = Products> = {
115
117
  clientId: string;
118
+ displayName?: string;
116
119
  phoneNumber?: string;
117
120
  language?: ClientLanguageName;
118
121
  products: P;
119
122
  timezone?: string;
120
123
  communications?: CommunicationsConfig;
121
124
  callLengthThresholds?: CallLengthThresholds;
125
+ quota?: ClientQuotaUsage;
122
126
  };
123
127
 
124
128
  export type ClientConfigDoc<P extends Products = Products> = WithId<
@@ -1,17 +0,0 @@
1
- import { Document, Filter, OptionalId } from "mongodb";
2
- import { BulkWriteOp } from "./bulkWrite.types";
3
- /**
4
- * Updates specific fields on the record matching filter.
5
- * Does nothing if no record matches.
6
- */
7
- export declare function buildSetOp<T extends Document>(filter: Filter<T>, setFields: Partial<T>): BulkWriteOp<T>;
8
- /**
9
- * Updates specific fields on the record matching the filter or creates a new record if none matches.
10
- * setOnInsertFields are only applied when a new record is created; they're ignored on an update.
11
- */
12
- export declare function buildUpsertOp<T extends Document>(filter: Filter<T>, setFields: Partial<T>, setOnInsertFields?: Partial<T>): BulkWriteOp<T>;
13
- /** Creates a new record. */
14
- export declare function buildInsertOp<T extends Document>(document: OptionalId<T>): BulkWriteOp<T>;
15
- /** Permanently removes the record matching the filter. */
16
- export declare function buildDeleteOp<T extends Document>(filter: Filter<T>): BulkWriteOp<T>;
17
- //# sourceMappingURL=bulkWrite.ops.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bulkWrite.ops.d.ts","sourceRoot":"","sources":["../../src/bulkWrite/bulkWrite.ops.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,QAAQ,EAC3C,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GACpB,WAAW,CAAC,CAAC,CAAC,CAEhB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,QAAQ,EAC9C,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EACrB,iBAAiB,GAAE,OAAO,CAAC,CAAC,CAAM,GACjC,WAAW,CAAC,CAAC,CAAC,CAQhB;AAED,4BAA4B;AAC5B,wBAAgB,aAAa,CAAC,CAAC,SAAS,QAAQ,EAC9C,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,GACtB,WAAW,CAAC,CAAC,CAAC,CAEhB;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,CAAC,SAAS,QAAQ,EAC9C,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAChB,WAAW,CAAC,CAAC,CAAC,CAEhB"}
@@ -1,35 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildSetOp = buildSetOp;
4
- exports.buildUpsertOp = buildUpsertOp;
5
- exports.buildInsertOp = buildInsertOp;
6
- exports.buildDeleteOp = buildDeleteOp;
7
- /**
8
- * Updates specific fields on the record matching filter.
9
- * Does nothing if no record matches.
10
- */
11
- function buildSetOp(filter, setFields) {
12
- return { updateOne: { filter, update: { $set: setFields } } };
13
- }
14
- /**
15
- * Updates specific fields on the record matching the filter or creates a new record if none matches.
16
- * setOnInsertFields are only applied when a new record is created; they're ignored on an update.
17
- */
18
- function buildUpsertOp(filter, setFields, setOnInsertFields = {}) {
19
- return {
20
- updateOne: {
21
- filter,
22
- update: { $set: setFields, $setOnInsert: setOnInsertFields },
23
- upsert: true,
24
- },
25
- };
26
- }
27
- /** Creates a new record. */
28
- function buildInsertOp(document) {
29
- return { insertOne: { document } };
30
- }
31
- /** Permanently removes the record matching the filter. */
32
- function buildDeleteOp(filter) {
33
- return { deleteOne: { filter } };
34
- }
35
- //# sourceMappingURL=bulkWrite.ops.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bulkWrite.ops.js","sourceRoot":"","sources":["../../src/bulkWrite/bulkWrite.ops.ts"],"names":[],"mappings":";;AAOA,gCAKC;AAMD,sCAYC;AAGD,sCAIC;AAGD,sCAIC;AAzCD;;;GAGG;AACH,SAAgB,UAAU,CACxB,MAAiB,EACjB,SAAqB;IAErB,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAC3B,MAAiB,EACjB,SAAqB,EACrB,oBAAgC,EAAE;IAElC,OAAO;QACL,SAAS,EAAE;YACT,MAAM;YACN,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE;YAC5D,MAAM,EAAE,IAAI;SACb;KACF,CAAC;AACJ,CAAC;AAED,4BAA4B;AAC5B,SAAgB,aAAa,CAC3B,QAAuB;IAEvB,OAAO,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC;AACrC,CAAC;AAED,0DAA0D;AAC1D,SAAgB,aAAa,CAC3B,MAAiB;IAEjB,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;AACnC,CAAC"}
@@ -1,4 +0,0 @@
1
- import { AnyBulkWriteOperation, Document } from "mongodb";
2
- /** A single MongoDB bulk-write operation, typed against the target document shape. */
3
- export type BulkWriteOp<T extends Document> = AnyBulkWriteOperation<T>;
4
- //# sourceMappingURL=bulkWrite.types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bulkWrite.types.d.ts","sourceRoot":"","sources":["../../src/bulkWrite/bulkWrite.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE1D,sFAAsF;AACtF,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,QAAQ,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"bulkWrite.types.js","sourceRoot":"","sources":["../../src/bulkWrite/bulkWrite.types.ts"],"names":[],"mappings":""}
@@ -1,3 +0,0 @@
1
- export * from "./bulkWrite.types";
2
- export * from "./bulkWrite.ops";
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bulkWrite/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
@@ -1,19 +0,0 @@
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("./bulkWrite.types"), exports);
18
- __exportStar(require("./bulkWrite.ops"), exports);
19
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bulkWrite/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,kDAAgC"}
@@ -1,10 +0,0 @@
1
- import { AnyBulkWriteOperation, BulkWriteOptions, BulkWriteResult } from "mongodb";
2
- import { DepartmentSubject } from "./departmentsSubjects.types";
3
- /**
4
- * Generic batch write for the departmentsSubjects collection — a thin passthrough to the
5
- * driver's bulkWrite, with no diffing/key-building/business logic. `operations` must be
6
- * non-empty (the driver throws on an empty batch). Errors (including partial failures under
7
- * `{ ordered: false }`) propagate unchanged, so callers can still catch `MongoBulkWriteError`.
8
- */
9
- export declare const bulkWriteDepartmentsSubjects: (operations: AnyBulkWriteOperation<DepartmentSubject>[], options?: BulkWriteOptions) => Promise<BulkWriteResult>;
10
- //# sourceMappingURL=departmentsSubjects.setters.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"departmentsSubjects.setters.d.ts","sourceRoot":"","sources":["../../../src/municipal/departmentsSubjects/departmentsSubjects.setters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAGhE;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,GACvC,YAAY,qBAAqB,CAAC,iBAAiB,CAAC,EAAE,EACtD,UAAU,gBAAgB,KACzB,OAAO,CAAC,eAAe,CAEzB,CAAC"}
@@ -1,15 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.bulkWriteDepartmentsSubjects = void 0;
4
- const departmentsSubjects_getters_1 = require("./departmentsSubjects.getters");
5
- /**
6
- * Generic batch write for the departmentsSubjects collection — a thin passthrough to the
7
- * driver's bulkWrite, with no diffing/key-building/business logic. `operations` must be
8
- * non-empty (the driver throws on an empty batch). Errors (including partial failures under
9
- * `{ ordered: false }`) propagate unchanged, so callers can still catch `MongoBulkWriteError`.
10
- */
11
- const bulkWriteDepartmentsSubjects = async (operations, options) => {
12
- return (0, departmentsSubjects_getters_1.getDepartmentsSubjectsCollection)().bulkWrite(operations, options);
13
- };
14
- exports.bulkWriteDepartmentsSubjects = bulkWriteDepartmentsSubjects;
15
- //# sourceMappingURL=departmentsSubjects.setters.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"departmentsSubjects.setters.js","sourceRoot":"","sources":["../../../src/municipal/departmentsSubjects/departmentsSubjects.setters.ts"],"names":[],"mappings":";;;AAEA,+EAAiF;AAEjF;;;;;GAKG;AACI,MAAM,4BAA4B,GAAG,KAAK,EAC/C,UAAsD,EACtD,OAA0B,EACA,EAAE;IAC5B,OAAO,IAAA,8DAAgC,GAAE,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAC3E,CAAC,CAAC;AALW,QAAA,4BAA4B,gCAKvC"}
@@ -1,10 +0,0 @@
1
- import { AnyBulkWriteOperation, BulkWriteOptions, BulkWriteResult } from "mongodb";
2
- import { Street } from "./streets.types";
3
- /**
4
- * Generic batch write for the streets collection — a thin passthrough to the driver's
5
- * bulkWrite, with no diffing/key-building/business logic. `operations` must be non-empty
6
- * (the driver throws on an empty batch). Errors (including partial failures under
7
- * `{ ordered: false }`) propagate unchanged, so callers can still catch `MongoBulkWriteError`.
8
- */
9
- export declare const bulkWriteStreets: (operations: AnyBulkWriteOperation<Street>[], options?: BulkWriteOptions) => Promise<BulkWriteResult>;
10
- //# sourceMappingURL=streets.setters.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"streets.setters.d.ts","sourceRoot":"","sources":["../../../src/municipal/streets/streets.setters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAC3B,YAAY,qBAAqB,CAAC,MAAM,CAAC,EAAE,EAC3C,UAAU,gBAAgB,KACzB,OAAO,CAAC,eAAe,CAEzB,CAAC"}
@@ -1,15 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.bulkWriteStreets = void 0;
4
- const streets_getters_1 = require("./streets.getters");
5
- /**
6
- * Generic batch write for the streets collection — a thin passthrough to the driver's
7
- * bulkWrite, with no diffing/key-building/business logic. `operations` must be non-empty
8
- * (the driver throws on an empty batch). Errors (including partial failures under
9
- * `{ ordered: false }`) propagate unchanged, so callers can still catch `MongoBulkWriteError`.
10
- */
11
- const bulkWriteStreets = async (operations, options) => {
12
- return (0, streets_getters_1.getStreetsCollection)().bulkWrite(operations, options);
13
- };
14
- exports.bulkWriteStreets = bulkWriteStreets;
15
- //# sourceMappingURL=streets.setters.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"streets.setters.js","sourceRoot":"","sources":["../../../src/municipal/streets/streets.setters.ts"],"names":[],"mappings":";;;AAEA,uDAAyD;AAEzD;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,KAAK,EACnC,UAA2C,EAC3C,OAA0B,EACA,EAAE;IAC5B,OAAO,IAAA,sCAAoB,GAAE,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC,CAAC;AALW,QAAA,gBAAgB,oBAK3B"}
@@ -1,5 +0,0 @@
1
- export * from "./reconcile.types";
2
- export * from "./reconcile.ops";
3
- export * from "./reconcile.diff";
4
- export * from "./reconcile.execute";
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reconcile/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC"}
@@ -1,21 +0,0 @@
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("./reconcile.types"), exports);
18
- __exportStar(require("./reconcile.ops"), exports);
19
- __exportStar(require("./reconcile.diff"), exports);
20
- __exportStar(require("./reconcile.execute"), exports);
21
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reconcile/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,kDAAgC;AAChC,mDAAiC;AACjC,sDAAoC"}
@@ -1,4 +0,0 @@
1
- import { Document } from "mongodb";
2
- import { ReconcileConfig, ReconcileDiffResult } from "./reconcile.types";
3
- export declare function computeReconcileDiff<TSource, TDb extends Document, TKey extends string | number>(config: ReconcileConfig<TSource, TDb, TKey>, now?: Date): ReconcileDiffResult<TDb>;
4
- //# sourceMappingURL=reconcile.diff.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconcile.diff.d.ts","sourceRoot":"","sources":["../../src/reconcile/reconcile.diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,GAAG,SAAS,QAAQ,EAAE,IAAI,SAAS,MAAM,GAAG,MAAM,EAC9F,MAAM,EAAE,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,EAC3C,GAAG,GAAE,IAAiB,GACrB,mBAAmB,CAAC,GAAG,CAAC,CA8C1B"}
@@ -1,36 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.computeReconcileDiff = computeReconcileDiff;
4
- function computeReconcileDiff(config, now = new Date()) {
5
- const { source, dbRecords, getSourceKey, getDbKey, buildInsertOp, buildUpdateOp, buildDeactivateOp, shouldDeactivate = () => true, } = config;
6
- const dbByKey = new Map(dbRecords.map((dbRecord) => [getDbKey(dbRecord), dbRecord]));
7
- const sourceKeys = new Set();
8
- const bulkOps = [];
9
- const counts = { inserted: 0, updated: 0, deactivated: 0, exists: 0 };
10
- for (const sourceRecord of source) {
11
- const key = getSourceKey(sourceRecord);
12
- sourceKeys.add(key);
13
- const dbRecord = dbByKey.get(key);
14
- if (!dbRecord) {
15
- bulkOps.push(buildInsertOp(sourceRecord, now));
16
- counts.inserted++;
17
- continue;
18
- }
19
- const updateOp = buildUpdateOp(sourceRecord, dbRecord, now);
20
- if (updateOp) {
21
- bulkOps.push(updateOp);
22
- counts.updated++;
23
- }
24
- else {
25
- counts.exists++;
26
- }
27
- }
28
- for (const dbRecord of dbRecords) {
29
- if (!sourceKeys.has(getDbKey(dbRecord)) && shouldDeactivate(dbRecord)) {
30
- bulkOps.push(buildDeactivateOp(dbRecord, now));
31
- counts.deactivated++;
32
- }
33
- }
34
- return { bulkOps, counts };
35
- }
36
- //# sourceMappingURL=reconcile.diff.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconcile.diff.js","sourceRoot":"","sources":["../../src/reconcile/reconcile.diff.ts"],"names":[],"mappings":";;AAGA,oDAiDC;AAjDD,SAAgB,oBAAoB,CAClC,MAA2C,EAC3C,MAAY,IAAI,IAAI,EAAE;IAEtB,MAAM,EACJ,MAAM,EACN,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,gBAAgB,GAAG,GAAG,EAAE,CAAC,IAAI,GAC9B,GAAG,MAAM,CAAC;IAEX,MAAM,OAAO,GAAG,IAAI,GAAG,CAAY,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,UAAU,GAAG,IAAI,GAAG,EAAQ,CAAC;IAEnC,MAAM,OAAO,GAAwC,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAEtE,KAAK,MAAM,YAAY,IAAI,MAAM,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QACvC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,QAAQ,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC5D,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC"}
@@ -1,7 +0,0 @@
1
- import { BulkWriteOptions, Collection, Document } from "mongodb";
2
- import { BulkWriteOp } from "./reconcile.types";
3
- export interface ExecuteReconcileBulkWriteResult {
4
- errors: string[];
5
- }
6
- export declare function executeReconcileBulkWrite<TDb extends Document>(collection: Collection<TDb>, bulkOps: BulkWriteOp<TDb>[], options?: BulkWriteOptions): Promise<ExecuteReconcileBulkWriteResult>;
7
- //# sourceMappingURL=reconcile.execute.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconcile.execute.d.ts","sourceRoot":"","sources":["../../src/reconcile/reconcile.execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAuB,MAAM,SAAS,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAsB,yBAAyB,CAAC,GAAG,SAAS,QAAQ,EAClE,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,EAC3B,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,EAC3B,OAAO,GAAE,gBAAqC,GAC7C,OAAO,CAAC,+BAA+B,CAAC,CAa1C"}
@@ -1,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.executeReconcileBulkWrite = executeReconcileBulkWrite;
4
- const mongodb_1 = require("mongodb");
5
- async function executeReconcileBulkWrite(collection, bulkOps, options = { ordered: false }) {
6
- if (bulkOps.length === 0)
7
- return { errors: [] };
8
- try {
9
- await collection.bulkWrite(bulkOps, options);
10
- return { errors: [] };
11
- }
12
- catch (err) {
13
- if (err instanceof mongodb_1.MongoBulkWriteError) {
14
- const writeErrors = [err.writeErrors].flat();
15
- return { errors: writeErrors.map((writeError) => `Write error: ${writeError.errmsg}`) };
16
- }
17
- return { errors: [err instanceof Error ? err.message : String(err)] };
18
- }
19
- }
20
- //# sourceMappingURL=reconcile.execute.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconcile.execute.js","sourceRoot":"","sources":["../../src/reconcile/reconcile.execute.ts"],"names":[],"mappings":";;AAOA,8DAiBC;AAxBD,qCAAsF;AAO/E,KAAK,UAAU,yBAAyB,CAC7C,UAA2B,EAC3B,OAA2B,EAC3B,UAA4B,EAAE,OAAO,EAAE,KAAK,EAAE;IAE9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,6BAAmB,EAAE,CAAC;YACvC,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7C,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,gBAAgB,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QAC1F,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IACxE,CAAC;AACH,CAAC"}
@@ -1,12 +0,0 @@
1
- import { Document, Filter } from "mongodb";
2
- import { BulkWriteOp } from "./reconcile.types";
3
- /**
4
- * updateOne with a plain $set — e.g. a deactivation:
5
- * buildSetOp({ _id }, { isActive: false, updatedAt: now })
6
- */
7
- export declare function buildSetOp<T extends Document>(filter: Filter<T>, setFields: Partial<T>): BulkWriteOp<T>;
8
- /**
9
- * updateOne with $set + $setOnInsert + upsert:true.
10
- */
11
- export declare function buildUpsertOp<T extends Document>(filter: Filter<T>, setFields: Partial<T>, setOnInsertFields?: Partial<T>): BulkWriteOp<T>;
12
- //# sourceMappingURL=reconcile.ops.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconcile.ops.d.ts","sourceRoot":"","sources":["../../src/reconcile/reconcile.ops.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAEvG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,QAAQ,EAC9C,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EACrB,iBAAiB,GAAE,OAAO,CAAC,CAAC,CAAM,GACjC,WAAW,CAAC,CAAC,CAAC,CAQhB"}
@@ -1,24 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildSetOp = buildSetOp;
4
- exports.buildUpsertOp = buildUpsertOp;
5
- /**
6
- * updateOne with a plain $set — e.g. a deactivation:
7
- * buildSetOp({ _id }, { isActive: false, updatedAt: now })
8
- */
9
- function buildSetOp(filter, setFields) {
10
- return { updateOne: { filter, update: { $set: setFields } } };
11
- }
12
- /**
13
- * updateOne with $set + $setOnInsert + upsert:true.
14
- */
15
- function buildUpsertOp(filter, setFields, setOnInsertFields = {}) {
16
- return {
17
- updateOne: {
18
- filter,
19
- update: { $set: setFields, $setOnInsert: setOnInsertFields },
20
- upsert: true,
21
- },
22
- };
23
- }
24
- //# sourceMappingURL=reconcile.ops.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconcile.ops.js","sourceRoot":"","sources":["../../src/reconcile/reconcile.ops.ts"],"names":[],"mappings":";;AAOA,gCAEC;AAKD,sCAYC;AAvBD;;;GAGG;AACH,SAAgB,UAAU,CAAqB,MAAiB,EAAE,SAAqB;IACrF,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAC3B,MAAiB,EACjB,SAAqB,EACrB,oBAAgC,EAAE;IAElC,OAAO;QACL,SAAS,EAAE;YACT,MAAM;YACN,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE;YAC5D,MAAM,EAAE,IAAI;SACb;KACF,CAAC;AACJ,CAAC"}
@@ -1,32 +0,0 @@
1
- import { AnyBulkWriteOperation, Document } from "mongodb";
2
- export type BulkWriteOp<T extends Document> = AnyBulkWriteOperation<T>;
3
- export interface ReconcileCounts {
4
- inserted: number;
5
- updated: number;
6
- deactivated: number;
7
- exists: number;
8
- }
9
- export interface ReconcileDiffResult<TDb extends Document> {
10
- bulkOps: BulkWriteOp<TDb>[];
11
- counts: ReconcileCounts;
12
- }
13
- export interface ReconcileConfig<TSource, TDb extends Document, TKey extends string | number> {
14
- source: TSource[];
15
- dbRecords: TDb[];
16
- getSourceKey: (source: TSource) => TKey;
17
- getDbKey: (dbRecord: TDb) => TKey;
18
- buildInsertOp: (source: TSource, now: Date) => BulkWriteOp<TDb>;
19
- /** Return null when unchanged — counted as `exists`, no op emitted. */
20
- buildUpdateOp: (source: TSource, existing: TDb, now: Date) => BulkWriteOp<TDb> | null;
21
- /**
22
- * Called for every dbRecord missing from source (and passing shouldDeactivate).
23
- * The caller decides the op shape entirely — typically via buildSetOp.
24
- */
25
- buildDeactivateOp: (dbRecord: TDb, now: Date) => BulkWriteOp<TDb>;
26
- /**
27
- * Whether a missing dbRecord should even be considered for deactivation.
28
- * Defaults to always true — core-db has no opinion on what "already inactive" means.
29
- */
30
- shouldDeactivate?: (dbRecord: TDb) => boolean;
31
- }
32
- //# sourceMappingURL=reconcile.types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconcile.types.d.ts","sourceRoot":"","sources":["../../src/reconcile/reconcile.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE1D,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,QAAQ,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAAC;AAEvE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB,CAAC,GAAG,SAAS,QAAQ;IACvD,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;IAC5B,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,eAAe,CAAC,OAAO,EAAE,GAAG,SAAS,QAAQ,EAAE,IAAI,SAAS,MAAM,GAAG,MAAM;IAC1F,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,SAAS,EAAE,GAAG,EAAE,CAAC;IACjB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,CAAC;IAClC,aAAa,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,KAAK,WAAW,CAAC,GAAG,CAAC,CAAC;IAChE,uEAAuE;IACvE,aAAa,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,KAAK,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACtF;;;OAGG;IACH,iBAAiB,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,KAAK,WAAW,CAAC,GAAG,CAAC,CAAC;IAClE;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,OAAO,CAAC;CAC/C"}
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=reconcile.types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconcile.types.js","sourceRoot":"","sources":["../../src/reconcile/reconcile.types.ts"],"names":[],"mappings":""}
@@ -1,65 +0,0 @@
1
- import {
2
- buildDeleteOp,
3
- buildInsertOp,
4
- buildSetOp,
5
- buildUpsertOp,
6
- } from "../bulkWrite.ops";
7
-
8
- interface TestDoc {
9
- _id: string;
10
- key: string;
11
- value: string;
12
- }
13
-
14
- describe("buildSetOp", () => {
15
- it("returns a plain $set updateOne with no upsert", () => {
16
- const op = buildSetOp<TestDoc>({ key: "k1" }, { value: "v2" });
17
- expect(op).toEqual({
18
- updateOne: { filter: { key: "k1" }, update: { $set: { value: "v2" } } },
19
- });
20
- });
21
- });
22
-
23
- describe("buildUpsertOp", () => {
24
- it("returns $set + $setOnInsert + upsert:true", () => {
25
- const op = buildUpsertOp<TestDoc>(
26
- { key: "k1" },
27
- { value: "v1" },
28
- { key: "k1" },
29
- );
30
- expect(op).toEqual({
31
- updateOne: {
32
- filter: { key: "k1" },
33
- update: { $set: { value: "v1" }, $setOnInsert: { key: "k1" } },
34
- upsert: true,
35
- },
36
- });
37
- });
38
-
39
- it("defaults $setOnInsert to an empty object when omitted", () => {
40
- const op = buildUpsertOp<TestDoc>({ key: "k1" }, { value: "v1" });
41
- expect(op).toEqual({
42
- updateOne: {
43
- filter: { key: "k1" },
44
- update: { $set: { value: "v1" }, $setOnInsert: {} },
45
- upsert: true,
46
- },
47
- });
48
- });
49
- });
50
-
51
- describe("buildInsertOp", () => {
52
- it("returns an insertOne with the given document", () => {
53
- const op = buildInsertOp<TestDoc>({ _id: "1", key: "k1", value: "v1" });
54
- expect(op).toEqual({
55
- insertOne: { document: { _id: "1", key: "k1", value: "v1" } },
56
- });
57
- });
58
- });
59
-
60
- describe("buildDeleteOp", () => {
61
- it("returns a deleteOne matching filter", () => {
62
- const op = buildDeleteOp<TestDoc>({ key: "k1" });
63
- expect(op).toEqual({ deleteOne: { filter: { key: "k1" } } });
64
- });
65
- });
@@ -1,45 +0,0 @@
1
- import { Document, Filter, OptionalId } from "mongodb";
2
- import { BulkWriteOp } from "./bulkWrite.types";
3
-
4
- /**
5
- * Updates specific fields on the record matching filter.
6
- * Does nothing if no record matches.
7
- */
8
- export function buildSetOp<T extends Document>(
9
- filter: Filter<T>,
10
- setFields: Partial<T>,
11
- ): BulkWriteOp<T> {
12
- return { updateOne: { filter, update: { $set: setFields } } };
13
- }
14
-
15
- /**
16
- * Updates specific fields on the record matching the filter or creates a new record if none matches.
17
- * setOnInsertFields are only applied when a new record is created; they're ignored on an update.
18
- */
19
- export function buildUpsertOp<T extends Document>(
20
- filter: Filter<T>,
21
- setFields: Partial<T>,
22
- setOnInsertFields: Partial<T> = {},
23
- ): BulkWriteOp<T> {
24
- return {
25
- updateOne: {
26
- filter,
27
- update: { $set: setFields, $setOnInsert: setOnInsertFields },
28
- upsert: true,
29
- },
30
- };
31
- }
32
-
33
- /** Creates a new record. */
34
- export function buildInsertOp<T extends Document>(
35
- document: OptionalId<T>,
36
- ): BulkWriteOp<T> {
37
- return { insertOne: { document } };
38
- }
39
-
40
- /** Permanently removes the record matching the filter. */
41
- export function buildDeleteOp<T extends Document>(
42
- filter: Filter<T>,
43
- ): BulkWriteOp<T> {
44
- return { deleteOne: { filter } };
45
- }
@@ -1,4 +0,0 @@
1
- import { AnyBulkWriteOperation, Document } from "mongodb";
2
-
3
- /** A single MongoDB bulk-write operation, typed against the target document shape. */
4
- export type BulkWriteOp<T extends Document> = AnyBulkWriteOperation<T>;
@@ -1,2 +0,0 @@
1
- export * from "./bulkWrite.types";
2
- export * from "./bulkWrite.ops";