@talkpilot/core-db 1.3.50 → 1.3.52
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.
- package/.cursor/rules/development.mdc +65 -65
- package/AGENTS.md +49 -49
- package/DEVELOPMENT.md +141 -141
- package/README.md +797 -778
- package/dist/configuration/models/models.constants.d.ts +1 -1
- package/dist/configuration/models/models.constants.d.ts.map +1 -1
- package/dist/configuration/models/models.constants.js +1 -6
- package/dist/configuration/models/models.constants.js.map +1 -1
- package/dist/talkpilot/auditLogs/auditLogs.getters.d.ts +8 -0
- package/dist/talkpilot/auditLogs/auditLogs.getters.d.ts.map +1 -0
- package/dist/talkpilot/auditLogs/auditLogs.getters.js +26 -0
- package/dist/talkpilot/auditLogs/auditLogs.getters.js.map +1 -0
- package/dist/talkpilot/auditLogs/auditLogs.setters.d.ts +3 -0
- package/dist/talkpilot/auditLogs/auditLogs.setters.d.ts.map +1 -0
- package/dist/talkpilot/auditLogs/auditLogs.setters.js +9 -0
- package/dist/talkpilot/auditLogs/auditLogs.setters.js.map +1 -0
- package/dist/talkpilot/auditLogs/auditLogs.types.d.ts +12 -0
- package/dist/talkpilot/auditLogs/auditLogs.types.d.ts.map +1 -0
- package/dist/talkpilot/auditLogs/auditLogs.types.js +3 -0
- package/dist/talkpilot/auditLogs/auditLogs.types.js.map +1 -0
- package/dist/talkpilot/auditLogs/index.d.ts +3 -0
- package/dist/talkpilot/auditLogs/index.d.ts.map +1 -0
- package/dist/talkpilot/auditLogs/index.js +19 -0
- package/dist/talkpilot/auditLogs/index.js.map +1 -0
- package/dist/talkpilot/calls/calls.constants.d.ts +1 -1
- package/dist/talkpilot/clientDeletionLogs/clientDeletionLogs.getters.d.ts +4 -0
- package/dist/talkpilot/clientDeletionLogs/clientDeletionLogs.getters.d.ts.map +1 -0
- package/dist/talkpilot/clientDeletionLogs/clientDeletionLogs.getters.js +9 -0
- package/dist/talkpilot/clientDeletionLogs/clientDeletionLogs.getters.js.map +1 -0
- package/dist/talkpilot/clientDeletionLogs/clientDeletionLogs.setters.d.ts +3 -0
- package/dist/talkpilot/clientDeletionLogs/clientDeletionLogs.setters.d.ts.map +1 -0
- package/dist/talkpilot/clientDeletionLogs/clientDeletionLogs.setters.js +9 -0
- package/dist/talkpilot/clientDeletionLogs/clientDeletionLogs.setters.js.map +1 -0
- package/dist/talkpilot/clientDeletionLogs/clientDeletionLogs.types.d.ts +10 -0
- package/dist/talkpilot/clientDeletionLogs/clientDeletionLogs.types.d.ts.map +1 -0
- package/dist/talkpilot/clientDeletionLogs/clientDeletionLogs.types.js +3 -0
- package/dist/talkpilot/clientDeletionLogs/clientDeletionLogs.types.js.map +1 -0
- package/dist/talkpilot/clientDeletionLogs/index.d.ts +4 -0
- package/dist/talkpilot/clientDeletionLogs/index.d.ts.map +1 -0
- package/dist/talkpilot/clientDeletionLogs/index.js +20 -0
- package/dist/talkpilot/clientDeletionLogs/index.js.map +1 -0
- package/dist/talkpilot/clients/clients.constants.d.ts +3 -0
- package/dist/talkpilot/clients/clients.constants.d.ts.map +1 -0
- package/dist/talkpilot/clients/clients.constants.js +6 -0
- package/dist/talkpilot/clients/clients.constants.js.map +1 -0
- package/dist/talkpilot/clients/clients.getters.d.ts +1 -0
- package/dist/talkpilot/clients/clients.getters.d.ts.map +1 -1
- package/dist/talkpilot/clients/clients.getters.js +8 -1
- package/dist/talkpilot/clients/clients.getters.js.map +1 -1
- package/dist/talkpilot/clients/clients.lifecycle.d.ts +10 -0
- package/dist/talkpilot/clients/clients.lifecycle.d.ts.map +1 -0
- package/dist/talkpilot/clients/clients.lifecycle.js +95 -0
- package/dist/talkpilot/clients/clients.lifecycle.js.map +1 -0
- package/dist/talkpilot/clients/clients.types.d.ts +21 -0
- package/dist/talkpilot/clients/clients.types.d.ts.map +1 -1
- package/dist/talkpilot/clients/index.d.ts +2 -0
- package/dist/talkpilot/clients/index.d.ts.map +1 -1
- package/dist/talkpilot/clients/index.js +2 -0
- package/dist/talkpilot/clients/index.js.map +1 -1
- package/dist/talkpilot/flows/flows.getter.d.ts +1 -4
- package/dist/talkpilot/flows/flows.getter.d.ts.map +1 -1
- package/dist/talkpilot/flows/flows.getter.js +1 -12
- package/dist/talkpilot/flows/flows.getter.js.map +1 -1
- package/dist/talkpilot/flows/flows.schema.d.ts +0 -31
- package/dist/talkpilot/flows/flows.schema.d.ts.map +1 -1
- package/dist/talkpilot/flows/flows.schema.js +0 -25
- package/dist/talkpilot/flows/flows.schema.js.map +1 -1
- package/dist/talkpilot/flows/flows.types.d.ts +0 -14
- package/dist/talkpilot/flows/flows.types.d.ts.map +1 -1
- package/dist/talkpilot/flows/index.d.ts +1 -1
- package/dist/talkpilot/flows/index.d.ts.map +1 -1
- package/dist/talkpilot/flows/index.js +1 -3
- package/dist/talkpilot/flows/index.js.map +1 -1
- package/dist/talkpilot/index.d.ts +1 -0
- package/dist/talkpilot/index.d.ts.map +1 -1
- package/dist/talkpilot/index.js +1 -0
- package/dist/talkpilot/index.js.map +1 -1
- package/dist/talkpilot/phone_numbers/phone_numbers.getter.d.ts +11 -0
- package/dist/talkpilot/phone_numbers/phone_numbers.getter.d.ts.map +1 -1
- package/dist/talkpilot/phone_numbers/phone_numbers.getter.js +60 -1
- package/dist/talkpilot/phone_numbers/phone_numbers.getter.js.map +1 -1
- package/dist/talkpilot/results/index.d.ts +3 -0
- package/dist/talkpilot/results/index.d.ts.map +1 -1
- package/dist/talkpilot/results/index.js +22 -1
- package/dist/talkpilot/results/index.js.map +1 -1
- package/dist/talkpilot/results/results.constants.d.ts +9 -0
- package/dist/talkpilot/results/results.constants.d.ts.map +1 -0
- package/dist/talkpilot/results/results.constants.js +12 -0
- package/dist/talkpilot/results/results.constants.js.map +1 -0
- package/dist/talkpilot/results/results.getter.d.ts.map +1 -1
- package/dist/talkpilot/results/results.getter.js +3 -2
- package/dist/talkpilot/results/results.getter.js.map +1 -1
- package/dist/talkpilot/results/results.statistics.getters.d.ts +7 -0
- package/dist/talkpilot/results/results.statistics.getters.d.ts.map +1 -0
- package/dist/talkpilot/results/results.statistics.getters.js +244 -0
- package/dist/talkpilot/results/results.statistics.getters.js.map +1 -0
- package/dist/talkpilot/results/results.statistics.types.d.ts +42 -0
- package/dist/talkpilot/results/results.statistics.types.d.ts.map +1 -0
- package/dist/talkpilot/results/results.statistics.types.js +3 -0
- package/dist/talkpilot/results/results.statistics.types.js.map +1 -0
- package/dist/test-utils/factories/index.d.ts +2 -0
- package/dist/test-utils/factories/index.d.ts.map +1 -1
- package/dist/test-utils/factories/index.js +2 -0
- package/dist/test-utils/factories/index.js.map +1 -1
- package/dist/test-utils/factories/talkpilot/clients.d.ts +14 -0
- package/dist/test-utils/factories/talkpilot/clients.d.ts.map +1 -0
- package/dist/test-utils/factories/talkpilot/clients.js +19 -0
- package/dist/test-utils/factories/talkpilot/clients.js.map +1 -0
- package/dist/test-utils/factories/talkpilot/results.d.ts +16 -0
- package/dist/test-utils/factories/talkpilot/results.d.ts.map +1 -0
- package/dist/test-utils/factories/talkpilot/results.js +40 -0
- package/dist/test-utils/factories/talkpilot/results.js.map +1 -0
- package/jest.config.js +20 -20
- package/package.json +46 -46
- package/src/__tests__/setup.ts +20 -20
- package/src/bulkWrite/__tests__/bulkWrite.spec.ts +65 -65
- package/src/bulkWrite/bulkWrite.ops.ts +45 -45
- package/src/bulkWrite/bulkWrite.types.ts +4 -4
- package/src/bulkWrite/index.ts +2 -2
- package/src/config.ts +9 -9
- package/src/configuration/index.ts +17 -17
- package/src/configuration/internalModels/index.ts +3 -3
- package/src/configuration/internalModels/internalModels.constants.ts +1 -1
- package/src/configuration/internalModels/internalModels.getters.ts +33 -33
- package/src/configuration/internalModels/internalModels.types.ts +12 -12
- package/src/configuration/models/index.ts +25 -25
- package/src/configuration/models/models.constants.ts +13 -18
- package/src/configuration/models/models.getters.ts +53 -53
- package/src/configuration/models/models.types.ts +79 -79
- package/src/configuration/mongodb-client.ts +62 -62
- package/src/configuration/prompts/index.ts +2 -2
- package/src/configuration/prompts/prompts.getters.ts +49 -49
- package/src/configuration/prompts/prompts.types.ts +11 -11
- package/src/connection.ts +81 -81
- package/src/index.ts +46 -46
- package/src/municipal/__tests__/validation.spec.ts +62 -62
- package/src/municipal/cities/cities.getters.ts +50 -50
- package/src/municipal/cities/cities.types.ts +11 -11
- package/src/municipal/cities/index.ts +2 -2
- package/src/municipal/departmentsSubjects/__tests__/departmentsSubjects.spec.ts +272 -272
- package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +317 -317
- package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +73 -73
- package/src/municipal/departmentsSubjects/index.ts +9 -9
- package/src/municipal/index.ts +22 -22
- package/src/municipal/mongodb-client.ts +61 -61
- package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +94 -94
- package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +92 -92
- package/src/municipal/muniIssues/index.ts +17 -17
- package/src/municipal/muniIssues/muniIssues.constants.ts +18 -18
- package/src/municipal/muniIssues/muniIssues.getters.ts +24 -24
- package/src/municipal/muniIssues/muniIssues.schema.ts +66 -66
- package/src/municipal/muniIssues/muniIssues.setters.ts +24 -24
- package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
- package/src/municipal/muniIssues/muniIssues.types.ts +37 -37
- package/src/municipal/streets/__tests__/streets.spec.ts +253 -253
- package/src/municipal/streets/index.ts +2 -2
- package/src/municipal/streets/streets.getters.ts +140 -140
- package/src/municipal/streets/streets.types.ts +19 -19
- package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
- package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
- package/src/municipal/systemInstructions/index.ts +7 -7
- package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
- package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
- package/src/municipal/systemInstructions/instructions.types.ts +30 -30
- package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
- package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +99 -99
- package/src/municipal/tickets/index.ts +9 -9
- package/src/municipal/tickets/tickets.constants.ts +8 -8
- package/src/municipal/tickets/tickets.getters.ts +121 -121
- package/src/municipal/tickets/tickets.statistics.aggregation.ts +110 -110
- package/src/municipal/tickets/tickets.statistics.getters.ts +145 -145
- package/src/municipal/tickets/tickets.types.ts +54 -54
- package/src/municipal/utils/types.ts +11 -11
- package/src/talkpilot/__tests__/db.spec.ts +38 -38
- package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
- package/src/talkpilot/__tests__/validation.spec.ts +68 -68
- package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
- package/src/talkpilot/agents/agents.getters.ts +34 -34
- package/src/talkpilot/agents/agents.types.ts +14 -14
- package/src/talkpilot/agents/index.ts +2 -2
- package/src/talkpilot/auditLogs/__tests__/auditLogs.spec.ts +92 -0
- package/src/talkpilot/auditLogs/auditLogs.getters.ts +26 -0
- package/src/talkpilot/auditLogs/auditLogs.types.ts +13 -0
- package/src/talkpilot/auditLogs/index.ts +2 -0
- package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
- package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
- package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
- package/src/talkpilot/backgroundToolResults/index.ts +2 -2
- package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
- package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +229 -229
- package/src/talkpilot/calls/__tests__/calls.spec.ts +471 -471
- package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +483 -483
- package/src/talkpilot/calls/calls.constants.ts +49 -49
- package/src/talkpilot/calls/calls.getters.ts +277 -277
- package/src/talkpilot/calls/calls.statistics.getters.ts +668 -668
- package/src/talkpilot/calls/calls.statistics.types.ts +48 -48
- package/src/talkpilot/calls/calls.types.ts +149 -149
- package/src/talkpilot/calls/dashboard/calls.dashboard.ts +295 -295
- package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
- package/src/talkpilot/calls/index.ts +6 -6
- package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
- package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
- package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
- package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
- package/src/talkpilot/clients/__tests__/clients.getters.spec.ts +33 -0
- package/src/talkpilot/clients/__tests__/clients.lifecycle.spec.ts +166 -0
- package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -123
- package/src/talkpilot/clients/clients.constants.ts +2 -0
- package/src/talkpilot/clients/clients.getters.ts +23 -16
- package/src/talkpilot/clients/clients.lifecycle.ts +116 -0
- package/src/talkpilot/clients/clients.quota.getters.ts +119 -119
- package/src/talkpilot/clients/clients.quota.types.ts +27 -27
- package/src/talkpilot/clients/clients.types.ts +37 -18
- package/src/talkpilot/clients/index.ts +6 -4
- package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +423 -423
- package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +212 -212
- package/src/talkpilot/clientsConfig/clientsConfig.constants.ts +2 -2
- package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +247 -247
- package/src/talkpilot/clientsConfig/clientsConfig.types.ts +136 -136
- package/src/talkpilot/clientsConfig/index.ts +3 -3
- package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +217 -217
- package/src/talkpilot/contextNotes/contextNotes.getters.ts +85 -85
- package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -20
- package/src/talkpilot/contextNotes/index.ts +2 -2
- package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +99 -124
- package/src/talkpilot/flows/flows.getter.ts +14 -34
- package/src/talkpilot/flows/flows.schema.ts +155 -180
- package/src/talkpilot/flows/flows.types.ts +189 -211
- package/src/talkpilot/flows/index.ts +2 -7
- package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
- package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
- package/src/talkpilot/groups/groups.getters.ts +30 -30
- package/src/talkpilot/groups/groups.types.ts +29 -29
- package/src/talkpilot/groups/index.ts +3 -3
- package/src/talkpilot/groups/phone.utils.ts +46 -46
- package/src/talkpilot/index.ts +32 -31
- package/src/talkpilot/leads/index.ts +2 -2
- package/src/talkpilot/leads/leads.getter.ts +6 -6
- package/src/talkpilot/leads/leads.schema.ts +33 -33
- package/src/talkpilot/leads/leads.types.ts +20 -20
- package/src/talkpilot/mongodb-client.ts +78 -78
- package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +496 -282
- package/src/talkpilot/phone_numbers/index.ts +2 -2
- package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +251 -176
- package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
- package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
- package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
- package/src/talkpilot/plans/index.ts +2 -2
- package/src/talkpilot/plans/plans.getters.ts +132 -132
- package/src/talkpilot/plans/plans.types.ts +89 -89
- package/src/talkpilot/products/__tests__/products.getters.spec.ts +44 -44
- package/src/talkpilot/products/index.ts +2 -2
- package/src/talkpilot/products/products.getters.ts +12 -12
- package/src/talkpilot/products/products.types.ts +9 -9
- package/src/talkpilot/results/__tests__/results.statistics.spec.ts +226 -0
- package/src/talkpilot/results/index.ts +16 -7
- package/src/talkpilot/results/results.constants.ts +11 -0
- package/src/talkpilot/results/results.getter.ts +40 -39
- package/src/talkpilot/results/results.schema.ts +25 -25
- package/src/talkpilot/results/results.statistics.getters.ts +329 -0
- package/src/talkpilot/results/results.statistics.types.ts +45 -0
- package/src/talkpilot/results/results.types.ts +34 -34
- package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
- package/src/talkpilot/retry_analyze/index.ts +2 -2
- package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
- package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
- package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
- package/src/talkpilot/sessions/index.ts +2 -2
- package/src/talkpilot/sessions/sessions.getter.ts +92 -92
- package/src/talkpilot/sessions/sessions.schema.ts +34 -34
- package/src/talkpilot/sessions/sessions.types.ts +30 -30
- package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
- package/src/talkpilot/subscriptions/index.ts +3 -3
- package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
- package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
- package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
- package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
- package/src/talkpilot/utils/query.utils.ts +21 -21
- package/src/test-utils/db-utils.ts +33 -33
- package/src/test-utils/factories/index.ts +20 -18
- package/src/test-utils/factories/municipal/cities.ts +16 -16
- package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
- package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
- package/src/test-utils/factories/municipal/streets.ts +22 -22
- package/src/test-utils/factories/municipal/tickets.ts +39 -39
- package/src/test-utils/factories/talkpilot/agents.ts +19 -19
- package/src/test-utils/factories/talkpilot/calls.ts +37 -37
- package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
- package/src/test-utils/factories/talkpilot/clients.ts +21 -0
- package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
- package/src/test-utils/factories/talkpilot/contextNotes.ts +40 -40
- package/src/test-utils/factories/talkpilot/flows.ts +33 -33
- package/src/test-utils/factories/talkpilot/groups.ts +33 -33
- package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
- package/src/test-utils/factories/talkpilot/results.ts +43 -0
- package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
- package/src/test-utils/factories/websitalk/knowledgeDocuments.ts +29 -29
- package/src/test-utils/factories/websitalk/scanResources.ts +26 -26
- package/src/test-utils/factories/websitalk/scans.ts +29 -29
- package/src/test-utils/factories/websitalk/websiteUrls.ts +17 -17
- package/src/utils/date.utils.ts +126 -126
- package/src/utils/shared.types.ts +4 -4
- package/src/utils/validation.ts +23 -23
- package/src/websitalk/index.ts +18 -18
- package/src/websitalk/knowledgeDocuments/__tests__/knowledgeDocuments.spec.ts +186 -186
- package/src/websitalk/knowledgeDocuments/index.ts +3 -3
- package/src/websitalk/knowledgeDocuments/knowledgeDocuments.constants.ts +17 -17
- package/src/websitalk/knowledgeDocuments/knowledgeDocuments.getters.ts +78 -78
- package/src/websitalk/knowledgeDocuments/knowledgeDocuments.types.ts +62 -62
- package/src/websitalk/mongodb-client.ts +61 -61
- package/src/websitalk/scanResources/__tests__/scanResources.spec.ts +193 -193
- package/src/websitalk/scanResources/index.ts +4 -4
- package/src/websitalk/scanResources/scanResources.constants.ts +47 -47
- package/src/websitalk/scanResources/scanResources.getters.ts +102 -102
- package/src/websitalk/scanResources/scanResources.types.ts +90 -90
- package/src/websitalk/scanResources/scanResources.utils.ts +31 -31
- package/src/websitalk/scans/__tests__/scans.spec.ts +313 -313
- package/src/websitalk/scans/index.ts +4 -4
- package/src/websitalk/scans/scans.constants.ts +15 -15
- package/src/websitalk/scans/scans.getters.ts +166 -166
- package/src/websitalk/scans/scans.types.ts +54 -54
- package/src/websitalk/scans/scans.utils.ts +5 -5
- package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +77 -77
- package/src/websitalk/websiteUrls/index.ts +2 -2
- package/src/websitalk/websiteUrls/websiteUrls.getters.ts +65 -65
- package/src/websitalk/websiteUrls/websiteUrls.types.ts +13 -13
- package/tsconfig.json +23 -23
- package/dist/talkpilot/clients/clients.quota.constants.d.ts +0 -2
- package/dist/talkpilot/clients/clients.quota.constants.d.ts.map +0 -1
- package/dist/talkpilot/clients/clients.quota.constants.js +0 -5
- package/dist/talkpilot/clients/clients.quota.constants.js.map +0 -1
- package/dist/talkpilot/clients/clients.quota.utils.d.ts +0 -8
- package/dist/talkpilot/clients/clients.quota.utils.d.ts.map +0 -1
- package/dist/talkpilot/clients/clients.quota.utils.js +0 -45
- package/dist/talkpilot/clients/clients.quota.utils.js.map +0 -1
|
@@ -1,117 +1,117 @@
|
|
|
1
|
-
import { getDb } from "../index";
|
|
2
|
-
import {
|
|
3
|
-
ClientAudioBufferDoc,
|
|
4
|
-
ClientAudioBufferType,
|
|
5
|
-
CreateAudioBufferInput,
|
|
6
|
-
} from "./clientsAudioBuffers.types";
|
|
7
|
-
import { Collection, InsertOneResult, DeleteResult } from "mongodb";
|
|
8
|
-
|
|
9
|
-
const getClientAudioBuffersCollection =
|
|
10
|
-
(): Collection<ClientAudioBufferType> => {
|
|
11
|
-
return getDb().collection<ClientAudioBufferType>("clientAudioBuffers");
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Deletes all audio buffers associated with a specific callSid.
|
|
16
|
-
* Useful for clearing context between different tickets in the same call.
|
|
17
|
-
*/
|
|
18
|
-
const deleteAudioBuffersByCallSid = async (
|
|
19
|
-
callSid: string,
|
|
20
|
-
): Promise<DeleteResult> => {
|
|
21
|
-
return getClientAudioBuffersCollection().deleteMany({ callSid });
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
const insertClientAudioBuffer = async (
|
|
25
|
-
audioBufferInput: CreateAudioBufferInput,
|
|
26
|
-
): Promise<InsertOneResult<ClientAudioBufferType>> => {
|
|
27
|
-
const collection = getClientAudioBuffersCollection();
|
|
28
|
-
const realtimeDate = new Date();
|
|
29
|
-
const ttlMs = audioBufferInput.ttlMs ?? 3600_000;
|
|
30
|
-
const expiresAt = new Date(realtimeDate.getTime() + ttlMs);
|
|
31
|
-
|
|
32
|
-
const inputFieldsForDocument = {
|
|
33
|
-
callSid: audioBufferInput.callSid,
|
|
34
|
-
clientId: audioBufferInput.clientId,
|
|
35
|
-
bucketStartMs: audioBufferInput.bucketStartMs,
|
|
36
|
-
bucketDurationMs: audioBufferInput.bucketDurationMs,
|
|
37
|
-
data: audioBufferInput.data,
|
|
38
|
-
};
|
|
39
|
-
const clientAudioBufferMongoDocument: ClientAudioBufferType = {
|
|
40
|
-
...inputFieldsForDocument,
|
|
41
|
-
codec: "mulaw",
|
|
42
|
-
sampleRateHz: 8000,
|
|
43
|
-
channels: 1,
|
|
44
|
-
createdAt: realtimeDate,
|
|
45
|
-
expiresAt: expiresAt,
|
|
46
|
-
};
|
|
47
|
-
return collection.insertOne(clientAudioBufferMongoDocument);
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
const findClientAudioBuffersByCallSidAndRange = async (
|
|
51
|
-
callSid: string,
|
|
52
|
-
startMs?: number,
|
|
53
|
-
endMs?: number,
|
|
54
|
-
): Promise<ClientAudioBufferDoc[]> => {
|
|
55
|
-
const collection = getClientAudioBuffersCollection();
|
|
56
|
-
if (startMs === undefined) {
|
|
57
|
-
return collection.find({ callSid }).toArray();
|
|
58
|
-
}
|
|
59
|
-
const endMsToUse = endMs ?? Date.now();
|
|
60
|
-
return collection
|
|
61
|
-
.find({
|
|
62
|
-
callSid,
|
|
63
|
-
bucketStartMs: {
|
|
64
|
-
$gte: startMs,
|
|
65
|
-
$lte: endMsToUse,
|
|
66
|
-
},
|
|
67
|
-
})
|
|
68
|
-
.toArray();
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
const getAudioChunksByCallSid = async (
|
|
72
|
-
callSid: string,
|
|
73
|
-
limit?: number,
|
|
74
|
-
): Promise<Buffer[]> => {
|
|
75
|
-
const query = getClientAudioBuffersCollection().find({ callSid });
|
|
76
|
-
if (limit) {
|
|
77
|
-
query.sort({ bucketStartMs: -1 }).limit(limit);
|
|
78
|
-
} else {
|
|
79
|
-
query.sort({ bucketStartMs: 1 });
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const docs = await query.toArray();
|
|
83
|
-
|
|
84
|
-
if (!docs.length) {
|
|
85
|
-
return [];
|
|
86
|
-
}
|
|
87
|
-
const orderedDocs = limit ? docs.reverse() : docs;
|
|
88
|
-
|
|
89
|
-
return orderedDocs.map((chunk) => {
|
|
90
|
-
const data: any = chunk.data;
|
|
91
|
-
if (Buffer.isBuffer(data)) return data;
|
|
92
|
-
if (data?.buffer) return Buffer.from(data.buffer);
|
|
93
|
-
return Buffer.from(data);
|
|
94
|
-
});
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
const getMergedAudioByCallSid = async (
|
|
98
|
-
callSid: string,
|
|
99
|
-
limit: number,
|
|
100
|
-
): Promise<Buffer> => {
|
|
101
|
-
const buffers = await getAudioChunksByCallSid(callSid, limit);
|
|
102
|
-
|
|
103
|
-
if (!buffers.length) {
|
|
104
|
-
return Buffer.alloc(0);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
return Buffer.concat(buffers);
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
export {
|
|
111
|
-
insertClientAudioBuffer,
|
|
112
|
-
getClientAudioBuffersCollection,
|
|
113
|
-
findClientAudioBuffersByCallSidAndRange,
|
|
114
|
-
getAudioChunksByCallSid,
|
|
115
|
-
getMergedAudioByCallSid,
|
|
116
|
-
deleteAudioBuffersByCallSid,
|
|
117
|
-
};
|
|
1
|
+
import { getDb } from "../index";
|
|
2
|
+
import {
|
|
3
|
+
ClientAudioBufferDoc,
|
|
4
|
+
ClientAudioBufferType,
|
|
5
|
+
CreateAudioBufferInput,
|
|
6
|
+
} from "./clientsAudioBuffers.types";
|
|
7
|
+
import { Collection, InsertOneResult, DeleteResult } from "mongodb";
|
|
8
|
+
|
|
9
|
+
const getClientAudioBuffersCollection =
|
|
10
|
+
(): Collection<ClientAudioBufferType> => {
|
|
11
|
+
return getDb().collection<ClientAudioBufferType>("clientAudioBuffers");
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Deletes all audio buffers associated with a specific callSid.
|
|
16
|
+
* Useful for clearing context between different tickets in the same call.
|
|
17
|
+
*/
|
|
18
|
+
const deleteAudioBuffersByCallSid = async (
|
|
19
|
+
callSid: string,
|
|
20
|
+
): Promise<DeleteResult> => {
|
|
21
|
+
return getClientAudioBuffersCollection().deleteMany({ callSid });
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const insertClientAudioBuffer = async (
|
|
25
|
+
audioBufferInput: CreateAudioBufferInput,
|
|
26
|
+
): Promise<InsertOneResult<ClientAudioBufferType>> => {
|
|
27
|
+
const collection = getClientAudioBuffersCollection();
|
|
28
|
+
const realtimeDate = new Date();
|
|
29
|
+
const ttlMs = audioBufferInput.ttlMs ?? 3600_000;
|
|
30
|
+
const expiresAt = new Date(realtimeDate.getTime() + ttlMs);
|
|
31
|
+
|
|
32
|
+
const inputFieldsForDocument = {
|
|
33
|
+
callSid: audioBufferInput.callSid,
|
|
34
|
+
clientId: audioBufferInput.clientId,
|
|
35
|
+
bucketStartMs: audioBufferInput.bucketStartMs,
|
|
36
|
+
bucketDurationMs: audioBufferInput.bucketDurationMs,
|
|
37
|
+
data: audioBufferInput.data,
|
|
38
|
+
};
|
|
39
|
+
const clientAudioBufferMongoDocument: ClientAudioBufferType = {
|
|
40
|
+
...inputFieldsForDocument,
|
|
41
|
+
codec: "mulaw",
|
|
42
|
+
sampleRateHz: 8000,
|
|
43
|
+
channels: 1,
|
|
44
|
+
createdAt: realtimeDate,
|
|
45
|
+
expiresAt: expiresAt,
|
|
46
|
+
};
|
|
47
|
+
return collection.insertOne(clientAudioBufferMongoDocument);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const findClientAudioBuffersByCallSidAndRange = async (
|
|
51
|
+
callSid: string,
|
|
52
|
+
startMs?: number,
|
|
53
|
+
endMs?: number,
|
|
54
|
+
): Promise<ClientAudioBufferDoc[]> => {
|
|
55
|
+
const collection = getClientAudioBuffersCollection();
|
|
56
|
+
if (startMs === undefined) {
|
|
57
|
+
return collection.find({ callSid }).toArray();
|
|
58
|
+
}
|
|
59
|
+
const endMsToUse = endMs ?? Date.now();
|
|
60
|
+
return collection
|
|
61
|
+
.find({
|
|
62
|
+
callSid,
|
|
63
|
+
bucketStartMs: {
|
|
64
|
+
$gte: startMs,
|
|
65
|
+
$lte: endMsToUse,
|
|
66
|
+
},
|
|
67
|
+
})
|
|
68
|
+
.toArray();
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const getAudioChunksByCallSid = async (
|
|
72
|
+
callSid: string,
|
|
73
|
+
limit?: number,
|
|
74
|
+
): Promise<Buffer[]> => {
|
|
75
|
+
const query = getClientAudioBuffersCollection().find({ callSid });
|
|
76
|
+
if (limit) {
|
|
77
|
+
query.sort({ bucketStartMs: -1 }).limit(limit);
|
|
78
|
+
} else {
|
|
79
|
+
query.sort({ bucketStartMs: 1 });
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const docs = await query.toArray();
|
|
83
|
+
|
|
84
|
+
if (!docs.length) {
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
const orderedDocs = limit ? docs.reverse() : docs;
|
|
88
|
+
|
|
89
|
+
return orderedDocs.map((chunk) => {
|
|
90
|
+
const data: any = chunk.data;
|
|
91
|
+
if (Buffer.isBuffer(data)) return data;
|
|
92
|
+
if (data?.buffer) return Buffer.from(data.buffer);
|
|
93
|
+
return Buffer.from(data);
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const getMergedAudioByCallSid = async (
|
|
98
|
+
callSid: string,
|
|
99
|
+
limit: number,
|
|
100
|
+
): Promise<Buffer> => {
|
|
101
|
+
const buffers = await getAudioChunksByCallSid(callSid, limit);
|
|
102
|
+
|
|
103
|
+
if (!buffers.length) {
|
|
104
|
+
return Buffer.alloc(0);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return Buffer.concat(buffers);
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
export {
|
|
111
|
+
insertClientAudioBuffer,
|
|
112
|
+
getClientAudioBuffersCollection,
|
|
113
|
+
findClientAudioBuffersByCallSidAndRange,
|
|
114
|
+
getAudioChunksByCallSid,
|
|
115
|
+
getMergedAudioByCallSid,
|
|
116
|
+
deleteAudioBuffersByCallSid,
|
|
117
|
+
};
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import { WithId } from "mongodb";
|
|
2
|
-
|
|
3
|
-
export type ClientAudioBufferType = {
|
|
4
|
-
callSid: string;
|
|
5
|
-
clientId: string;
|
|
6
|
-
bucketStartMs: number;
|
|
7
|
-
bucketDurationMs: number;
|
|
8
|
-
codec: "mulaw";
|
|
9
|
-
sampleRateHz: 8000;
|
|
10
|
-
channels: 1;
|
|
11
|
-
data: Buffer;
|
|
12
|
-
expiresAt: Date;
|
|
13
|
-
createdAt: Date;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export type CreateAudioBufferInput = {
|
|
17
|
-
callSid: string;
|
|
18
|
-
clientId: string;
|
|
19
|
-
bucketStartMs: number;
|
|
20
|
-
bucketDurationMs: number;
|
|
21
|
-
data: Buffer;
|
|
22
|
-
ttlMs?: number;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export type ClientAudioBufferDoc = WithId<ClientAudioBufferType>;
|
|
1
|
+
import { WithId } from "mongodb";
|
|
2
|
+
|
|
3
|
+
export type ClientAudioBufferType = {
|
|
4
|
+
callSid: string;
|
|
5
|
+
clientId: string;
|
|
6
|
+
bucketStartMs: number;
|
|
7
|
+
bucketDurationMs: number;
|
|
8
|
+
codec: "mulaw";
|
|
9
|
+
sampleRateHz: 8000;
|
|
10
|
+
channels: 1;
|
|
11
|
+
data: Buffer;
|
|
12
|
+
expiresAt: Date;
|
|
13
|
+
createdAt: Date;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type CreateAudioBufferInput = {
|
|
17
|
+
callSid: string;
|
|
18
|
+
clientId: string;
|
|
19
|
+
bucketStartMs: number;
|
|
20
|
+
bucketDurationMs: number;
|
|
21
|
+
data: Buffer;
|
|
22
|
+
ttlMs?: number;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export type ClientAudioBufferDoc = WithId<ClientAudioBufferType>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from "./clientAudioBuffer.getters";
|
|
2
|
-
export * from "./clientsAudioBuffers.types";
|
|
1
|
+
export * from "./clientAudioBuffer.getters";
|
|
2
|
+
export * from "./clientsAudioBuffers.types";
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { getClientsCollection, getAllClientCredits } from "../clients.getters";
|
|
2
|
+
import { createClient } from "../../../test-utils/factories";
|
|
3
|
+
|
|
4
|
+
describe("db.clients", () => {
|
|
5
|
+
describe("getAllClientCredits", () => {
|
|
6
|
+
it("should return a Map of clientId to credits across all clients", async () => {
|
|
7
|
+
await getClientsCollection().insertMany([
|
|
8
|
+
createClient({ clientId: "creditsClientA", credits: 100 }),
|
|
9
|
+
createClient({ clientId: "creditsClientB", credits: 250 }),
|
|
10
|
+
]);
|
|
11
|
+
|
|
12
|
+
const result = await getAllClientCredits();
|
|
13
|
+
|
|
14
|
+
expect(result).toBeInstanceOf(Map);
|
|
15
|
+
expect(result.get("creditsClientA")).toBe(100);
|
|
16
|
+
expect(result.get("creditsClientB")).toBe(250);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("should default missing credits to 0", async () => {
|
|
20
|
+
const client = createClient({ clientId: "noCreditsClient" });
|
|
21
|
+
delete (client as { credits?: number }).credits;
|
|
22
|
+
await getClientsCollection().insertOne(client);
|
|
23
|
+
|
|
24
|
+
const result = await getAllClientCredits();
|
|
25
|
+
expect(result.get("noCreditsClient")).toBe(0);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("should return an empty Map when there are no clients", async () => {
|
|
29
|
+
const result = await getAllClientCredits();
|
|
30
|
+
expect(result.size).toBe(0);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import {
|
|
2
|
+
clientExistsInAnyCollection,
|
|
3
|
+
deleteClientDataAcrossDomains,
|
|
4
|
+
} from "../clients.lifecycle";
|
|
5
|
+
import { getPhoneNumbersCollection } from "../../phone_numbers/phone_numbers.getter";
|
|
6
|
+
import {
|
|
7
|
+
createMuniIssue,
|
|
8
|
+
generateMuniIssueId,
|
|
9
|
+
getAuditLogsCollection,
|
|
10
|
+
getScansCollection,
|
|
11
|
+
} from "../../../index";
|
|
12
|
+
import {
|
|
13
|
+
createPhoneNumber,
|
|
14
|
+
createMuniIssueInput,
|
|
15
|
+
createScanFixture,
|
|
16
|
+
} from "../../../test-utils/factories";
|
|
17
|
+
|
|
18
|
+
describe("db.clients.lifecycle", () => {
|
|
19
|
+
describe("clientExistsInAnyCollection", () => {
|
|
20
|
+
it("should return true when the client exists only in phone_numbers (client_id field)", async () => {
|
|
21
|
+
const clientId = "existsPhoneOnly";
|
|
22
|
+
await getPhoneNumbersCollection().insertOne(
|
|
23
|
+
createPhoneNumber({ client_id: clientId }),
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
expect(await clientExistsInAnyCollection(clientId)).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("should return true when the client exists only in muniIssues (municipal DB)", async () => {
|
|
30
|
+
const clientId = "existsMuniOnly";
|
|
31
|
+
await createMuniIssue(
|
|
32
|
+
createMuniIssueInput({ clientId }),
|
|
33
|
+
generateMuniIssueId(),
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
expect(await clientExistsInAnyCollection(clientId)).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("should return false when the client does not exist anywhere", async () => {
|
|
40
|
+
expect(await clientExistsInAnyCollection("noSuchClientAtAll")).toBe(
|
|
41
|
+
false,
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("should not consider websitalk data (scans/websiteUrls) at all", async () => {
|
|
46
|
+
const clientId = "onlyInWebsitalk";
|
|
47
|
+
await getScansCollection().insertOne(createScanFixture({ clientId }));
|
|
48
|
+
|
|
49
|
+
expect(await clientExistsInAnyCollection(clientId)).toBe(false);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("should not be fooled by unrelated collections lacking a clientId/client_id field", async () => {
|
|
53
|
+
await global.db
|
|
54
|
+
.collection("someUnrelatedCollection")
|
|
55
|
+
.insertOne({ someField: "someValue" });
|
|
56
|
+
|
|
57
|
+
expect(await clientExistsInAnyCollection("noSuchClientAtAll")).toBe(
|
|
58
|
+
false,
|
|
59
|
+
);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe("deleteClientDataAcrossDomains", () => {
|
|
64
|
+
it("should return deleted:false with a reason and delete nothing when the client does not exist", async () => {
|
|
65
|
+
await getPhoneNumbersCollection().insertOne(
|
|
66
|
+
createPhoneNumber({ client_id: "unrelatedClient" }),
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
const summary = await deleteClientDataAcrossDomains(
|
|
70
|
+
"missingClient",
|
|
71
|
+
"admin@callai.co.il",
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
expect(summary.deleted).toBe(false);
|
|
75
|
+
if (!summary.deleted) {
|
|
76
|
+
expect(summary.reason).toBeTruthy();
|
|
77
|
+
}
|
|
78
|
+
expect(
|
|
79
|
+
await getPhoneNumbersCollection().findOne({
|
|
80
|
+
client_id: "unrelatedClient",
|
|
81
|
+
}),
|
|
82
|
+
).not.toBeNull();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("should not write an audit log entry when the client does not exist", async () => {
|
|
86
|
+
await deleteClientDataAcrossDomains(
|
|
87
|
+
"missingClientNoAudit",
|
|
88
|
+
"admin@callai.co.il",
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
expect(
|
|
92
|
+
await getAuditLogsCollection().findOne({
|
|
93
|
+
clientId: "missingClientNoAudit",
|
|
94
|
+
}),
|
|
95
|
+
).toBeNull();
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it("should delete the client's data across talkpilot and municipal domains", async () => {
|
|
99
|
+
const clientId = "deleteMeEverywhere";
|
|
100
|
+
await getPhoneNumbersCollection().insertOne(
|
|
101
|
+
createPhoneNumber({ client_id: clientId }),
|
|
102
|
+
);
|
|
103
|
+
await createMuniIssue(
|
|
104
|
+
createMuniIssueInput({ clientId }),
|
|
105
|
+
generateMuniIssueId(),
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
const adminEmail = "admin@callai.co.il";
|
|
109
|
+
const summary = await deleteClientDataAcrossDomains(
|
|
110
|
+
clientId,
|
|
111
|
+
adminEmail,
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
expect(summary.deleted).toBe(true);
|
|
115
|
+
if (summary.deleted) {
|
|
116
|
+
expect(summary.allSucceeded).toBe(true);
|
|
117
|
+
const byName = (name: string) =>
|
|
118
|
+
summary.results.find((r) => r.collectionName === name);
|
|
119
|
+
expect(byName("phone_numbers")?.deletedCount).toBe(1);
|
|
120
|
+
expect(byName("muniIssues")?.deletedCount).toBe(1);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
expect(await clientExistsInAnyCollection(clientId)).toBe(false);
|
|
124
|
+
|
|
125
|
+
// The audit entry itself must survive the client's own deletion.
|
|
126
|
+
const auditEntry = await getAuditLogsCollection().findOne({ clientId });
|
|
127
|
+
expect(auditEntry).toMatchObject({
|
|
128
|
+
clientId,
|
|
129
|
+
adminEmail,
|
|
130
|
+
action: "delete",
|
|
131
|
+
});
|
|
132
|
+
expect(auditEntry?.timestamp).toBeInstanceOf(Date);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it("should not touch websitalk data (scans/websiteUrls) — callers must call the external website-talk deletion API separately", async () => {
|
|
136
|
+
const clientId = "hasWebsitalkData";
|
|
137
|
+
await getPhoneNumbersCollection().insertOne(
|
|
138
|
+
createPhoneNumber({ client_id: clientId }),
|
|
139
|
+
);
|
|
140
|
+
await getScansCollection().insertOne(createScanFixture({ clientId }));
|
|
141
|
+
|
|
142
|
+
await deleteClientDataAcrossDomains(clientId, "admin@callai.co.il");
|
|
143
|
+
|
|
144
|
+
expect(
|
|
145
|
+
await getScansCollection().findOne({ clientId }),
|
|
146
|
+
).not.toBeNull();
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it("should not delete unrelated clients' data", async () => {
|
|
150
|
+
const targetClient = "deleteTarget";
|
|
151
|
+
const otherClient = "keepMeClient";
|
|
152
|
+
await getPhoneNumbersCollection().insertOne(
|
|
153
|
+
createPhoneNumber({ client_id: targetClient }),
|
|
154
|
+
);
|
|
155
|
+
await getPhoneNumbersCollection().insertOne(
|
|
156
|
+
createPhoneNumber({ client_id: otherClient }),
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
await deleteClientDataAcrossDomains(targetClient, "admin@callai.co.il");
|
|
160
|
+
|
|
161
|
+
expect(
|
|
162
|
+
await getPhoneNumbersCollection().findOne({ client_id: otherClient }),
|
|
163
|
+
).not.toBeNull();
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
});
|