@talkpilot/core-db 1.3.17 → 1.3.18

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 (79) hide show
  1. package/README.md +166 -58
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/municipal/index.d.ts +1 -1
  7. package/dist/municipal/index.d.ts.map +1 -1
  8. package/dist/municipal/tickets/tickets.statistics.getters.d.ts.map +1 -1
  9. package/dist/municipal/tickets/tickets.statistics.getters.js +6 -2
  10. package/dist/municipal/tickets/tickets.statistics.getters.js.map +1 -1
  11. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts +3 -0
  12. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts.map +1 -1
  13. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js +17 -1
  14. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js.map +1 -1
  15. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts +1 -2
  16. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts.map +1 -1
  17. package/dist/talkpilot/flows/flows.schema.d.ts +3 -0
  18. package/dist/talkpilot/flows/flows.schema.d.ts.map +1 -1
  19. package/dist/talkpilot/flows/flows.schema.js +1 -0
  20. package/dist/talkpilot/flows/flows.schema.js.map +1 -1
  21. package/dist/talkpilot/flows/flows.types.d.ts +2 -0
  22. package/dist/talkpilot/flows/flows.types.d.ts.map +1 -1
  23. package/dist/test-utils/factories/index.d.ts +1 -0
  24. package/dist/test-utils/factories/index.d.ts.map +1 -1
  25. package/dist/test-utils/factories/index.js +1 -0
  26. package/dist/test-utils/factories/index.js.map +1 -1
  27. package/dist/test-utils/factories/websitalk/scans.d.ts.map +1 -1
  28. package/dist/test-utils/factories/websitalk/scans.js +2 -1
  29. package/dist/test-utils/factories/websitalk/scans.js.map +1 -1
  30. package/dist/websitalk/index.d.ts +1 -0
  31. package/dist/websitalk/index.d.ts.map +1 -1
  32. package/dist/websitalk/index.js +1 -0
  33. package/dist/websitalk/index.js.map +1 -1
  34. package/dist/websitalk/scans/index.d.ts +2 -0
  35. package/dist/websitalk/scans/index.d.ts.map +1 -1
  36. package/dist/websitalk/scans/index.js +2 -0
  37. package/dist/websitalk/scans/index.js.map +1 -1
  38. package/dist/websitalk/scans/scans.getters.d.ts +10 -3
  39. package/dist/websitalk/scans/scans.getters.d.ts.map +1 -1
  40. package/dist/websitalk/scans/scans.getters.js +49 -9
  41. package/dist/websitalk/scans/scans.getters.js.map +1 -1
  42. package/dist/websitalk/scans/scans.types.d.ts +3 -8
  43. package/dist/websitalk/scans/scans.types.d.ts.map +1 -1
  44. package/package.json +1 -1
  45. package/src/index.ts +1 -0
  46. package/src/municipal/index.ts +1 -1
  47. package/src/municipal/tickets/tickets.statistics.getters.ts +16 -3
  48. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +6 -4
  49. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +57 -5
  50. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +0 -4
  51. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +24 -0
  52. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +1 -2
  53. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +3 -0
  54. package/src/talkpilot/flows/flows.schema.ts +1 -0
  55. package/src/talkpilot/flows/flows.types.ts +2 -0
  56. package/src/test-utils/factories/index.ts +1 -0
  57. package/src/test-utils/factories/websitalk/scans.ts +2 -1
  58. package/src/test-utils/factories/websitalk/websiteUrls.ts +17 -0
  59. package/src/websitalk/index.ts +1 -0
  60. package/src/websitalk/scans/__tests__/scans.spec.ts +121 -26
  61. package/src/websitalk/scans/index.ts +2 -0
  62. package/src/websitalk/scans/scans.constants.ts +15 -0
  63. package/src/websitalk/scans/scans.getters.ts +64 -17
  64. package/src/websitalk/scans/scans.types.ts +3 -11
  65. package/src/websitalk/scans/scans.utils.ts +5 -0
  66. package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +77 -0
  67. package/src/websitalk/websiteUrls/index.ts +2 -0
  68. package/src/websitalk/websiteUrls/websiteUrls.getters.ts +65 -0
  69. package/src/websitalk/websiteUrls/websiteUrls.types.ts +13 -0
  70. package/tsconfig.json +4 -4
  71. package/README_OLD.md +0 -160
  72. package/dist/websitalk/websitalk.setup.d.ts +0 -3
  73. package/dist/websitalk/websitalk.setup.d.ts.map +0 -1
  74. package/dist/websitalk/websitalk.setup.js +0 -34
  75. package/dist/websitalk/websitalk.setup.js.map +0 -1
  76. package/dist/websitalk/websiteUrls/websiteUrls.constants.d.ts +0 -2
  77. package/dist/websitalk/websiteUrls/websiteUrls.constants.d.ts.map +0 -1
  78. package/dist/websitalk/websiteUrls/websiteUrls.constants.js +0 -5
  79. package/dist/websitalk/websiteUrls/websiteUrls.constants.js.map +0 -1
@@ -29,4 +29,5 @@ __exportStar(require("./municipal/muniIssues"), exports);
29
29
  __exportStar(require("./municipal/streets"), exports);
30
30
  __exportStar(require("./municipal/tickets"), exports);
