@talkpilot/core-db 1.3.80 → 1.3.82

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 (102) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +4 -29
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/municipal/index.d.ts +1 -0
  8. package/dist/municipal/index.d.ts.map +1 -1
  9. package/dist/municipal/index.js +1 -0
  10. package/dist/municipal/index.js.map +1 -1
  11. package/dist/municipal/muniIssues/index.d.ts +2 -2
  12. package/dist/municipal/muniIssues/index.d.ts.map +1 -1
  13. package/dist/municipal/muniIssues/index.js +3 -1
  14. package/dist/municipal/muniIssues/index.js.map +1 -1
  15. package/dist/municipal/muniIssues/muniIssues.constants.d.ts +4 -0
  16. package/dist/municipal/muniIssues/muniIssues.constants.d.ts.map +1 -1
  17. package/dist/municipal/muniIssues/muniIssues.constants.js +10 -1
  18. package/dist/municipal/muniIssues/muniIssues.constants.js.map +1 -1
  19. package/dist/municipal/muniIssues/muniIssues.getters.d.ts +6 -1
  20. package/dist/municipal/muniIssues/muniIssues.getters.d.ts.map +1 -1
  21. package/dist/municipal/muniIssues/muniIssues.getters.js +31 -1
  22. package/dist/municipal/muniIssues/muniIssues.getters.js.map +1 -1
  23. package/dist/municipal/muniIssues/muniIssues.schema.d.ts.map +1 -1
  24. package/dist/municipal/muniIssues/muniIssues.schema.js +18 -0
  25. package/dist/municipal/muniIssues/muniIssues.schema.js.map +1 -1
  26. package/dist/municipal/muniIssues/muniIssues.setters.d.ts +9 -1
  27. package/dist/municipal/muniIssues/muniIssues.setters.d.ts.map +1 -1
  28. package/dist/municipal/muniIssues/muniIssues.setters.js +52 -2
  29. package/dist/municipal/muniIssues/muniIssues.setters.js.map +1 -1
  30. package/dist/municipal/muniIssues/muniIssues.types.d.ts +24 -2
  31. package/dist/municipal/muniIssues/muniIssues.types.d.ts.map +1 -1
  32. package/dist/municipal/residents/index.d.ts +5 -0
  33. package/dist/municipal/residents/index.d.ts.map +1 -0
  34. package/dist/municipal/residents/index.js +24 -0
  35. package/dist/municipal/residents/index.js.map +1 -0
  36. package/dist/municipal/residents/residents.constants.d.ts +3 -0
  37. package/dist/municipal/residents/residents.constants.d.ts.map +1 -0
  38. package/dist/municipal/residents/residents.constants.js +6 -0
  39. package/dist/municipal/residents/residents.constants.js.map +1 -0
  40. package/dist/municipal/residents/residents.getters.d.ts +9 -0
  41. package/dist/municipal/residents/residents.getters.d.ts.map +1 -0
  42. package/dist/municipal/residents/residents.getters.js +32 -0
  43. package/dist/municipal/residents/residents.getters.js.map +1 -0
  44. package/dist/municipal/residents/residents.schema.d.ts +4 -0
  45. package/dist/municipal/residents/residents.schema.d.ts.map +1 -0
  46. package/dist/municipal/residents/residents.schema.js +29 -0
  47. package/dist/municipal/residents/residents.schema.js.map +1 -0
  48. package/dist/municipal/residents/residents.types.d.ts +15 -0
  49. package/dist/municipal/residents/residents.types.d.ts.map +1 -0
  50. package/dist/municipal/residents/residents.types.js +3 -0
  51. package/dist/municipal/residents/residents.types.js.map +1 -0
  52. package/dist/talkpilot/calls/calls.constants.d.ts +0 -7
  53. package/dist/talkpilot/calls/calls.constants.d.ts.map +1 -1
  54. package/dist/talkpilot/calls/calls.constants.js +1 -8
  55. package/dist/talkpilot/calls/calls.constants.js.map +1 -1
  56. package/dist/talkpilot/calls/calls.getters.d.ts +1 -2
  57. package/dist/talkpilot/calls/calls.getters.d.ts.map +1 -1
  58. package/dist/talkpilot/calls/calls.getters.js +1 -6
  59. package/dist/talkpilot/calls/calls.getters.js.map +1 -1
  60. package/dist/talkpilot/calls/calls.types.d.ts +2 -4
  61. package/dist/talkpilot/calls/calls.types.d.ts.map +1 -1
  62. package/dist/talkpilot/flows/flows.schema.d.ts +28 -0
  63. package/dist/talkpilot/flows/flows.schema.d.ts.map +1 -1
  64. package/dist/talkpilot/flows/flows.schema.js +16 -0
  65. package/dist/talkpilot/flows/flows.schema.js.map +1 -1
  66. package/dist/talkpilot/flows/flows.types.d.ts +8 -0
  67. package/dist/talkpilot/flows/flows.types.d.ts.map +1 -1
  68. package/dist/test-utils/factories/index.d.ts +1 -0
  69. package/dist/test-utils/factories/index.d.ts.map +1 -1
  70. package/dist/test-utils/factories/index.js +1 -0
  71. package/dist/test-utils/factories/index.js.map +1 -1
  72. package/dist/test-utils/factories/municipal/residents.d.ts +5 -0
  73. package/dist/test-utils/factories/municipal/residents.d.ts.map +1 -0
  74. package/dist/test-utils/factories/municipal/residents.js +22 -0
  75. package/dist/test-utils/factories/municipal/residents.js.map +1 -0
  76. package/package.json +1 -1
  77. package/src/index.ts +1 -0
  78. package/src/municipal/index.ts +1 -0
  79. package/src/municipal/muniIssues/__tests__/muniIssues.getters.spec.ts +66 -0
  80. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +106 -1
  81. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +1 -0
  82. package/src/municipal/muniIssues/index.ts +6 -0
  83. package/src/municipal/muniIssues/muniIssues.constants.ts +11 -0
  84. package/src/municipal/muniIssues/muniIssues.getters.ts +46 -2
  85. package/src/municipal/muniIssues/muniIssues.schema.ts +20 -0
  86. package/src/municipal/muniIssues/muniIssues.setters.ts +72 -3
  87. package/src/municipal/muniIssues/muniIssues.types.ts +36 -4
  88. package/src/municipal/residents/__tests__/residents.spec.ts +92 -0
  89. package/src/municipal/residents/index.ts +4 -0
  90. package/src/municipal/residents/residents.constants.ts +2 -0
  91. package/src/municipal/residents/residents.getters.ts +42 -0
  92. package/src/municipal/residents/residents.schema.ts +28 -0
  93. package/src/municipal/residents/residents.types.ts +17 -0
  94. package/src/talkpilot/calls/__tests__/calls.spec.ts +0 -48
  95. package/src/talkpilot/calls/calls.constants.ts +0 -8
  96. package/src/talkpilot/calls/calls.getters.ts +1 -19
  97. package/src/talkpilot/calls/calls.types.ts +1 -5
  98. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +28 -0
  99. package/src/talkpilot/flows/flows.schema.ts +16 -0
  100. package/src/talkpilot/flows/flows.types.ts +9 -0
  101. package/src/test-utils/factories/index.ts +1 -0
  102. package/src/test-utils/factories/municipal/residents.ts +20 -0
package/AGENTS.md CHANGED
@@ -12,7 +12,7 @@ Shared Mongo layer: typed getters, schemas, factories, indexes. Consumed by Talk
12
12
 
13
13
  ## Project structure
14
14
  - `src/talkpilot/` — calls, flows, sessions, clients, phone numbers, subscriptions, …
15
- - `src/municipal/` — cities, streets, tickets, departmentsSubjects, …
15
+ - `src/municipal/` — cities, streets, tickets, departmentsSubjects, residents, …
16
16
  - `src/websitalk/` — scans, scanResources, websiteUrls.
17
17
  - `src/configuration/` — prompts, models.
18
18
  - `src/test-utils/` — Fishery factories and test DB helpers.
package/README.md CHANGED
@@ -24,7 +24,7 @@ L1:# @talkpilot/core-db
24
24
 
25
25
  - `src/connection.ts` – Central connection logic that resolves URIs/DB names from env vars (`MONGO_URI`, `MONGODB_URI`, `TALKPILOT_DB_NAME`, `MUNICIPAL_DB_NAME`) and reuses a single `MongoClient`.
26
26
  - `src/talkpilot/` – Call history, agents, flows, sessions, leads, subscriptions, and support helpers exposed as getters plus helper enums/types for each collection.