31
31
  __exportStar(require("./websitalk/scans"), exports);
32
+ __exportStar(require("./websitalk/websiteUrls"), exports);
32
33
  //# sourceMappingURL=index.js.map
@@ -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,2DAAyC;AACzC,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;AAClC,0DAAwC"}
@@ -1 +1 @@
1
- {"version":3,"file":"scans.d.ts","sourceRoot":"","sources":["../../../../src/test-utils/factories/websitalk/scans.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE/C,eAAO,MAAM,WAAW,qEAcrB,CAAC;AAEJ,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAEjE"}
1
+ {"version":3,"file":"scans.d.ts","sourceRoot":"","sources":["../../../../src/test-utils/factories/websitalk/scans.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE/C,eAAO,MAAM,WAAW,qEAcrB,CAAC;AAEJ,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAEjE"}
@@ -4,9 +4,10 @@ exports.scanFactory = void 0;
4
4
  exports.createScanFixture = createScanFixture;
5
5
  const fishery_1 = require("fishery");
6
6
  const faker_1 = require("@faker-js/faker");
7
+ const mongodb_1 = require("mongodb");
7
8
  exports.scanFactory = fishery_1.Factory.define(() => ({
8
9
  clientId: faker_1.faker.string.uuid(),
9
- baseUrl: faker_1.faker.internet.url(),
10
+ websiteUrlId: new mongodb_1.ObjectId().toString(),
10
11
  status: "CHECKING",
11
12
  activeTasksCount: 0,
12
13
  pagesScanned: 0,
@@ -1 +1 @@
1
- {"version":3,"file":"scans.js","sourceRoot":"","sources":["../../../../src/test-utils/factories/websitalk/scans.ts"],"names":[],"mappings":";;;AAoBA,8CAEC;AAtBD,qCAAkC;AAClC,2CAAwC;AAG3B,QAAA,WAAW,GAAG,iBAAO,CAAC,MAAM,CAAO,GAAG,EAAE,CAAC,CAAC;IACrD,QAAQ,EAAE,aAAK,CAAC,MAAM,CAAC,IAAI,EAAE;IAC7B,OAAO,EAAE,aAAK,CAAC,QAAQ,CAAC,GAAG,EAAE;IAC7B,MAAM,EAAE,UAAU;IAClB,gBAAgB,EAAE,CAAC;IACnB,YAAY,EAAE,CAAC;IACf,YAAY,EAAE,CAAC;IACf,OAAO,EAAE,EAAE;IACX,UAAU,EAAE;QACV,GAAG,EAAE,aAAK,CAAC,QAAQ,CAAC,GAAG,EAAE;QACzB,UAAU,EAAE,aAAa;KAC1B;IACD,SAAS,EAAE,IAAI,IAAI,EAAE;IACrB,SAAS,EAAE,IAAI,IAAI,EAAE;CACtB,CAAC,CAAC,CAAC;AAEJ,SAAgB,iBAAiB,CAAC,SAAyB;IACzD,OAAO,mBAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"scans.js","sourceRoot":"","sources":["../../../../src/test-utils/factories/websitalk/scans.ts"],"names":[],"mappings":";;;AAqBA,8CAEC;AAvBD,qCAAkC;AAClC,2CAAwC;AACxC,qCAAmC;AAGtB,QAAA,WAAW,GAAG,iBAAO,CAAC,MAAM,CAAO,GAAG,EAAE,CAAC,CAAC;IACrD,QAAQ,EAAE,aAAK,CAAC,MAAM,CAAC,IAAI,EAAE;IAC7B,YAAY,EAAE,IAAI,kBAAQ,EAAE,CAAC,QAAQ,EAAE;IACvC,MAAM,EAAE,UAAU;IAClB,gBAAgB,EAAE,CAAC;IACnB,YAAY,EAAE,CAAC;IACf,YAAY,EAAE,CAAC;IACf,OAAO,EAAE,EAAE;IACX,UAAU,EAAE;QACV,GAAG,EAAE,aAAK,CAAC,QAAQ,CAAC,GAAG,EAAE;QACzB,UAAU,EAAE,aAAa;KAC1B;IACD,SAAS,EAAE,IAAI,IAAI,EAAE;IACrB,SAAS,EAAE,IAAI,IAAI,EAAE;CACtB,CAAC,CAAC,CAAC;AAEJ,SAAgB,iBAAiB,CAAC,SAAyB;IACzD,OAAO,mBAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { Db, ObjectId as MongoObjectId } from "mongodb";
2
2
  export * from "./scans";
3
+ export * from "./websiteUrls";
3
4
  export { websitalkMongodbClient } from "./mongodb-client";
4
5
  export declare const setDb: (d: Db) => void;
5
6
  export declare const getDb: () => Db;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/websitalk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,SAAS,CAAC;AAExD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,eAAO,MAAM,KAAK,GAAI,GAAG,EAAE,SAE1B,CAAC;AAEF,eAAO,MAAM,KAAK,QAAO,EAGxB,CAAC;AACF,eAAO,MAAM,QAAQ,sBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/websitalk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,SAAS,CAAC;AAExD,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,eAAO,MAAM,KAAK,GAAI,GAAG,EAAE,SAE1B,CAAC;AAEF,eAAO,MAAM,KAAK,QAAO,EAGxB,CAAC;AACF,eAAO,MAAM,QAAQ,sBAAgB,CAAC"}
@@ -17,6 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.ObjectId = exports.getDb = exports.setDb = exports.websitalkMongodbClient = void 0;
18
18
  const mongodb_1 = require("mongodb");
19
19
  __exportStar(require("./scans"), exports);
20
+ __exportStar(require("./websiteUrls"), exports);
20
21
  var mongodb_client_1 = require("./mongodb-client");
21
22
  Object.defineProperty(exports, "websitalkMongodbClient", { enumerable: true, get: function () { return mongodb_client_1.websitalkMongodbClient; } });
22
23
  let db;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/websitalk/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qCAAwD;AAExD,0CAAwB;AACxB,mDAA0D;AAAjD,wHAAA,sBAAsB,OAAA;AAE/B,IAAI,EAAM,CAAC;AACJ,MAAM,KAAK,GAAG,CAAC,CAAK,EAAE,EAAE;IAC7B,EAAE,GAAG,CAAC,CAAC;AACT,CAAC,CAAC;AAFW,QAAA,KAAK,SAEhB;AAEK,MAAM,KAAK,GAAG,GAAO,EAAE;IAC5B,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC5D,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAHW,QAAA,KAAK,SAGhB;AACW,QAAA,QAAQ,GAAG,kBAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/websitalk/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qCAAwD;AAExD,0CAAwB;AACxB,gDAA8B;AAC9B,mDAA0D;AAAjD,wHAAA,sBAAsB,OAAA;AAE/B,IAAI,EAAM,CAAC;AACJ,MAAM,KAAK,GAAG,CAAC,CAAK,EAAE,EAAE;IAC7B,EAAE,GAAG,CAAC,CAAC;AACT,CAAC,CAAC;AAFW,QAAA,KAAK,SAEhB;AAEK,MAAM,KAAK,GAAG,GAAO,EAAE;IAC5B,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC5D,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAHW,QAAA,KAAK,SAGhB;AACW,QAAA,QAAQ,GAAG,kBAAa,CAAC"}
@@ -1,3 +1,5 @@
1
+ export * from "./scans.constants";
1
2
  export * from "./scans.getters";
2
3
  export * from "./scans.types";
4
+ export * from "./scans.utils";
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/websitalk/scans/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/websitalk/scans/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
@@ -14,6 +14,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./scans.constants"), exports);
17
18
  __exportStar(require("./scans.getters"), exports);
18
19
  __exportStar(require("./scans.types"), exports);
20
+ __exportStar(require("./scans.utils"), exports);
19
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/websitalk/scans/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,gDAA8B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/websitalk/scans/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,kDAAgC;AAChC,gDAA8B;AAC9B,gDAA8B"}
@@ -1,12 +1,19 @@
1
1
  import { Collection, Filter, ObjectId } from "mongodb";
2
2
  import { QueryOptions } from "../../talkpilot/utils/query.utils";
3
- import type { ActiveScanStatus, Scan, ScanDoc } from "./scans.types";
3
+ import type { Scan, ScanDoc } from "./scans.types";
4
4
  export declare const getScansCollection: () => Collection<Scan>;
5
5
  export declare const getScansByClientAndDateRange: (clientId: string, startDate: Date, endDate: Date) => Promise<ScanDoc[]>;
6
6
  export declare const getScanFieldsByClientAndDateRange: <K extends keyof Scan>(clientId: string, startDate: Date, endDate: Date, fields: K[]) => Promise<Pick<ScanDoc, "_id" | K>[]>;
7
- export declare const createScanDoc: (scan: Pick<Scan, "clientId" | "baseUrl" | "notifyPhoneNumber">) => Promise<import("mongodb").InsertOneResult<Scan>>;
8
- export declare const getActiveScanStatus: (clientId: string) => Promise<ActiveScanStatus>;
7
+ export declare const createScanDoc: (scan: Pick<Scan, "clientId" | "websiteUrlId"> & Partial<Pick<Scan, "notifyPhoneNumber">>) => Promise<import("mongodb").InsertOneResult<Scan>>;
8
+ export declare const getScanById: (id: string) => Promise<ScanDoc | null>;
9
+ export declare const getScansByWebsiteUrl: (websiteUrlId: string) => Promise<ScanDoc[]>;
10
+ export declare const getLatestScanByWebsiteUrl: (websiteUrlId: string) => Promise<ScanDoc | null>;
11
+ export declare const getInProgressScanByWebsiteUrl: (websiteUrlId: string) => Promise<ScanDoc | null>;
12
+ export declare const findInProgressScansByClient: (clientId: string) => Promise<ScanDoc[]>;
9
13
  export declare const updateScanDoc: (scanId: ObjectId, updates: Partial<Omit<Scan, "clientId" | "createdAt">>) => Promise<ScanDoc | null>;
10
14
  export declare const findScansByQuery: (query: Filter<Scan>, options?: QueryOptions) => Promise<ScanDoc[]>;
11
15
  export declare const countScans: (query: Filter<Scan>) => Promise<number>;
16
+ export declare const hasScansForWebsiteUrl: (websiteUrlId: string) => Promise<boolean>;
17
+ export declare const getLatestCompletedScanByWebsiteUrl: (websiteUrlId: string) => Promise<ScanDoc | null>;
18
+ export declare const deleteScansByWebsiteUrl: (websiteUrlId: string) => Promise<number>;
12
19
  //# sourceMappingURL=scans.getters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scans.getters.d.ts","sourceRoot":"","sources":["../../../src/websitalk/scans/scans.getters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEvD,OAAO,EAEL,YAAY,EACb,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EACV,gBAAgB,EAChB,IAAI,EACJ,OAAO,EAER,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,kBAAkB,QAAO,UAAU,CAAC,IAAI,CAEpD,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,UAAU,MAAM,EAChB,WAAW,IAAI,EACf,SAAS,IAAI,KACZ,OAAO,CAAC,OAAO,EAAE,CAUnB,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAAI,CAAC,SAAS,MAAM,IAAI,EACpE,UAAU,MAAM,EAChB,WAAW,IAAI,EACf,SAAS,IAAI,EACb,QAAQ,CAAC,EAAE,KACV,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAkBpC,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,MAAM,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,mBAAmB,CAAC,qDAa/D,CAAC;AAIF,eAAO,MAAM,mBAAmB,GAC9B,UAAU,MAAM,KACf,OAAO,CAAC,gBAAgB,CAW1B,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,QAAQ,QAAQ,EAChB,SAAS,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC,CAAC,KACrD,OAAO,CAAC,OAAO,GAAG,IAAI,CAMxB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,EACnB,UAAU,YAAY,KACrB,OAAO,CAAC,OAAO,EAAE,CAGnB,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,OAAO,MAAM,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,MAAM,CAEpE,CAAC"}
1
+ {"version":3,"file":"scans.getters.d.ts","sourceRoot":"","sources":["../../../src/websitalk/scans/scans.getters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEvD,OAAO,EAEL,YAAY,EACb,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAInD,eAAO,MAAM,kBAAkB,QAAO,UAAU,CAAC,IAAI,CAEpD,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,UAAU,MAAM,EAChB,WAAW,IAAI,EACf,SAAS,IAAI,KACZ,OAAO,CAAC,OAAO,EAAE,CAUnB,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAAI,CAAC,SAAS,MAAM,IAAI,EACpE,UAAU,MAAM,EAChB,WAAW,IAAI,EACf,SAAS,IAAI,EACb,QAAQ,CAAC,EAAE,KACV,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAkBpC,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,MAAM,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAAC,GAC3C,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,qDAa3C,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,IAAI,MAAM,KAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAEpE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,cAAc,MAAM,KACnB,OAAO,CAAC,OAAO,EAAE,CAKnB,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,cAAc,MAAM,KACnB,OAAO,CAAC,OAAO,GAAG,IAAI,CAKxB,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,cAAc,MAAM,KACnB,OAAO,CAAC,OAAO,GAAG,IAAI,CAMxB,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,UAAU,MAAM,KACf,OAAO,CAAC,OAAO,EAAE,CAQnB,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,QAAQ,QAAQ,EAChB,SAAS,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC,CAAC,KACrD,OAAO,CAAC,OAAO,GAAG,IAAI,CAMxB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,EACnB,UAAU,YAAY,KACrB,OAAO,CAAC,OAAO,EAAE,CAGnB,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,OAAO,MAAM,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,MAAM,CAEpE,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,cAAc,MAAM,KACnB,OAAO,CAAC,OAAO,CAEjB,CAAC;AAEF,eAAO,MAAM,kCAAkC,GAC7C,cAAc,MAAM,KACnB,OAAO,CAAC,OAAO,GAAG,IAAI,CAKxB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,cAAc,MAAM,KACnB,OAAO,CAAC,MAAM,CAGhB,CAAC"}
@@ -1,8 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.countScans = exports.findScansByQuery = exports.updateScanDoc = exports.getActiveScanStatus = exports.createScanDoc = exports.getScanFieldsByClientAndDateRange = exports.getScansByClientAndDateRange = exports.getScansCollection = void 0;
3
+ exports.deleteScansByWebsiteUrl = exports.getLatestCompletedScanByWebsiteUrl = exports.hasScansForWebsiteUrl = exports.countScans = exports.findScansByQuery = exports.updateScanDoc = exports.findInProgressScansByClient = exports.getInProgressScanByWebsiteUrl = exports.getLatestScanByWebsiteUrl = exports.getScansByWebsiteUrl = exports.getScanById = exports.createScanDoc = exports.getScanFieldsByClientAndDateRange = exports.getScansByClientAndDateRange = exports.getScansCollection = void 0;
4
+ const mongodb_1 = require("mongodb");
4
5
  const index_1 = require("../index");
5
6
  const query_utils_1 = require("../../talkpilot/utils/query.utils");
7
+ const scans_constants_1 = require("./scans.constants");
8
+ const scans_utils_1 = require("./scans.utils");
6
9
  const getScansCollection = () => {
7
10
  return (0, index_1.getDb)().collection("scans");
8
11
  };
@@ -38,7 +41,7 @@ exports.getScanFieldsByClientAndDateRange = getScanFieldsByClientAndDateRange;
38
41
  const createScanDoc = (scan) => {
39
42
  return (0, exports.getScansCollection)().insertOne({
40
43
  ...scan,
41
- status: "CHECKING",
44
+ status: scans_constants_1.SCAN_STATUSES.CHECKING,
42
45
  activeTasksCount: 0,
43
46
  pagesScanned: 0,
44
47
  pagesSkipped: 0,
@@ -49,15 +52,39 @@ const createScanDoc = (scan) => {
49
52
  });
50
53
  };
51
54
  exports.createScanDoc = createScanDoc;
52
- const FINISHED_SCAN_STATUSES = ["COMPLETED", "FAILED"];
53
- const getActiveScanStatus = async (clientId) => {
54
- const latestScan = await (0, exports.getScansCollection)().findOne({ clientId }, { sort: { createdAt: -1 } });
55
- if (!latestScan || FINISHED_SCAN_STATUSES.includes(latestScan.status)) {
56
- return { isActive: false };
55
+ const getScanById = async (id) => {
56
+ return (0, exports.getScansCollection)().findOne({ _id: new mongodb_1.ObjectId(id) });
57
+ };
58
+ exports.getScanById = getScanById;
59
+ const getScansByWebsiteUrl = async (websiteUrlId) => {
60
+ return (0, exports.getScansCollection)()
61
+ .find({ websiteUrlId })
62
+ .sort({ createdAt: -1 })
63
+ .toArray();
64
+ };
65
+ exports.getScansByWebsiteUrl = getScansByWebsiteUrl;
66
+ const getLatestScanByWebsiteUrl = async (websiteUrlId) => {
67
+ return (0, exports.getScansCollection)().findOne({ websiteUrlId }, { sort: { createdAt: -1 } });
68
+ };
69
+ exports.getLatestScanByWebsiteUrl = getLatestScanByWebsiteUrl;
70
+ const getInProgressScanByWebsiteUrl = async (websiteUrlId) => {
71
+ const latestScan = await (0, exports.getLatestScanByWebsiteUrl)(websiteUrlId);
72
+ if (!latestScan || !(0, scans_utils_1.isInProgressScan)(latestScan)) {
73
+ return null;
57
74
  }
58
- return { isActive: true, status: latestScan.status };
75
+ return latestScan;
76
+ };
77
+ exports.getInProgressScanByWebsiteUrl = getInProgressScanByWebsiteUrl;
78
+ const findInProgressScansByClient = async (clientId) => {
79
+ return (0, exports.getScansCollection)()
80
+ .find({
81
+ clientId,
82
+ status: { $nin: scans_constants_1.FINISHED_SCAN_STATUSES },
83
+ })
84
+ .sort({ createdAt: -1 })
85
+ .toArray();
59
86
  };
60
- exports.getActiveScanStatus = getActiveScanStatus;
87
+ exports.findInProgressScansByClient = findInProgressScansByClient;
61
88
  const updateScanDoc = async (scanId, updates) => {
62
89
  return await (0, exports.getScansCollection)().findOneAndUpdate({ _id: scanId }, { $set: { ...updates, updatedAt: new Date() } }, { returnDocument: "after" });
63
90
  };
@@ -71,4 +98,17 @@ const countScans = async (query) => {
71
98
  return (0, exports.getScansCollection)().countDocuments(query);
72
99
  };
73
100
  exports.countScans = countScans;
101
+ const hasScansForWebsiteUrl = async (websiteUrlId) => {
102
+ return (await (0, exports.countScans)({ websiteUrlId })) > 0;
103
+ };
104
+ exports.hasScansForWebsiteUrl = hasScansForWebsiteUrl;
105
+ const getLatestCompletedScanByWebsiteUrl = async (websiteUrlId) => {
106
+ return (0, exports.getScansCollection)().findOne({ websiteUrlId, status: scans_constants_1.SCAN_STATUSES.COMPLETED }, { sort: { createdAt: -1 } });
107
+ };
108
+ exports.getLatestCompletedScanByWebsiteUrl = getLatestCompletedScanByWebsiteUrl;
109
+ const deleteScansByWebsiteUrl = async (websiteUrlId) => {
110
+ const result = await (0, exports.getScansCollection)().deleteMany({ websiteUrlId });
111
+ return result.deletedCount;
112
+ };
113
+ exports.deleteScansByWebsiteUrl = deleteScansByWebsiteUrl;
74
114
  //# sourceMappingURL=scans.getters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scans.getters.js","sourceRoot":"","sources":["../../../src/websitalk/scans/scans.getters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scans.getters.js","sourceRoot":"","sources":["../../../src/websitalk/scans/scans.getters.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,6 @@
1
1
  import { WithId } from "mongodb";
2
- export type ScanStatus = "CHECKING" | "PREPARING" | "SCANNING" | "PROCESSING" | "COMPLETED" | "FAILED";
3
- export type ActiveScanStatus = {
4
- isActive: true;
5
- status: ScanStatus;
6
- } | {
7
- isActive: false;
8
- };
2
+ import type { SCAN_STATUSES } from "./scans.constants";
3
+ export type ScanStatus = (typeof SCAN_STATUSES)[keyof typeof SCAN_STATUSES];
9
4
  export type SiteChromeEntry = {
10
5
  url: string;
11
6
  urlCanonical?: string | null;
@@ -30,7 +25,7 @@ export type SkippedEntry = {
30
25
  };
31
26
  export type Scan = {
32
27
  clientId: string;
33
- baseUrl: string;
28
+ websiteUrlId: string;
34
29
  notifyPhoneNumber?: string | null;
35
30
  status: ScanStatus;
36
31
  activeTasksCount: number;
@@ -1 +1 @@
1
- {"version":3,"file":"scans.types.d.ts","sourceRoot":"","sources":["../../../src/websitalk/scans/scans.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,MAAM,MAAM,UAAU,GAClB,UAAU,GACV,WAAW,GACX,UAAU,GACV,YAAY,GACZ,WAAW,GACX,QAAQ,CAAC;AAEb,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GACtC;IAAE,QAAQ,EAAE,KAAK,CAAA;CAAE,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,UAAU,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,EAAE,eAAe,CAAC;IAC5B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"scans.types.d.ts","sourceRoot":"","sources":["../../../src/websitalk/scans/scans.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAE5E,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,UAAU,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,EAAE,eAAe,CAAC;IAC5B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@talkpilot/core-db",
3
- "version": "1.3.17",
3
+ "version": "1.3.18",
4
4
  "description": "Core database package for centralized connections and ORM integration.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/index.ts CHANGED
@@ -24,3 +24,4 @@ export {
24
24
  } from "./websitalk";
25
25
  export * from "./websitalk/scans/scans.getters";
26
26
  export type * from "./websitalk/scans/scans.types";
27
+ export * from "./websitalk/websiteUrls";
@@ -7,7 +7,7 @@ export * from "./tickets";
7
7
  export * from "./systemInstructions";
8
8
  export * from "./muniIssues";
9
9
  export * from "./utils/types";
10
- export { CityName } from "./utils/types";
10
+ export type { CityName } from "./utils/types";
11
11
  export { municipalDataMongodbClient } from "./mongodb-client";
12
12
 
13
13
  let db: Db;
@@ -83,7 +83,12 @@ export const findCallSidsWithDraftTicketsByCity = async (
83
83
  dateScope?: TicketStatsDateScope,
84
84
  ): Promise<string[]> => {
85
85
  const rows = await runTicketStatsAggregate<{ _id: unknown }>([
86
- { $match: ticketsWithCallSidMatch(cityName, resolveTicketStatsDateRange(dateScope)) },
86
+ {
87
+ $match: ticketsWithCallSidMatch(
88
+ cityName,
89
+ resolveTicketStatsDateRange(dateScope),
90
+ ),
91
+ },
87
92
  { $match: { $expr: isDraftTicketExpr } },
88
93
  { $group: { _id: "$callSid" } },
89
94
  ]);
@@ -96,8 +101,16 @@ export const findCallSidDraftTicketCountsByCity = async (
96
101
  cityName: CityName,
97
102
  dateScope?: TicketStatsDateScope,
98
103
  ): Promise<Map<string, number>> => {
99
- const rows = await runTicketStatsAggregate<{ _id: unknown; ticketCount: number }>([
100
- { $match: ticketsWithCallSidMatch(cityName, resolveTicketStatsDateRange(dateScope)) },
104
+ const rows = await runTicketStatsAggregate<{
105
+ _id: unknown;
106
+ ticketCount: number;
107
+ }>([
108
+ {
109
+ $match: ticketsWithCallSidMatch(
110
+ cityName,
111
+ resolveTicketStatsDateRange(dateScope),
112
+ ),
113
+ },
101
114
  { $match: { $expr: isDraftTicketExpr } },
102
115
  { $group: { _id: "$callSid", ticketCount: { $sum: 1 } } },
103
116
  ]);
@@ -317,9 +317,9 @@ describe("calls statistics getters", () => {
317
317
 
318
318
  it("should respect wrap-around hour window boundaries on both the first and last day", async () => {
319
319
  await incoming("CA-jun8-morning", "2026-06-08T07:00:00.000Z"); // Jun 8 10:00 local — excluded (first-day guard)
320
- await incoming("CA-jun8-night", "2026-06-08T20:30:00.000Z"); // Jun 8 23:30 local — included
320
+ await incoming("CA-jun8-night", "2026-06-08T20:30:00.000Z"); // Jun 8 23:30 local — included
321
321
  await incoming("CA-jun9-morning", "2026-06-09T05:00:00.000Z"); // Jun 9 08:00 local — included
322
- await incoming("CA-jun9-noon", "2026-06-09T10:30:00.000Z"); // Jun 9 13:30 local — excluded (>= hourTo)
322
+ await incoming("CA-jun9-noon", "2026-06-09T10:30:00.000Z"); // Jun 9 13:30 local — excluded (>= hourTo)
323
323
  await incoming("CA-jun9-evening", "2026-06-09T20:30:00.000Z"); // Jun 9 23:30 local — excluded (last-day guard)
324
324
 
325
325
  const twoDay = { startStr: "2026-06-08", endStr: "2026-06-09" } as const;
@@ -333,9 +333,11 @@ describe("calls statistics getters", () => {
333
333
 
334
334
  // Hourly: hours [23, 0, ..., 12] — only the 2 included calls appear.
335
335
  const hourly = await aggregateCallsHourlyByRange(f);
336
- expect(hourly.map((b) => b.hour)).toEqual([23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
336
+ expect(hourly.map((b) => b.hour)).toEqual([
337
+ 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
338
+ ]);
337
339
  expect(hourly.find((b) => b.hour === 23)?.totalCalls).toBe(1); // Jun 8 23:30
338
- expect(hourly.find((b) => b.hour === 8)?.totalCalls).toBe(1); // Jun 9 08:00
340
+ expect(hourly.find((b) => b.hour === 8)?.totalCalls).toBe(1); // Jun 9 08:00
339
341
  expect(hourly.reduce((sum, b) => sum + b.totalCalls, 0)).toBe(2);
340
342
  });
341
343
 
@@ -1,6 +1,9 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from "@jest/globals";
2
2
  import {
3
3
  getClientsConfigCollection,
4
+ getActiveScanId,
5
+ updateActiveScanId,
6
+ clearActiveScanId,
4
7
  updateProductConfig,
5
8
  } from "../clientsConfig.getters";
6
9
 
@@ -23,8 +26,6 @@ describe("updateProductConfig", () => {
23
26
  websiteTalk: {
24
27
  language: "English",
25
28
  companyName: "OldCorp",
26
- defaultBaseUrl: "https://old-url.com",
27
- logoUrl: "",
28
29
  timezone: "UTC",
29
30
  },
30
31
  },
@@ -38,9 +39,7 @@ describe("updateProductConfig", () => {
38
39
  expect(updatedDoc).toBeDefined();
39
40
  expect(updatedDoc?.products.websiteTalk?.language).toBe("Hebrew");
40
41
  expect(updatedDoc?.products.websiteTalk?.companyName).toBe("TestCorp");
41
- expect(updatedDoc?.products.websiteTalk?.defaultBaseUrl).toBe(
42
- "https://old-url.com",
43
- );
42
+ expect(updatedDoc?.products.websiteTalk?.timezone).toBe("UTC");
44
43
  });
45
44
 
46
45
  it("should throw an error if no client config is found", async () => {
@@ -51,3 +50,56 @@ describe("updateProductConfig", () => {
51
50
  ).rejects.toThrow("No client config found for clientId: invalid-client");
52
51
  });
53
52
  });
53
+
54
+ describe("activeScanId", () => {
55
+ beforeEach(async () => {
56
+ await getClientsConfigCollection().deleteMany({});
57
+ });
58
+
59
+ afterEach(async () => {
60
+ await getClientsConfigCollection().deleteMany({});
61
+ });
62
+
63
+ it("should return undefined when activeScanId is not set", async () => {
64
+ const clientId = "client-active";
65
+ await getClientsConfigCollection().insertOne({
66
+ clientId,
67
+ products: {
68
+ websiteTalk: { companyName: "X", timezone: "UTC", language: "he" },
69
+ },
70
+ } as any);
71
+
72
+ expect(await getActiveScanId(clientId)).toBeUndefined();
73
+ });
74
+
75
+ it("should persist activeScanId and return it from getActiveScanId", async () => {
76
+ const clientId = "client-active-2";
77
+ await getClientsConfigCollection().insertOne({
78
+ clientId,
79
+ products: {
80
+ websiteTalk: { companyName: "X", timezone: "UTC", language: "he" },
81
+ },
82
+ } as any);
83
+
84
+ await updateActiveScanId(clientId, "scan-abc");
85
+ expect(await getActiveScanId(clientId)).toBe("scan-abc");
86
+ });
87
+
88
+ it("should clear activeScanId and return undefined from getActiveScanId", async () => {
89
+ const clientId = "client-active-3";
90
+ await getClientsConfigCollection().insertOne({
91
+ clientId,
92
+ products: {
93
+ websiteTalk: {
94
+ companyName: "X",
95
+ timezone: "UTC",
96
+ language: "he",
97
+ activeScanId: "scan-old",
98
+ },
99
+ },
100
+ } as any);
101
+
102
+ await clearActiveScanId(clientId);
103
+ expect(await getActiveScanId(clientId)).toBeUndefined();
104
+ });
105
+ });
@@ -31,11 +31,9 @@ describe("db.clientsConfig", () => {
31
31
  clientId,
32
32
  products: {
33
33
  websiteTalk: {
34
- logoUrl: "https://cdn.example.com/branding/acme/logo.png",
35
34
  companyName: "Acme Ltd",
36
35
  timezone: "Asia/Jerusalem",
37
36
  language: "he",
38
- defaultBaseUrl: "https://acme.example",
39
37
  },
40
38
  },
41
39
  });
@@ -48,11 +46,9 @@ describe("db.clientsConfig", () => {
48
46
  clientId,
49
47
  products: {
50
48
  websiteTalk: {
51
- logoUrl: "https://cdn.example.com/branding/acme/logo.png",
52
49
  companyName: "Acme Ltd",
53
50
  timezone: "Asia/Jerusalem",
54
51
  language: "he",
55
- defaultBaseUrl: "https://acme.example",
56
52
  },
57
53
  },
58
54
  });
@@ -53,3 +53,27 @@ export async function updateProductConfig<K extends KnownProductKey>(
53
53
  throw new Error(`No client config found for clientId: ${clientId}`);
54
54
  }
55
55
  }
56
+
57
+ export const getActiveScanId = async (
58
+ clientId: string,
59
+ ): Promise<string | undefined> => {
60
+ const cfg = await getClientConfig(clientId);
61
+ return cfg?.products?.websiteTalk?.activeScanId;
62
+ };
63
+
64
+ export const updateActiveScanId = async (
65
+ clientId: string,
66
+ scanId: string,
67
+ ): Promise<void> => {
68
+ await updateProductConfig(clientId, "websiteTalk", { activeScanId: scanId });
69
+ };
70
+
71
+ export const clearActiveScanId = async (clientId: string): Promise<void> => {
72
+ const result = await getClientsConfigCollection().updateOne(
73
+ { clientId },
74
+ { $unset: { "products.websiteTalk.activeScanId": "" } },
75
+ );
76
+ if (result.matchedCount === 0) {
77
+ throw new Error(`No client config found for clientId: ${clientId}`);
78
+ }
79
+ };
@@ -58,11 +58,10 @@ export type WebsiteTalkScheduler = {
58
58
 
59
59
  /** Product config for the websiteTalk */
60
60
  export type WebsiteTalkProduct = {
61
- logoUrl: string;
62
61
  companyName: string;
63
62
  timezone: string;
64
63
  language: string;
65
- defaultBaseUrl: string;
64
+ activeScanId?: string;
66
65
  };
67
66
 
68
67
  // ---------------------------------------------------------------------------
@@ -79,6 +79,9 @@ describe("flowMongoSchema", () => {
79
79
  expect(toolItem.properties).toHaveProperty("runInBackground");
80
80
  expect(toolItem.properties.runInBackground.bsonType).toBe("bool");
81
81
 
82
+ expect(toolItem.properties).toHaveProperty("useRedisTranscription");
83
+ expect(toolItem.properties.useRedisTranscription.bsonType).toBe("bool");
84
+
82
85
  expect(toolItem.properties).toHaveProperty("backgroundToolType");
83
86
  expect(toolItem.properties.backgroundToolType.bsonType).toBe("string");
84
87
  expect(toolItem.properties.backgroundToolType.enum).toEqual([
@@ -138,6 +138,7 @@ export const flowMongoSchema = {
138
138
  parameters: { bsonType: "object" },
139
139
  bodyFormat: { bsonType: "string", enum: ["json", "form-data"] },
140
140
  preventAudioDuringTool: { bsonType: "bool" },
141
+ useRedisTranscription: { bsonType: "bool" },
141
142
  sendUserAuthToken: { bsonType: "bool" },
142
143
  runInBackground: { bsonType: "bool" },
143
144
  backgroundToolType: {
@@ -71,6 +71,8 @@ export type FlowTool = {
71
71
  parameters: Record<string, unknown>;
72
72
  bodyFormat?: "json" | "form-data";
73
73
  preventAudioDuringTool?: boolean;
74
+ /** When true, prefer cached transcription from Redis (default: false). */
75
+ useRedisTranscription?: boolean;
74
76
  sendUserAuthToken?: boolean;
75
77
  runInBackground?: boolean;
76
78
  backgroundToolType?: "backgroundToolAlways" | "backgroundToolOnce";
@@ -13,3 +13,4 @@ export * from "./municipal/muniIssues";
13
13
  export * from "./municipal/streets";
14
14
  export * from "./municipal/tickets";
15
15
  export * from "./websitalk/scans";
16
+ export * from "./websitalk/websiteUrls";
@@ -1,10 +1,11 @@
1
1
  import { Factory } from "fishery";
2
2
  import { faker } from "@faker-js/faker";
3
+ import { ObjectId } from "mongodb";
3
4
  import type { Scan } from "../../../websitalk";
4
5
 
5
6
  export const scanFactory = Factory.define<Scan>(() => ({
6
7
  clientId: faker.string.uuid(),
7
- baseUrl: faker.internet.url(),
8
+ websiteUrlId: new ObjectId().toString(),
8
9
  status: "CHECKING",
9
10
  activeTasksCount: 0,
10
11
  pagesScanned: 0,
@@ -0,0 +1,17 @@
1
+ import { Factory } from "fishery";
2
+ import { faker } from "@faker-js/faker";
3
+ import type { WebsiteUrl } from "../../../websitalk/websiteUrls";
4
+
5
+ export const websiteUrlFactory = Factory.define<WebsiteUrl>(() => ({
6
+ clientId: faker.string.uuid(),
7
+ name: faker.company.name(),
8
+ baseUrl: faker.internet.url(),
9
+ createdAt: new Date(),
10
+ updatedAt: new Date(),
11
+ }));
12
+
13
+ export function createWebsiteUrlFixture(
14
+ overrides?: Partial<WebsiteUrl>,
15
+ ): WebsiteUrl {
16
+ return websiteUrlFactory.build(overrides);
17
+ }
@@ -1,6 +1,7 @@
1
1
  import { Db, ObjectId as MongoObjectId } from "mongodb";
2
2
 
3
3
  export * from "./scans";
4
+ export * from "./websiteUrls";
4
5
  export { websitalkMongodbClient } from "./mongodb-client";
5
6
 
6
7
  let db: Db;