27
- - `src/municipal/` – Municipal-specific collections (`cities`, `streets`, `departmentsSubjects`, `tickets`, etc.) plus vector search helpers and Ash Bina helpers used by MIS.
27
+ - `src/municipal/` – Municipal-specific collections (`cities`, `streets`, `departmentsSubjects`, `tickets`, `residents`, etc.) plus vector search helpers and Ash Bina helpers used by MIS.
28
28
  - `src/utils/` – Shared helpers such as `resolveConnection`, pagination utilities, and schema validation helper functions.
29
29
  - `src/bulkWrite/` – Generic bulk-write op constructors (`buildSetOp`, `buildUpsertOp`, `buildInsertOp`, `buildDeleteOp`) usable with any collection's document type.
30
30
  - `src/configuration/` – `configurationMongodbClient` plus the `prompts` collection (`Prompt` type, `getPromptByName`, `findPrompts`, `getAllPrompts`, `getPromptsByProduct`).
@@ -182,8 +182,9 @@ Refer to `DEVELOPMENT.md` for the full walkthrough, token instructions, and fact
182
182
  | 1.3.61 | Optional `activeFlowId` on `WebsiteTalkProduct` (CP-1849). WebsiteTalk updates this flow instead of the flow on a phone number. |
183
183
  | 1.3.62 | Pause/Resume support for WebsiteTalk scans (CP-1752): `PAUSED` and `CANCELED` added to `SCAN_STATUSES` (`PAUSED` deliberately excluded from `FINISHED_SCAN_STATUSES` — pausing isn't done, `CANCELED` is). Added `Scan.pausedAt`, tracked across pause/resume so elapsed-time display can freeze correctly instead of counting the paused duration. |
184
184
  | 1.3.64 | New `callTokenUsage` collection with `incrementCallTokenUsage` (CP-1810): per-call realtime token usage, one document per `callSid`. |
185
- | 1.3.71 | Who ended a call (CP-1873): optional `Call.endedBy` (`system` / `agent` / `user`), `CallEndedByValues`, and `setCallEndedBy` (first write wins). **Breaking** vs 1.3.69–1.3.70: the value `resident` was replaced by `user`. |
186
- | 1.3.74 | Added `human` to `CallEndedByValues` (CP-1873): a human agent ended the call, after a transfer or in a conference. |
185
+ | 1.3.65 | `Flow.beforeCallEvent` as an optional HTTP config object (`url` required; `timeoutMs`, `sendUserAuthToken`, `allowedKeys`, `wait`). `afterCallEvent` remains an optional Pub/Sub string. |
186
+ | 1.3.69 | Municipal `residents` collection: optional resident fields (`cityName`, `firstName`, `lastName`, `idNumber`, `phoneNumber`, `address`) with exact-match getters by phone, by idNumber, and by phone+idNumber (city-scoped). Schema + indexes exported; collection is created out of band. |
187
+ | 1.3.82 | Complaint tracking on `muniIssues` (CP-1888): optional `status` / `response` / `updatedAt`; an editable TalkPilot response with up to `MUNI_ISSUE_MAX_RESPONSE_IMAGES` (5) `response.imageUrls` and `response.updatedAt`; `updateMuniIssueStatus`, `setMuniIssueResponse`, `findMuniIssuesByClient`, `countMuniIssuesByClient`, `getMuniIssueByIdForClient`; index `clientId_1_createdAt_-1`. |
187
188
 
188
189
  ### 1.1.9
189
190
 
@@ -806,32 +807,6 @@ Optional `activeFlowId` on `WebsiteTalkProduct`. WTIS reads this field when it u
806
807
 
807
808
  No — the field is optional. **WTIS** should upgrade to **1.3.61** so the call-script update can use it.
808
809
 
809
- ### 1.3.71 — Who ended the call (CP-1873)
810
-
811
- Records who ended a connected call. Unset for calls that never connected (busy, no-answer) and for calls moved to a conference.
812
-
813
- **Added**
814
-
815
- | Item | Purpose |
816
- | --- | --- |
817
- | `Call.endedBy` | `system` (our platform, e.g. silence timeout), `agent` (the bot ended the flow) or `user` (the caller hung up). |
818
- | `CallEndedByValues` / `CallEndedBy` | Const object and the type derived from it, same pattern as `CallStatusValues`. |
819
- | `setCallEndedBy(callSid, endedBy)` | Writes only if `endedBy` is not set yet; returns `true` when this call wrote it. |
820
-
821
- `endedBy` is not part of `CallUpdateParams`, so `updateCallByCallSid` cannot overwrite it.
822
-
823
- **Do I need to update my app?**
824
-
825
- **TalkPilot Server** must upgrade to **1.3.71** to write the field. 1.3.69–1.3.70 used `resident` instead of `user` — don't use them.
826
-
827
- ### 1.3.74 — Human agent ended the call (CP-1873)
828
-
829
- New `CallEndedByValues.Human` (`"human"`): a human agent ended the call, either after a transfer or in a conference.
830
-
831
- **Do I need to update my app?**
832
-
833
- No — purely additive. **TalkPilot Server** should upgrade to **1.3.74** to write it.
834
-
835
810
  ## 🛠 CI/CD & deployment
836
811
 
837
812
  - This package is consumed by Cloud Build-based services (TalkPilot Server, MIS, CIS) as a dependency when Docker images are built. Keep `dist/` in sync with your builds because the compiled artifact is what downstream services install.
package/dist/index.d.ts CHANGED
@@ -8,6 +8,7 @@ export * from "./municipal/departmentsSubjects";
8
8
  export * from "./municipal/tickets";
9
9
  export * from "./municipal/systemInstructions";
10
10
  export * from "./municipal/muniIssues";
11
+ export * from "./municipal/residents";
11
12
  export * from "./municipal/utils/types";
12
13
  export { websitalkMongodbClient, getDb as getWebsitalkDb, setDb as setWebsitalkDb, ObjectId as WebsitalkObjectId, } from "./websitalk";
13
14
  export * from "./websitalk/scans/scans.getters";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAE5B,OAAO,EACL,0BAA0B,EAC1B,KAAK,IAAI,kBAAkB,EAC3B,KAAK,IAAI,kBAAkB,EAC3B,QAAQ,IAAI,qBAAqB,GAClC,MAAM,aAAa,CAAC;AACrB,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iCAAiC,CAAC;AAChD,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AAExC,OAAO,EACL,sBAAsB,EACtB,KAAK,IAAI,cAAc,EACvB,KAAK,IAAI,cAAc,EACvB,QAAQ,IAAI,iBAAiB,GAC9B,MAAM,aAAa,CAAC;AACrB,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,mBAAmB,+BAA+B,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6DAA6D,CAAC;AAC5E,cAAc,2DAA2D,CAAC;AAC1E,mBAAmB,yDAAyD,CAAC;AAE7E,OAAO,EACL,0BAA0B,EAC1B,KAAK,IAAI,kBAAkB,EAC3B,KAAK,IAAI,kBAAkB,GAC5B,MAAM,iBAAiB,CAAC;AACzB,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,YAAY,EAAE,qBAAqB,IAAI,WAAW,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,mBAAmB,IAAI,cAAc,EAAE,MAAM,SAAS,CAAC;AAChE,YAAY,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAE5B,OAAO,EACL,0BAA0B,EAC1B,KAAK,IAAI,kBAAkB,EAC3B,KAAK,IAAI,kBAAkB,EAC3B,QAAQ,IAAI,qBAAqB,GAClC,MAAM,aAAa,CAAC;AACrB,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iCAAiC,CAAC;AAChD,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AAExC,OAAO,EACL,sBAAsB,EACtB,KAAK,IAAI,cAAc,EACvB,KAAK,IAAI,cAAc,EACvB,QAAQ,IAAI,iBAAiB,GAC9B,MAAM,aAAa,CAAC;AACrB,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,mBAAmB,+BAA+B,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6DAA6D,CAAC;AAC5E,cAAc,2DAA2D,CAAC;AAC1E,mBAAmB,yDAAyD,CAAC;AAE7E,OAAO,EACL,0BAA0B,EAC1B,KAAK,IAAI,kBAAkB,EAC3B,KAAK,IAAI,kBAAkB,GAC5B,MAAM,iBAAiB,CAAC;AACzB,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,YAAY,EAAE,qBAAqB,IAAI,WAAW,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,mBAAmB,IAAI,cAAc,EAAE,MAAM,SAAS,CAAC;AAChE,YAAY,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -30,6 +30,7 @@ __exportStar(require("./municipal/departmentsSubjects"), exports);
30
30
  __exportStar(require("./municipal/tickets"), exports);
31
31
  __exportStar(require("./municipal/systemInstructions"), exports);
32
32
  __exportStar(require("./municipal/muniIssues"), exports);
33
+ __exportStar(require("./municipal/residents"), exports);
33
34
  __exportStar(require("./municipal/utils/types"), exports);
34
35
  var websitalk_1 = require("./websitalk");
35
36
  Object.defineProperty(exports, "websitalkMongodbClient", { enumerable: true, get: function () { return websitalk_1.websitalkMongodbClient; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,uBAAuB;AACvB,8CAA4B;AAC5B,+CAA6B;AAC7B,8CAA4B;AAE5B,yCAKqB;AAJnB,uHAAA,0BAA0B,OAAA;AAC1B,+GAAA,KAAK,OAAsB;AAC3B,+GAAA,KAAK,OAAsB;AAC3B,kHAAA,QAAQ,OAAyB;AAEnC,qDAAmC;AACnC,sDAAoC;AACpC,kEAAgD;AAChD,sDAAoC;AACpC,iEAA+C;AAC/C,yDAAuC;AACvC,0DAAwC;AAExC,yCAKqB;AAJnB,mHAAA,sBAAsB,OAAA;AACtB,2GAAA,KAAK,OAAkB;AACvB,2GAAA,KAAK,OAAkB;AACvB,8GAAA,QAAQ,OAAqB;AAE/B,kEAAgD;AAChD,oEAAkD;AAElD,4DAA0C;AAC1C,0DAAwC;AACxC,8FAA4E;AAC5E,4FAA0E;AAG1E,iDAIyB;AAHvB,2HAAA,0BAA0B,OAAA;AAC1B,mHAAA,KAAK,OAAsB;AAC3B,mHAAA,KAAK,OAAsB;AAE7B,0DAAwC;AACxC,yDAAuC;AACvC,iEAA+C;AAE/C,mCAAmC;AAA1B,mGAAA,QAAQ,OAAA;AAGjB,mCAAgE;AAAvD,yGAAA,mBAAmB,OAAkB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,uBAAuB;AACvB,8CAA4B;AAC5B,+CAA6B;AAC7B,8CAA4B;AAE5B,yCAKqB;AAJnB,uHAAA,0BAA0B,OAAA;AAC1B,+GAAA,KAAK,OAAsB;AAC3B,+GAAA,KAAK,OAAsB;AAC3B,kHAAA,QAAQ,OAAyB;AAEnC,qDAAmC;AACnC,sDAAoC;AACpC,kEAAgD;AAChD,sDAAoC;AACpC,iEAA+C;AAC/C,yDAAuC;AACvC,wDAAsC;AACtC,0DAAwC;AAExC,yCAKqB;AAJnB,mHAAA,sBAAsB,OAAA;AACtB,2GAAA,KAAK,OAAkB;AACvB,2GAAA,KAAK,OAAkB;AACvB,8GAAA,QAAQ,OAAqB;AAE/B,kEAAgD;AAChD,oEAAkD;AAElD,4DAA0C;AAC1C,0DAAwC;AACxC,8FAA4E;AAC5E,4FAA0E;AAG1E,iDAIyB;AAHvB,2HAAA,0BAA0B,OAAA;AAC1B,mHAAA,KAAK,OAAsB;AAC3B,mHAAA,KAAK,OAAsB;AAE7B,0DAAwC;AACxC,yDAAuC;AACvC,iEAA+C;AAE/C,mCAAmC;AAA1B,mGAAA,QAAQ,OAAA;AAGjB,mCAAgE;AAAvD,yGAAA,mBAAmB,OAAkB"}
@@ -5,6 +5,7 @@ export * from "./departmentsSubjects";
5
5
  export * from "./tickets";
6
6
  export * from "./systemInstructions";
7
7
  export * from "./muniIssues";
8
+ export * from "./residents";
8
9
  export * from "./utils/types";
9
10
  export type { CityName } from "./utils/types";
10
11
  export { municipalDataMongodbClient } from "./mongodb-client";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/municipal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,SAAS,CAAC;AAExD,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAG9D,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/municipal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,SAAS,CAAC;AAExD,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAG9D,eAAO,MAAM,KAAK,GAAI,GAAG,EAAE,SAE1B,CAAC;AAEF,eAAO,MAAM,KAAK,QAAO,EAGxB,CAAC;AACF,eAAO,MAAM,QAAQ,sBAAgB,CAAC"}
@@ -22,6 +22,7 @@ __exportStar(require("./departmentsSubjects"), exports);
22
22
  __exportStar(require("./tickets"), exports);
23
23
  __exportStar(require("./systemInstructions"), exports);
24
24
  __exportStar(require("./muniIssues"), exports);
25
+ __exportStar(require("./residents"), exports);
25
26
  __exportStar(require("./utils/types"), exports);
26
27
  var mongodb_client_1 = require("./mongodb-client");
27
28
  Object.defineProperty(exports, "municipalDataMongodbClient", { enumerable: true, get: function () { return mongodb_client_1.municipalDataMongodbClient; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/municipal/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qCAAwD;AAExD,2CAAyB;AACzB,4CAA0B;AAC1B,wDAAsC;AACtC,4CAA0B;AAC1B,uDAAqC;AACrC,+CAA6B;AAC7B,gDAA8B;AAE9B,mDAA8D;AAArD,4HAAA,0BAA0B,OAAA;AAEnC,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,mCAAmC,CAAC,CAAC;IAC9D,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/municipal/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qCAAwD;AAExD,2CAAyB;AACzB,4CAA0B;AAC1B,wDAAsC;AACtC,4CAA0B;AAC1B,uDAAqC;AACrC,+CAA6B;AAC7B,8CAA4B;AAC5B,gDAA8B;AAE9B,mDAA8D;AAArD,4HAAA,0BAA0B,OAAA;AAEnC,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,mCAAmC,CAAC,CAAC;IAC9D,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAHW,QAAA,KAAK,SAGhB;AACW,QAAA,QAAQ,GAAG,kBAAa,CAAC"}
@@ -1,7 +1,7 @@
1
1
  export * from "./muniIssues.getters";
2
2
  export * from "./muniIssues.setters";
3
3
  export * from "./muniIssues.setup";
4
- export { MUNI_ISSUES_COLLECTION, MUNI_ISSUE_SYNC_STATUSES, MUNI_ISSUE_TEXT_MAX_LENGTH, MUNI_ISSUE_NAME_MAX_LENGTH, } from "./muniIssues.constants";
4
+ export { MUNI_ISSUES_COLLECTION, MUNI_ISSUE_MAX_RESPONSE_IMAGES, MUNI_ISSUE_STATUSES, MUNI_ISSUE_SYNC_STATUSES, MUNI_ISSUE_TEXT_MAX_LENGTH, MUNI_ISSUE_NAME_MAX_LENGTH, } from "./muniIssues.constants";
5
5
  export { muniIssuesJsonSchema, muniIssuesIndexes } from "./muniIssues.schema";
6
- export type { MuniIssue, MuniIssueContent, MuniIssueJira, MuniIssueSyncStatus, CreateMuniIssueInput, } from "./muniIssues.types";
6
+ export type { MuniIssue, MuniIssueContent, MuniIssueJira, MuniIssueSyncStatus, MuniIssueStatus, MuniIssueResponse, CreateMuniIssueInput, SetMuniIssueResponseInput, FindMuniIssuesOptions, } from "./muniIssues.types";
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/municipal/muniIssues/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/municipal/muniIssues/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EACL,sBAAsB,EACtB,8BAA8B,EAC9B,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC"}
@@ -14,12 +14,14 @@ 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
- exports.muniIssuesIndexes = exports.muniIssuesJsonSchema = exports.MUNI_ISSUE_NAME_MAX_LENGTH = exports.MUNI_ISSUE_TEXT_MAX_LENGTH = exports.MUNI_ISSUE_SYNC_STATUSES = exports.MUNI_ISSUES_COLLECTION = void 0;
17
+ exports.muniIssuesIndexes = exports.muniIssuesJsonSchema = exports.MUNI_ISSUE_NAME_MAX_LENGTH = exports.MUNI_ISSUE_TEXT_MAX_LENGTH = exports.MUNI_ISSUE_SYNC_STATUSES = exports.MUNI_ISSUE_STATUSES = exports.MUNI_ISSUE_MAX_RESPONSE_IMAGES = exports.MUNI_ISSUES_COLLECTION = void 0;
18
18
  __exportStar(require("./muniIssues.getters"), exports);
19
19
  __exportStar(require("./muniIssues.setters"), exports);
20
20
  __exportStar(require("./muniIssues.setup"), exports);
21
21
  var muniIssues_constants_1 = require("./muniIssues.constants");
22
22
  Object.defineProperty(exports, "MUNI_ISSUES_COLLECTION", { enumerable: true, get: function () { return muniIssues_constants_1.MUNI_ISSUES_COLLECTION; } });
23
+ Object.defineProperty(exports, "MUNI_ISSUE_MAX_RESPONSE_IMAGES", { enumerable: true, get: function () { return muniIssues_constants_1.MUNI_ISSUE_MAX_RESPONSE_IMAGES; } });
24
+ Object.defineProperty(exports, "MUNI_ISSUE_STATUSES", { enumerable: true, get: function () { return muniIssues_constants_1.MUNI_ISSUE_STATUSES; } });
23
25
  Object.defineProperty(exports, "MUNI_ISSUE_SYNC_STATUSES", { enumerable: true, get: function () { return muniIssues_constants_1.MUNI_ISSUE_SYNC_STATUSES; } });
24
26
  Object.defineProperty(exports, "MUNI_ISSUE_TEXT_MAX_LENGTH", { enumerable: true, get: function () { return muniIssues_constants_1.MUNI_ISSUE_TEXT_MAX_LENGTH; } });
25
27
  Object.defineProperty(exports, "MUNI_ISSUE_NAME_MAX_LENGTH", { enumerable: true, get: function () { return muniIssues_constants_1.MUNI_ISSUE_NAME_MAX_LENGTH; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/municipal/muniIssues/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,uDAAqC;AACrC,qDAAmC;AACnC,+DAKgC;AAJ9B,8HAAA,sBAAsB,OAAA;AACtB,gIAAA,wBAAwB,OAAA;AACxB,kIAAA,0BAA0B,OAAA;AAC1B,kIAAA,0BAA0B,OAAA;AAE5B,yDAA8E;AAArE,yHAAA,oBAAoB,OAAA;AAAE,sHAAA,iBAAiB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/municipal/muniIssues/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,uDAAqC;AACrC,qDAAmC;AACnC,+DAOgC;AAN9B,8HAAA,sBAAsB,OAAA;AACtB,sIAAA,8BAA8B,OAAA;AAC9B,2HAAA,mBAAmB,OAAA;AACnB,gIAAA,wBAAwB,OAAA;AACxB,kIAAA,0BAA0B,OAAA;AAC1B,kIAAA,0BAA0B,OAAA;AAE5B,yDAA8E;AAArE,yHAAA,oBAAoB,OAAA;AAAE,sHAAA,iBAAiB,OAAA"}
@@ -2,6 +2,10 @@
2
2
  export declare const MUNI_ISSUES_COLLECTION = "muniIssues";
3
3
  /** Sync state of the issue's Jira ticket at write time. */
4
4
  export declare const MUNI_ISSUE_SYNC_STATUSES: readonly ["created", "failed"];
5
+ /** Customer-facing complaint status, set manually by the TalkPilot team. */
6
+ export declare const MUNI_ISSUE_STATUSES: readonly ["in_review", "in_progress", "resolved", "no_issue_found"];
7
+ /** Max images on a single TalkPilot response. */
8
+ export declare const MUNI_ISSUE_MAX_RESPONSE_IMAGES = 5;
5
9
  /** Max length for the long free-text fields — well above the ~2000-char target. */
6
10
  export declare const MUNI_ISSUE_TEXT_MAX_LENGTH = 5000;
7
11
  /** Max length for the short identity fields (a person's name and role). */
@@ -1 +1 @@
1
- {"version":3,"file":"muniIssues.constants.d.ts","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.constants.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,eAAO,MAAM,sBAAsB,eAAe,CAAC;AAEnD,2DAA2D;AAC3D,eAAO,MAAM,wBAAwB,gCAAiC,CAAC;AAEvE,mFAAmF;AACnF,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,2EAA2E;AAC3E,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,uGAAuG;AACvG,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,EAAG,QAAiB,CAAC;AAClD,eAAO,MAAM,iBAAiB,EAAG,OAAgB,CAAC"}
1
+ {"version":3,"file":"muniIssues.constants.d.ts","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.constants.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,eAAO,MAAM,sBAAsB,eAAe,CAAC;AAEnD,2DAA2D;AAC3D,eAAO,MAAM,wBAAwB,gCAAiC,CAAC;AAEvE,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,qEAKtB,CAAC;AAEX,iDAAiD;AACjD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD,mFAAmF;AACnF,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,2EAA2E;AAC3E,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,uGAAuG;AACvG,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,EAAG,QAAiB,CAAC;AAClD,eAAO,MAAM,iBAAiB,EAAG,OAAgB,CAAC"}
@@ -1,10 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VALIDATION_ACTION = exports.VALIDATION_LEVEL = exports.NAMESPACE_EXISTS = exports.MUNI_ISSUE_NAME_MAX_LENGTH = exports.MUNI_ISSUE_TEXT_MAX_LENGTH = exports.MUNI_ISSUE_SYNC_STATUSES = exports.MUNI_ISSUES_COLLECTION = void 0;
3
+ exports.VALIDATION_ACTION = exports.VALIDATION_LEVEL = exports.NAMESPACE_EXISTS = exports.MUNI_ISSUE_NAME_MAX_LENGTH = exports.MUNI_ISSUE_TEXT_MAX_LENGTH = exports.MUNI_ISSUE_MAX_RESPONSE_IMAGES = exports.MUNI_ISSUE_STATUSES = exports.MUNI_ISSUE_SYNC_STATUSES = exports.MUNI_ISSUES_COLLECTION = void 0;
4
4
  /** Mongo collection name for reported municipal issues. */
5
5
  exports.MUNI_ISSUES_COLLECTION = "muniIssues";
6
6
  /** Sync state of the issue's Jira ticket at write time. */
7
7
  exports.MUNI_ISSUE_SYNC_STATUSES = ["created", "failed"];
8
+ /** Customer-facing complaint status, set manually by the TalkPilot team. */
9
+ exports.MUNI_ISSUE_STATUSES = [
10
+ "in_review",
11
+ "in_progress",
12
+ "resolved",
13
+ "no_issue_found",
14
+ ];
15
+ /** Max images on a single TalkPilot response. */
16
+ exports.MUNI_ISSUE_MAX_RESPONSE_IMAGES = 5;
8
17
  /** Max length for the long free-text fields — well above the ~2000-char target. */
9
18
  exports.MUNI_ISSUE_TEXT_MAX_LENGTH = 5000;
10
19
  /** Max length for the short identity fields (a person's name and role). */
@@ -1 +1 @@
1
- {"version":3,"file":"muniIssues.constants.js","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.constants.ts"],"names":[],"mappings":";;;AAAA,2DAA2D;AAC9C,QAAA,sBAAsB,GAAG,YAAY,CAAC;AAEnD,2DAA2D;AAC9C,QAAA,wBAAwB,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAU,CAAC;AAEvE,mFAAmF;AACtE,QAAA,0BAA0B,GAAG,IAAI,CAAC;AAE/C,2EAA2E;AAC9D,QAAA,0BAA0B,GAAG,GAAG,CAAC;AAE9C,uGAAuG;AAC1F,QAAA,gBAAgB,GAAG,EAAE,CAAC;AAEnC,yEAAyE;AAC5D,QAAA,gBAAgB,GAAG,QAAiB,CAAC;AACrC,QAAA,iBAAiB,GAAG,OAAgB,CAAC"}
1
+ {"version":3,"file":"muniIssues.constants.js","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.constants.ts"],"names":[],"mappings":";;;AAAA,2DAA2D;AAC9C,QAAA,sBAAsB,GAAG,YAAY,CAAC;AAEnD,2DAA2D;AAC9C,QAAA,wBAAwB,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAU,CAAC;AAEvE,4EAA4E;AAC/D,QAAA,mBAAmB,GAAG;IACjC,WAAW;IACX,aAAa;IACb,UAAU;IACV,gBAAgB;CACR,CAAC;AAEX,iDAAiD;AACpC,QAAA,8BAA8B,GAAG,CAAC,CAAC;AAEhD,mFAAmF;AACtE,QAAA,0BAA0B,GAAG,IAAI,CAAC;AAE/C,2EAA2E;AAC9D,QAAA,0BAA0B,GAAG,GAAG,CAAC;AAE9C,uGAAuG;AAC1F,QAAA,gBAAgB,GAAG,EAAE,CAAC;AAEnC,yEAAyE;AAC5D,QAAA,gBAAgB,GAAG,QAAiB,CAAC;AACrC,QAAA,iBAAiB,GAAG,OAAgB,CAAC"}
@@ -1,7 +1,12 @@
1
1
  import { Collection, ObjectId } from "mongodb";
2
- import { MuniIssue } from "./muniIssues.types";
2
+ import { FindMuniIssuesOptions, MuniIssue } from "./muniIssues.types";
3
3
  export declare const getMuniIssuesCollection: () => Collection<MuniIssue>;
4
4
  export declare const generateMuniIssueId: () => ObjectId;
5
5
  export declare const getMuniIssueById: (id: string) => Promise<MuniIssue | null>;
6
6
  export declare const getMuniIssueByJiraKey: (jiraKey: string) => Promise<MuniIssue | null>;
7
+ /** A client's tracked issues, newest first. `limit` 0 means no limit (Mongo). */
8
+ export declare const findMuniIssuesByClient: (clientId: string, { answered, skip, limit }?: FindMuniIssuesOptions) => Promise<MuniIssue[]>;
9
+ export declare const countMuniIssuesByClient: (clientId: string, { answered }?: Pick<FindMuniIssuesOptions, "answered">) => Promise<number>;
10
+ /** One tracked issue, only if it belongs to the client. */
11
+ export declare const getMuniIssueByIdForClient: (id: string, clientId: string) => Promise<MuniIssue | null>;
7
12
  //# sourceMappingURL=muniIssues.getters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"muniIssues.getters.d.ts","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.getters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,eAAO,MAAM,uBAAuB,QAAO,UAAU,CAAC,SAAS,CAE9D,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAO,QAA0B,CAAC;AAElE,eAAO,MAAM,gBAAgB,GAC3B,IAAI,MAAM,KACT,OAAO,CAAC,SAAS,GAAG,IAAI,CAI1B,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,SAAS,MAAM,KACd,OAAO,CAAC,SAAS,GAAG,IAAI,CAE1B,CAAC"}
1
+ {"version":3,"file":"muniIssues.getters.d.ts","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.getters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAU,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGtE,eAAO,MAAM,uBAAuB,QAAO,UAAU,CAAC,SAAS,CAE9D,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAO,QAA0B,CAAC;AAElE,eAAO,MAAM,gBAAgB,GAC3B,IAAI,MAAM,KACT,OAAO,CAAC,SAAS,GAAG,IAAI,CAI1B,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,SAAS,MAAM,KACd,OAAO,CAAC,SAAS,GAAG,IAAI,CAE1B,CAAC;AAYF,iFAAiF;AACjF,eAAO,MAAM,sBAAsB,GACjC,UAAU,MAAM,EAChB,4BAAmC,qBAA0B,KAC5D,OAAO,CAAC,SAAS,EAAE,CAOrB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,UAAU,MAAM,EAChB,eAAc,IAAI,CAAC,qBAAqB,EAAE,UAAU,CAAM,KACzD,OAAO,CAAC,MAAM,CAIhB,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,yBAAyB,GACpC,IAAI,MAAM,EACV,UAAU,MAAM,KACf,OAAO,CAAC,SAAS,GAAG,IAAI,CAM1B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getMuniIssueByJiraKey = exports.getMuniIssueById = exports.generateMuniIssueId = exports.getMuniIssuesCollection = void 0;
3
+ exports.getMuniIssueByIdForClient = exports.countMuniIssuesByClient = exports.findMuniIssuesByClient = exports.getMuniIssueByJiraKey = exports.getMuniIssueById = exports.generateMuniIssueId = exports.getMuniIssuesCollection = void 0;
4
4
  const mongodb_1 = require("mongodb");
5
5
  const index_1 = require("../index");
6
6
  const muniIssues_constants_1 = require("./muniIssues.constants");
@@ -21,4 +21,34 @@ const getMuniIssueByJiraKey = async (jiraKey) => {
21
21
  return (0, exports.getMuniIssuesCollection)().findOne({ "jira.key": jiraKey });
22
22
  };
23
23
  exports.getMuniIssueByJiraKey = getMuniIssueByJiraKey;
24
+ // Tracked issues of one client. Issues without a status predate complaint tracking and are excluded.
25
+ const clientIssuesFilter = (clientId, answered) => ({
26
+ clientId,
27
+ status: { $exists: true },
28
+ ...(answered !== undefined && { response: { $exists: answered } }),
29
+ });
30
+ /** A client's tracked issues, newest first. `limit` 0 means no limit (Mongo). */
31
+ const findMuniIssuesByClient = async (clientId, { answered, skip = 0, limit = 0 } = {}) => {
32
+ return (0, exports.getMuniIssuesCollection)()
33
+ .find(clientIssuesFilter(clientId, answered))
34
+ .sort({ createdAt: -1 })
35
+ .skip(skip)
36
+ .limit(limit)
37
+ .toArray();
38
+ };
39
+ exports.findMuniIssuesByClient = findMuniIssuesByClient;
40
+ const countMuniIssuesByClient = async (clientId, { answered } = {}) => {
41
+ return (0, exports.getMuniIssuesCollection)().countDocuments(clientIssuesFilter(clientId, answered));
42
+ };
43
+ exports.countMuniIssuesByClient = countMuniIssuesByClient;
44
+ /** One tracked issue, only if it belongs to the client. */
45
+ const getMuniIssueByIdForClient = async (id, clientId) => {
46
+ if (!mongodb_1.ObjectId.isValid(id))
47
+ return null;
48
+ return (0, exports.getMuniIssuesCollection)().findOne({
49
+ ...clientIssuesFilter(clientId),
50
+ _id: new mongodb_1.ObjectId(id),
51
+ });
52
+ };
53
+ exports.getMuniIssueByIdForClient = getMuniIssueByIdForClient;
24
54
  //# sourceMappingURL=muniIssues.getters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"muniIssues.getters.js","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.getters.ts"],"names":[],"mappings":";;;AAAA,qCAA+C;AAC/C,oCAAiC;AAEjC,iEAAgE;AAEzD,MAAM,uBAAuB,GAAG,GAA0B,EAAE;IACjE,OAAO,IAAA,aAAK,GAAE,CAAC,UAAU,CAAY,6CAAsB,CAAC,CAAC;AAC/D,CAAC,CAAC;AAFW,QAAA,uBAAuB,2BAElC;AAEK,MAAM,mBAAmB,GAAG,GAAa,EAAE,CAAC,IAAI,kBAAQ,EAAE,CAAC;AAArD,QAAA,mBAAmB,uBAAkC;AAE3D,MAAM,gBAAgB,GAAG,KAAK,EACnC,EAAU,EACiB,EAAE;IAC7B,iFAAiF;IACjF,IAAI,CAAC,kBAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,IAAA,+BAAuB,GAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,kBAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACtE,CAAC,CAAC;AANW,QAAA,gBAAgB,oBAM3B;AAEK,MAAM,qBAAqB,GAAG,KAAK,EACxC,OAAe,EACY,EAAE;IAC7B,OAAO,IAAA,+BAAuB,GAAE,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;AACpE,CAAC,CAAC;AAJW,QAAA,qBAAqB,yBAIhC"}
1
+ {"version":3,"file":"muniIssues.getters.js","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.getters.ts"],"names":[],"mappings":";;;AAAA,qCAAuD;AACvD,oCAAiC;AAEjC,iEAAgE;AAEzD,MAAM,uBAAuB,GAAG,GAA0B,EAAE;IACjE,OAAO,IAAA,aAAK,GAAE,CAAC,UAAU,CAAY,6CAAsB,CAAC,CAAC;AAC/D,CAAC,CAAC;AAFW,QAAA,uBAAuB,2BAElC;AAEK,MAAM,mBAAmB,GAAG,GAAa,EAAE,CAAC,IAAI,kBAAQ,EAAE,CAAC;AAArD,QAAA,mBAAmB,uBAAkC;AAE3D,MAAM,gBAAgB,GAAG,KAAK,EACnC,EAAU,EACiB,EAAE;IAC7B,iFAAiF;IACjF,IAAI,CAAC,kBAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,IAAA,+BAAuB,GAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,kBAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACtE,CAAC,CAAC;AANW,QAAA,gBAAgB,oBAM3B;AAEK,MAAM,qBAAqB,GAAG,KAAK,EACxC,OAAe,EACY,EAAE;IAC7B,OAAO,IAAA,+BAAuB,GAAE,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;AACpE,CAAC,CAAC;AAJW,QAAA,qBAAqB,yBAIhC;AAEF,qGAAqG;AACrG,MAAM,kBAAkB,GAAG,CACzB,QAAgB,EAChB,QAAkB,EACC,EAAE,CAAC,CAAC;IACvB,QAAQ;IACR,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;IACzB,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC;CACnE,CAAC,CAAC;AAEH,iFAAiF;AAC1E,MAAM,sBAAsB,GAAG,KAAK,EACzC,QAAgB,EAChB,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,KAA4B,EAAE,EACvC,EAAE;IACxB,OAAO,IAAA,+BAAuB,GAAE;SAC7B,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;SAC5C,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;SACvB,IAAI,CAAC,IAAI,CAAC;SACV,KAAK,CAAC,KAAK,CAAC;SACZ,OAAO,EAAE,CAAC;AACf,CAAC,CAAC;AAVW,QAAA,sBAAsB,0BAUjC;AAEK,MAAM,uBAAuB,GAAG,KAAK,EAC1C,QAAgB,EAChB,EAAE,QAAQ,KAA8C,EAAE,EACzC,EAAE;IACnB,OAAO,IAAA,+BAAuB,GAAE,CAAC,cAAc,CAC7C,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACvC,CAAC;AACJ,CAAC,CAAC;AAPW,QAAA,uBAAuB,2BAOlC;AAEF,2DAA2D;AACpD,MAAM,yBAAyB,GAAG,KAAK,EAC5C,EAAU,EACV,QAAgB,EACW,EAAE;IAC7B,IAAI,CAAC,kBAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,IAAA,+BAAuB,GAAE,CAAC,OAAO,CAAC;QACvC,GAAG,kBAAkB,CAAC,QAAQ,CAAC;QAC/B,GAAG,EAAE,IAAI,kBAAQ,CAAC,EAAE,CAAC;KACtB,CAAC,CAAC;AACL,CAAC,CAAC;AATW,QAAA,yBAAyB,6BASpC"}
@@ -1 +1 @@
1
- {"version":3,"file":"muniIssues.schema.d.ts","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAO1D,eAAO,MAAM,oBAAoB,EAAE,QAmDlC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,gBAAgB,EAK/C,CAAC"}
1
+ {"version":3,"file":"muniIssues.schema.d.ts","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAS1D,eAAO,MAAM,oBAAoB,EAAE,QAmElC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,gBAAgB,EAO/C,CAAC"}
@@ -52,11 +52,29 @@ exports.muniIssuesJsonSchema = {
52
52
  },
53
53
  },
54
54
  createdAt: { bsonType: "date" },
55
+ status: { enum: [...muniIssues_constants_1.MUNI_ISSUE_STATUSES] },
56
+ response: {
57
+ bsonType: "object",
58
+ required: ["text", "createdAt"],
59
+ properties: {
60
+ text: { bsonType: "string", maxLength: muniIssues_constants_1.MUNI_ISSUE_TEXT_MAX_LENGTH },
61
+ imageUrls: {
62
+ bsonType: "array",
63
+ maxItems: muniIssues_constants_1.MUNI_ISSUE_MAX_RESPONSE_IMAGES,
64
+ items: { bsonType: "string" },
65
+ },
66
+ createdAt: { bsonType: "date" },
67
+ updatedAt: { bsonType: "date" },
68
+ },
69
+ },
70
+ updatedAt: { bsonType: "date" },
55
71
  },
56
72
  };
57
73
  exports.muniIssuesIndexes = [
58
74
  { key: { callSid: 1 }, name: "callSid_1" },
59
75
  { key: { createdAt: -1 }, name: "createdAt_-1" },
76
+ // Complaint list: one municipality's issues, newest first.
77
+ { key: { clientId: 1, createdAt: -1 }, name: "clientId_1_createdAt_-1" },
60
78
  // Unique: one stored document per Jira ticket, guarding against duplicate writes.
61
79
  { key: { "jira.key": 1 }, name: "jira_key_unique", unique: true },
62
80
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"muniIssues.schema.js","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.schema.ts"],"names":[],"mappings":";;;AACA,iEAIgC;AAEnB,QAAA,oBAAoB,GAAa;IAC5C,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE;QACR,SAAS;QACT,UAAU;QACV,UAAU;QACV,cAAc;QACd,MAAM;QACN,WAAW;KACZ;IACD,UAAU,EAAE;QACV,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;QAC/B,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;QAChC,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;QAChC,YAAY,EAAE;YACZ,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE;gBACR,YAAY;gBACZ,YAAY;gBACZ,kBAAkB;gBAClB,iBAAiB;aAClB;YACD,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,QAAQ,EAAE,QAAQ;oBAClB,SAAS,EAAE,iDAA0B;iBACtC;gBACD,UAAU,EAAE;oBACV,QAAQ,EAAE,QAAQ;oBAClB,SAAS,EAAE,iDAA0B;iBACtC;gBACD,gBAAgB,EAAE;oBAChB,QAAQ,EAAE,QAAQ;oBAClB,SAAS,EAAE,iDAA0B;iBACtC;gBACD,eAAe,EAAE;oBACf,QAAQ,EAAE,QAAQ;oBAClB,SAAS,EAAE,iDAA0B;iBACtC;aACF;SACF;QACD,IAAI,EAAE;YACJ,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC;YAC/B,UAAU,EAAE;gBACV,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;gBAC3B,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,+CAAwB,CAAC,EAAE;aACpD;SACF;QACD,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;KAChC;CACF,CAAC;AAEW,QAAA,iBAAiB,GAAuB;IACnD,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;IAC1C,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;IAChD,kFAAkF;IAClF,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE;CAClE,CAAC"}
1
+ {"version":3,"file":"muniIssues.schema.js","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.schema.ts"],"names":[],"mappings":";;;AACA,iEAMgC;AAEnB,QAAA,oBAAoB,GAAa;IAC5C,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE;QACR,SAAS;QACT,UAAU;QACV,UAAU;QACV,cAAc;QACd,MAAM;QACN,WAAW;KACZ;IACD,UAAU,EAAE;QACV,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;QAC/B,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;QAChC,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;QAChC,YAAY,EAAE;YACZ,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE;gBACR,YAAY;gBACZ,YAAY;gBACZ,kBAAkB;gBAClB,iBAAiB;aAClB;YACD,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,QAAQ,EAAE,QAAQ;oBAClB,SAAS,EAAE,iDAA0B;iBACtC;gBACD,UAAU,EAAE;oBACV,QAAQ,EAAE,QAAQ;oBAClB,SAAS,EAAE,iDAA0B;iBACtC;gBACD,gBAAgB,EAAE;oBAChB,QAAQ,EAAE,QAAQ;oBAClB,SAAS,EAAE,iDAA0B;iBACtC;gBACD,eAAe,EAAE;oBACf,QAAQ,EAAE,QAAQ;oBAClB,SAAS,EAAE,iDAA0B;iBACtC;aACF;SACF;QACD,IAAI,EAAE;YACJ,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC;YAC/B,UAAU,EAAE;gBACV,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;gBAC3B,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,+CAAwB,CAAC,EAAE;aACpD;SACF;QACD,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;QAC/B,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,0CAAmB,CAAC,EAAE;QAC1C,QAAQ,EAAE;YACR,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;YAC/B,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,iDAA0B,EAAE;gBACnE,SAAS,EAAE;oBACT,QAAQ,EAAE,OAAO;oBACjB,QAAQ,EAAE,qDAA8B;oBACxC,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;iBAC9B;gBACD,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;gBAC/B,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;aAChC;SACF;QACD,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;KAChC;CACF,CAAC;AAEW,QAAA,iBAAiB,GAAuB;IACnD,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;IAC1C,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;IAChD,2DAA2D;IAC3D,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE;IACxE,kFAAkF;IAClF,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE;CAClE,CAAC"}
@@ -1,4 +1,12 @@
1
1
  import { ObjectId } from "mongodb";
2
- import { CreateMuniIssueInput } from "./muniIssues.types";
2
+ import { CreateMuniIssueInput, MuniIssueStatus, SetMuniIssueResponseInput } from "./muniIssues.types";
3
3
  export declare const createMuniIssue: (issueData: CreateMuniIssueInput, id: ObjectId) => Promise<ObjectId>;
4
+ /** Changes the status of an issue, answered or not. Returns false if none matched. */
5
+ export declare const updateMuniIssueStatus: (id: string, clientId: string, status: MuniIssueStatus) => Promise<boolean>;
6
+ /**
7
+ * Saves the TalkPilot response, or replaces an existing one (text and images).
8
+ * Keeps the original `response.createdAt` and sets `response.updatedAt` on an edit.
9
+ * Returns false if none matched.
10
+ */
11
+ export declare const setMuniIssueResponse: (id: string, clientId: string, { status, text, imageUrls }: SetMuniIssueResponseInput) => Promise<boolean>;
4
12
  //# sourceMappingURL=muniIssues.setters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"muniIssues.setters.d.ts","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.setters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAa,MAAM,oBAAoB,CAAC;AAKrE,eAAO,MAAM,eAAe,GAC1B,WAAW,oBAAoB,EAC/B,IAAI,QAAQ,KACX,OAAO,CAAC,QAAQ,CAclB,CAAC"}
1
+ {"version":3,"file":"muniIssues.setters.d.ts","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.setters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EACL,oBAAoB,EAEpB,eAAe,EACf,yBAAyB,EAC1B,MAAM,oBAAoB,CAAC;AAK5B,eAAO,MAAM,eAAe,GAC1B,WAAW,oBAAoB,EAC/B,IAAI,QAAQ,KACX,OAAO,CAAC,QAAQ,CAiBlB,CAAC;AASF,sFAAsF;AACtF,eAAO,MAAM,qBAAqB,GAChC,IAAI,MAAM,EACV,UAAU,MAAM,EAChB,QAAQ,eAAe,KACtB,OAAO,CAAC,OAAO,CASjB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAC/B,IAAI,MAAM,EACV,UAAU,MAAM,EAChB,6BAA6B,yBAAyB,KACrD,OAAO,CAAC,OAAO,CA2BjB,CAAC"}
@@ -1,11 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createMuniIssue = void 0;
3
+ exports.setMuniIssueResponse = exports.updateMuniIssueStatus = exports.createMuniIssue = void 0;
4
+ const mongodb_1 = require("mongodb");
4
5
  const muniIssues_getters_1 = require("./muniIssues.getters");
5
6
  const muniIssues_setup_1 = require("./muniIssues.setup");
6
7
  // Required `id`: MIS pre-generates it (generateMuniIssueId) and embeds it in the Jira ticket — the two-way link.
7
8
  const createMuniIssue = async (issueData, id) => {
8
9
  await (0, muniIssues_setup_1.ensureMuniIssuesCollectionOnce)();
10
+ const now = new Date();
9
11
  const issue = {
10
12
  _id: id,
11
13
  ...issueData,
@@ -13,10 +15,58 @@ const createMuniIssue = async (issueData, id) => {
13
15
  ...issueData.jira,
14
16
  syncStatus: issueData.jira.syncStatus ?? "created",
15
17
  },
16
- createdAt: new Date(),
18
+ status: "in_review",
19
+ createdAt: now,
20
+ updatedAt: now,
17
21
  };
18
22
  const { insertedId } = await (0, muniIssues_getters_1.getMuniIssuesCollection)().insertOne(issue);
19
23
  return insertedId;
20
24
  };
21
25
  exports.createMuniIssue = createMuniIssue;
26
+ // An issue of this client that is tracked (has a status); answered issues stay editable.
27
+ const trackedIssueFilter = (id, clientId) => ({
28
+ _id: new mongodb_1.ObjectId(id),
29
+ clientId,
30
+ status: { $exists: true },
31
+ });
32
+ /** Changes the status of an issue, answered or not. Returns false if none matched. */
33
+ const updateMuniIssueStatus = async (id, clientId, status) => {
34
+ if (!mongodb_1.ObjectId.isValid(id))
35
+ return false;
36
+ await (0, muniIssues_setup_1.ensureMuniIssuesCollectionOnce)();
37
+ const { matchedCount } = await (0, muniIssues_getters_1.getMuniIssuesCollection)().updateOne(trackedIssueFilter(id, clientId), { $set: { status, updatedAt: new Date() } });
38
+ return matchedCount > 0;
39
+ };
40
+ exports.updateMuniIssueStatus = updateMuniIssueStatus;
41
+ /**
42
+ * Saves the TalkPilot response, or replaces an existing one (text and images).
43
+ * Keeps the original `response.createdAt` and sets `response.updatedAt` on an edit.
44
+ * Returns false if none matched.
45
+ */
46
+ const setMuniIssueResponse = async (id, clientId, { status, text, imageUrls }) => {
47
+ if (!mongodb_1.ObjectId.isValid(id))
48
+ return false;
49
+ await (0, muniIssues_setup_1.ensureMuniIssuesCollectionOnce)();
50
+ const now = new Date();
51
+ // Pipeline update, so the first-sent date can be read from the stored response.
52
+ // $literal: user text starting with "$" must not be read as a field path.
53
+ const { matchedCount } = await (0, muniIssues_getters_1.getMuniIssuesCollection)().updateOne(trackedIssueFilter(id, clientId), [
54
+ {
55
+ $set: {
56
+ status: { $literal: status },
57
+ updatedAt: now,
58
+ response: {
59
+ text: { $literal: text },
60
+ imageUrls: { $literal: imageUrls ?? [] },
61
+ createdAt: { $ifNull: ["$response.createdAt", now] },
62
+ updatedAt: {
63
+ $cond: [{ $ifNull: ["$response.createdAt", false] }, now, "$$REMOVE"],
64
+ },
65
+ },
66
+ },
67
+ },
68
+ ]);
69
+ return matchedCount > 0;
70
+ };
71
+ exports.setMuniIssueResponse = setMuniIssueResponse;
22
72
  //# sourceMappingURL=muniIssues.setters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"muniIssues.setters.js","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.setters.ts"],"names":[],"mappings":";;;AAEA,6DAA+D;AAC/D,yDAAoE;AAEpE,iHAAiH;AAC1G,MAAM,eAAe,GAAG,KAAK,EAClC,SAA+B,EAC/B,EAAY,EACO,EAAE;IACrB,MAAM,IAAA,iDAA8B,GAAE,CAAC;IAEvC,MAAM,KAAK,GAAc;QACvB,GAAG,EAAE,EAAE;QACP,GAAG,SAAS;QACZ,IAAI,EAAE;YACJ,GAAG,SAAS,CAAC,IAAI;YACjB,UAAU,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU,IAAI,SAAS;SACnD;QACD,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC;IACF,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAA,4CAAuB,GAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxE,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAjBW,QAAA,eAAe,mBAiB1B"}
1
+ {"version":3,"file":"muniIssues.setters.js","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.setters.ts"],"names":[],"mappings":";;;AAAA,qCAA2C;AAO3C,6DAA+D;AAC/D,yDAAoE;AAEpE,iHAAiH;AAC1G,MAAM,eAAe,GAAG,KAAK,EAClC,SAA+B,EAC/B,EAAY,EACO,EAAE;IACrB,MAAM,IAAA,iDAA8B,GAAE,CAAC;IAEvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,KAAK,GAAc;QACvB,GAAG,EAAE,EAAE;QACP,GAAG,SAAS;QACZ,IAAI,EAAE;YACJ,GAAG,SAAS,CAAC,IAAI;YACjB,UAAU,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU,IAAI,SAAS;SACnD;QACD,MAAM,EAAE,WAAW;QACnB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf,CAAC;IACF,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAA,4CAAuB,GAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxE,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AApBW,QAAA,eAAe,mBAoB1B;AAEF,yFAAyF;AACzF,MAAM,kBAAkB,GAAG,CAAC,EAAU,EAAE,QAAgB,EAAqB,EAAE,CAAC,CAAC;IAC/E,GAAG,EAAE,IAAI,kBAAQ,CAAC,EAAE,CAAC;IACrB,QAAQ;IACR,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;CAC1B,CAAC,CAAC;AAEH,sFAAsF;AAC/E,MAAM,qBAAqB,GAAG,KAAK,EACxC,EAAU,EACV,QAAgB,EAChB,MAAuB,EACL,EAAE;IACpB,IAAI,CAAC,kBAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,IAAA,iDAA8B,GAAE,CAAC;IAEvC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAA,4CAAuB,GAAE,CAAC,SAAS,CAChE,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,EAChC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,CAC5C,CAAC;IACF,OAAO,YAAY,GAAG,CAAC,CAAC;AAC1B,CAAC,CAAC;AAbW,QAAA,qBAAqB,yBAahC;AAEF;;;;GAIG;AACI,MAAM,oBAAoB,GAAG,KAAK,EACvC,EAAU,EACV,QAAgB,EAChB,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAA6B,EACpC,EAAE;IACpB,IAAI,CAAC,kBAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,IAAA,iDAA8B,GAAE,CAAC;IAEvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,gFAAgF;IAChF,0EAA0E;IAC1E,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAA,4CAAuB,GAAE,CAAC,SAAS,CAChE,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,EAChC;QACE;YACE,IAAI,EAAE;gBACJ,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;gBAC5B,SAAS,EAAE,GAAG;gBACd,QAAQ,EAAE;oBACR,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;oBACxB,SAAS,EAAE,EAAE,QAAQ,EAAE,SAAS,IAAI,EAAE,EAAE;oBACxC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,qBAAqB,EAAE,GAAG,CAAC,EAAE;oBACpD,SAAS,EAAE;wBACT,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,qBAAqB,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,UAAU,CAAC;qBACtE;iBACF;aACF;SACF;KACF,CACF,CAAC;IACF,OAAO,YAAY,GAAG,CAAC,CAAC;AAC1B,CAAC,CAAC;AA/BW,QAAA,oBAAoB,wBA+B/B"}
@@ -1,7 +1,15 @@
1
1
  import { ObjectId } from "mongodb";
2
2
  import { CityName } from "../utils/types";
3
- import { MUNI_ISSUE_SYNC_STATUSES } from "./muniIssues.constants";
3
+ import { MUNI_ISSUE_STATUSES, MUNI_ISSUE_SYNC_STATUSES } from "./muniIssues.constants";
4
4
  export type MuniIssueSyncStatus = (typeof MUNI_ISSUE_SYNC_STATUSES)[number];
5
+ export type MuniIssueStatus = (typeof MUNI_ISSUE_STATUSES)[number];
6
+ /** The TalkPilot response. Editable: `createdAt` is when it was first sent, `updatedAt` the last edit. */
7
+ export type MuniIssueResponse = {
8
+ text: string;
9
+ imageUrls?: string[];
10
+ createdAt: Date;
11
+ updatedAt?: Date;
12
+ };
5
13
  export type MuniIssueContent = {
6
14
  issuerName: string;
7
15
  issuerRole: string;
@@ -20,11 +28,25 @@ export type MuniIssue = {
20
28
  issueContent: MuniIssueContent;
21
29
  jira: MuniIssueJira;
22
30
  createdAt: Date;
31
+ status?: MuniIssueStatus;
32
+ response?: MuniIssueResponse;
33
+ updatedAt?: Date;
23
34
  };
24
- export type CreateMuniIssueInput = Omit<MuniIssue, "_id" | "createdAt" | "jira"> & {
35
+ export type CreateMuniIssueInput = Omit<MuniIssue, "_id" | "createdAt" | "jira" | "status" | "response" | "updatedAt"> & {
25
36
  jira: {
26
37
  key: string;
27
38
  syncStatus?: MuniIssueSyncStatus;
28
39
  };
29
40
  };
41
+ export type SetMuniIssueResponseInput = {
42
+ status: MuniIssueStatus;
43
+ text: string;
44
+ imageUrls?: string[];
45
+ };
46
+ /** `answered` filters by whether a TalkPilot response exists; omit it for all issues. */
47
+ export type FindMuniIssuesOptions = {
48
+ answered?: boolean;
49
+ skip?: number;
50
+ limit?: number;
51
+ };
30
52
  //# sourceMappingURL=muniIssues.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"muniIssues.types.d.ts","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAElE,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,mBAAmB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,QAAQ,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC;AAIF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,SAAS,EACT,KAAK,GAAG,WAAW,GAAG,MAAM,CAC7B,GAAG;IACF,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,mBAAmB,CAAA;KAAE,CAAC;CACzD,CAAC"}
1
+ {"version":3,"file":"muniIssues.types.d.ts","sourceRoot":"","sources":["../../../src/municipal/muniIssues/muniIssues.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5E,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,0GAA0G;AAC1G,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,mBAAmB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,QAAQ,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAGhB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,CAAC;AAKF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,SAAS,EACT,KAAK,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CACnE,GAAG;IACF,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,mBAAmB,CAAA;KAAE,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,eAAe,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAEF,yFAAyF;AACzF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./residents.getters";
2
+ export { RESIDENTS_COLLECTION } from "./residents.constants";
3
+ export { residentsJsonSchema, residentsIndexes } from "./residents.schema";
4
+ export type { Resident, ResidentDoc } from "./residents.types";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/municipal/residents/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,24 @@
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
+ exports.residentsIndexes = exports.residentsJsonSchema = exports.RESIDENTS_COLLECTION = void 0;
18
+ __exportStar(require("./residents.getters"), exports);
19
+ var residents_constants_1 = require("./residents.constants");
20
+ Object.defineProperty(exports, "RESIDENTS_COLLECTION", { enumerable: true, get: function () { return residents_constants_1.RESIDENTS_COLLECTION; } });
21
+ var residents_schema_1 = require("./residents.schema");
22
+ Object.defineProperty(exports, "residentsJsonSchema", { enumerable: true, get: function () { return residents_schema_1.residentsJsonSchema; } });
23
+ Object.defineProperty(exports, "residentsIndexes", { enumerable: true, get: function () { return residents_schema_1.residentsIndexes; } });
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/municipal/residents/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,6DAA6D;AAApD,2HAAA,oBAAoB,OAAA;AAC7B,uDAA2E;AAAlE,uHAAA,mBAAmB,OAAA;AAAE,oHAAA,gBAAgB,OAAA"}
@@ -0,0 +1,3 @@
1
+ /** Mongo collection name for municipal resident records. */
2
+ export declare const RESIDENTS_COLLECTION = "residents";
3
+ //# sourceMappingURL=residents.constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"residents.constants.d.ts","sourceRoot":"","sources":["../../../src/municipal/residents/residents.constants.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,eAAO,MAAM,oBAAoB,cAAc,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RESIDENTS_COLLECTION = void 0;
4
+ /** Mongo collection name for municipal resident records. */
5
+ exports.RESIDENTS_COLLECTION = "residents";
6
+ //# sourceMappingURL=residents.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"residents.constants.js","sourceRoot":"","sources":["../../../src/municipal/residents/residents.constants.ts"],"names":[],"mappings":";;;AAAA,4DAA4D;AAC/C,QAAA,oBAAoB,GAAG,WAAW,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Collection, Filter } from "mongodb";
2
+ import { CityName, Resident } from "../index";
3
+ export declare const getResidentsCollection: () => Collection<Resident>;
4
+ export declare const findResidents: (filter?: Filter<Resident>) => Promise<Resident[]>;
5
+ export declare const getResidentById: (residentId: string) => Promise<Resident | null>;
6
+ export declare const findResidentsByCityAndPhone: (cityName: CityName, phoneNumber: string) => Promise<Resident[]>;
7
+ export declare const getResidentByCityAndIdNumber: (cityName: CityName, idNumber: string) => Promise<Resident | null>;
8
+ export declare const getResidentByCityPhoneAndIdNumber: (cityName: CityName, phoneNumber: string, idNumber: string) => Promise<Resident | null>;
9
+ //# sourceMappingURL=residents.getters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"residents.getters.d.ts","sourceRoot":"","sources":["../../../src/municipal/residents/residents.getters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAmB,QAAQ,EAAE,MAAM,UAAU,CAAC;AAG/D,eAAO,MAAM,sBAAsB,QAAO,UAAU,CAAC,QAAQ,CAE5D,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,SAAQ,MAAM,CAAC,QAAQ,CAAM,KAC5B,OAAO,CAAC,QAAQ,EAAE,CAEpB,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,YAAY,MAAM,KACjB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAGzB,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,UAAU,QAAQ,EAClB,aAAa,MAAM,KAClB,OAAO,CAAC,QAAQ,EAAE,CAEpB,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,UAAU,QAAQ,EAClB,UAAU,MAAM,KACf,OAAO,CAAC,QAAQ,GAAG,IAAI,CAEzB,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC5C,UAAU,QAAQ,EAClB,aAAa,MAAM,EACnB,UAAU,MAAM,KACf,OAAO,CAAC,QAAQ,GAAG,IAAI,CAEzB,CAAC"}