@kelpie/server 0.8.0 → 0.9.0
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/dist/lib/ids.d.ts +11 -0
- package/dist/lib/ids.d.ts.map +1 -1
- package/dist/lib/ids.js +11 -0
- package/dist/lib/ids.js.map +1 -1
- package/dist/modules/activities/repository.d.ts.map +1 -1
- package/dist/modules/activities/repository.js +19 -20
- package/dist/modules/activities/repository.js.map +1 -1
- package/dist/modules/activities/wording.d.ts +12 -0
- package/dist/modules/activities/wording.d.ts.map +1 -1
- package/dist/modules/activities/wording.js +16 -0
- package/dist/modules/activities/wording.js.map +1 -1
- package/dist/modules/agent-tasks/catalog.d.ts.map +1 -1
- package/dist/modules/agent-tasks/catalog.js +62 -0
- package/dist/modules/agent-tasks/catalog.js.map +1 -1
- package/dist/modules/agent-tasks/resolve.d.ts.map +1 -1
- package/dist/modules/agent-tasks/resolve.js +42 -9
- package/dist/modules/agent-tasks/resolve.js.map +1 -1
- package/dist/modules/agent-tasks/routes.d.ts +2 -0
- package/dist/modules/agent-tasks/routes.d.ts.map +1 -1
- package/dist/modules/attachedRecords.d.ts +6 -1
- package/dist/modules/attachedRecords.d.ts.map +1 -1
- package/dist/modules/attachedRecords.js +15 -1
- package/dist/modules/attachedRecords.js.map +1 -1
- package/dist/modules/companies/index.d.ts.map +1 -1
- package/dist/modules/companies/index.js +3 -1
- package/dist/modules/companies/index.js.map +1 -1
- package/dist/modules/companies/routes.d.ts +14 -0
- package/dist/modules/companies/routes.d.ts.map +1 -1
- package/dist/modules/companies/routes.js +7 -0
- package/dist/modules/companies/routes.js.map +1 -1
- package/dist/modules/companies/schema.d.ts +20 -0
- package/dist/modules/companies/schema.d.ts.map +1 -1
- package/dist/modules/companies/schema.js +6 -1
- package/dist/modules/companies/schema.js.map +1 -1
- package/dist/modules/companies/service.d.ts +5 -0
- package/dist/modules/companies/service.d.ts.map +1 -1
- package/dist/modules/companies/service.js +24 -12
- package/dist/modules/companies/service.js.map +1 -1
- package/dist/modules/consent-purposes/capabilities.d.ts +7 -0
- package/dist/modules/consent-purposes/capabilities.d.ts.map +1 -0
- package/dist/modules/consent-purposes/capabilities.js +10 -0
- package/dist/modules/consent-purposes/capabilities.js.map +1 -0
- package/dist/modules/consent-purposes/events.d.ts +38 -0
- package/dist/modules/consent-purposes/events.d.ts.map +1 -0
- package/dist/modules/consent-purposes/events.js +17 -0
- package/dist/modules/consent-purposes/events.js.map +1 -0
- package/dist/modules/consent-purposes/index.d.ts +13 -0
- package/dist/modules/consent-purposes/index.d.ts.map +1 -0
- package/dist/modules/consent-purposes/index.js +41 -0
- package/dist/modules/consent-purposes/index.js.map +1 -0
- package/dist/modules/consent-purposes/repository.d.ts +21 -0
- package/dist/modules/consent-purposes/repository.d.ts.map +1 -0
- package/dist/modules/consent-purposes/repository.js +98 -0
- package/dist/modules/consent-purposes/repository.js.map +1 -0
- package/dist/modules/consent-purposes/routes.d.ts +39 -0
- package/dist/modules/consent-purposes/routes.d.ts.map +1 -0
- package/dist/modules/consent-purposes/routes.js +79 -0
- package/dist/modules/consent-purposes/routes.js.map +1 -0
- package/dist/modules/consent-purposes/schema.d.ts +175 -0
- package/dist/modules/consent-purposes/schema.d.ts.map +1 -0
- package/dist/modules/consent-purposes/schema.js +35 -0
- package/dist/modules/consent-purposes/schema.js.map +1 -0
- package/dist/modules/consent-purposes/service.d.ts +50 -0
- package/dist/modules/consent-purposes/service.d.ts.map +1 -0
- package/dist/modules/consent-purposes/service.js +263 -0
- package/dist/modules/consent-purposes/service.js.map +1 -0
- package/dist/modules/consent-purposes/starters.d.ts +17 -0
- package/dist/modules/consent-purposes/starters.d.ts.map +1 -0
- package/dist/modules/consent-purposes/starters.js +15 -0
- package/dist/modules/consent-purposes/starters.js.map +1 -0
- package/dist/modules/consent-purposes/tools.d.ts +4 -0
- package/dist/modules/consent-purposes/tools.d.ts.map +1 -0
- package/dist/modules/consent-purposes/tools.js +29 -0
- package/dist/modules/consent-purposes/tools.js.map +1 -0
- package/dist/modules/core.d.ts.map +1 -1
- package/dist/modules/core.js +10 -0
- package/dist/modules/core.js.map +1 -1
- package/dist/modules/custom-fields/capabilities.d.ts +12 -0
- package/dist/modules/custom-fields/capabilities.d.ts.map +1 -0
- package/dist/modules/custom-fields/capabilities.js +15 -0
- package/dist/modules/custom-fields/capabilities.js.map +1 -0
- package/dist/modules/custom-fields/events.d.ts +49 -0
- package/dist/modules/custom-fields/events.d.ts.map +1 -0
- package/dist/modules/custom-fields/events.js +25 -0
- package/dist/modules/custom-fields/events.js.map +1 -0
- package/dist/modules/custom-fields/index.d.ts +19 -0
- package/dist/modules/custom-fields/index.d.ts.map +1 -0
- package/dist/modules/custom-fields/index.js +46 -0
- package/dist/modules/custom-fields/index.js.map +1 -0
- package/dist/modules/custom-fields/repository.d.ts +37 -0
- package/dist/modules/custom-fields/repository.d.ts.map +1 -0
- package/dist/modules/custom-fields/repository.js +144 -0
- package/dist/modules/custom-fields/repository.js.map +1 -0
- package/dist/modules/custom-fields/routes.d.ts +44 -0
- package/dist/modules/custom-fields/routes.d.ts.map +1 -0
- package/dist/modules/custom-fields/routes.js +103 -0
- package/dist/modules/custom-fields/routes.js.map +1 -0
- package/dist/modules/custom-fields/schema.d.ts +215 -0
- package/dist/modules/custom-fields/schema.d.ts.map +1 -0
- package/dist/modules/custom-fields/schema.js +43 -0
- package/dist/modules/custom-fields/schema.js.map +1 -0
- package/dist/modules/custom-fields/service.d.ts +57 -0
- package/dist/modules/custom-fields/service.d.ts.map +1 -0
- package/dist/modules/custom-fields/service.js +273 -0
- package/dist/modules/custom-fields/service.js.map +1 -0
- package/dist/modules/custom-fields/tools.d.ts +4 -0
- package/dist/modules/custom-fields/tools.d.ts.map +1 -0
- package/dist/modules/custom-fields/tools.js +38 -0
- package/dist/modules/custom-fields/tools.js.map +1 -0
- package/dist/modules/custom-fields/values.d.ts +49 -0
- package/dist/modules/custom-fields/values.d.ts.map +1 -0
- package/dist/modules/custom-fields/values.js +249 -0
- package/dist/modules/custom-fields/values.js.map +1 -0
- package/dist/modules/custom-fields/wire.d.ts +12 -0
- package/dist/modules/custom-fields/wire.d.ts.map +1 -0
- package/dist/modules/custom-fields/wire.js +30 -0
- package/dist/modules/custom-fields/wire.js.map +1 -0
- package/dist/modules/dashboard/repository.d.ts.map +1 -1
- package/dist/modules/dashboard/repository.js +4 -3
- package/dist/modules/dashboard/repository.js.map +1 -1
- package/dist/modules/deals/index.d.ts +2 -1
- package/dist/modules/deals/index.d.ts.map +1 -1
- package/dist/modules/deals/index.js +5 -2
- package/dist/modules/deals/index.js.map +1 -1
- package/dist/modules/deals/repository.d.ts +0 -16
- package/dist/modules/deals/repository.d.ts.map +1 -1
- package/dist/modules/deals/repository.js +6 -76
- package/dist/modules/deals/repository.js.map +1 -1
- package/dist/modules/deals/routes.d.ts +14 -0
- package/dist/modules/deals/routes.d.ts.map +1 -1
- package/dist/modules/deals/routes.js +7 -0
- package/dist/modules/deals/routes.js.map +1 -1
- package/dist/modules/deals/schema.d.ts +20 -42
- package/dist/modules/deals/schema.d.ts.map +1 -1
- package/dist/modules/deals/schema.js +6 -11
- package/dist/modules/deals/schema.js.map +1 -1
- package/dist/modules/deals/service.d.ts +13 -2
- package/dist/modules/deals/service.d.ts.map +1 -1
- package/dist/modules/deals/service.js +43 -20
- package/dist/modules/deals/service.js.map +1 -1
- package/dist/modules/decisions/repository.d.ts.map +1 -1
- package/dist/modules/decisions/repository.js +2 -0
- package/dist/modules/decisions/repository.js.map +1 -1
- package/dist/modules/decisions/routes.d.ts +1 -0
- package/dist/modules/decisions/routes.d.ts.map +1 -1
- package/dist/modules/enquiries/events.d.ts +44 -0
- package/dist/modules/enquiries/events.d.ts.map +1 -0
- package/dist/modules/enquiries/events.js +19 -0
- package/dist/modules/enquiries/events.js.map +1 -0
- package/dist/modules/enquiries/index.d.ts +13 -0
- package/dist/modules/enquiries/index.d.ts.map +1 -0
- package/dist/modules/enquiries/index.js +44 -0
- package/dist/modules/enquiries/index.js.map +1 -0
- package/dist/modules/enquiries/repository.d.ts +30 -0
- package/dist/modules/enquiries/repository.d.ts.map +1 -0
- package/dist/modules/enquiries/repository.js +94 -0
- package/dist/modules/enquiries/repository.js.map +1 -0
- package/dist/modules/enquiries/routes.d.ts +52 -0
- package/dist/modules/enquiries/routes.d.ts.map +1 -0
- package/dist/modules/enquiries/routes.js +127 -0
- package/dist/modules/enquiries/routes.js.map +1 -0
- package/dist/modules/enquiries/schema.d.ts +290 -0
- package/dist/modules/enquiries/schema.d.ts.map +1 -0
- package/dist/modules/enquiries/schema.js +52 -0
- package/dist/modules/enquiries/schema.js.map +1 -0
- package/dist/modules/enquiries/service.d.ts +85 -0
- package/dist/modules/enquiries/service.d.ts.map +1 -0
- package/dist/modules/enquiries/service.js +370 -0
- package/dist/modules/enquiries/service.js.map +1 -0
- package/dist/modules/enquiries/tools.d.ts +4 -0
- package/dist/modules/enquiries/tools.d.ts.map +1 -0
- package/dist/modules/enquiries/tools.js +50 -0
- package/dist/modules/enquiries/tools.js.map +1 -0
- package/dist/modules/eventCatalogs.d.ts +3 -0
- package/dist/modules/eventCatalogs.d.ts.map +1 -1
- package/dist/modules/eventCatalogs.js +3 -0
- package/dist/modules/eventCatalogs.js.map +1 -1
- package/dist/modules/forms/embed.d.ts +20 -6
- package/dist/modules/forms/embed.d.ts.map +1 -1
- package/dist/modules/forms/embed.js +359 -43
- package/dist/modules/forms/embed.js.map +1 -1
- package/dist/modules/forms/events.d.ts +20 -7
- package/dist/modules/forms/events.d.ts.map +1 -1
- package/dist/modules/forms/events.js +20 -2
- package/dist/modules/forms/events.js.map +1 -1
- package/dist/modules/forms/fields.d.ts +14 -1
- package/dist/modules/forms/fields.d.ts.map +1 -1
- package/dist/modules/forms/fields.js +87 -3
- package/dist/modules/forms/fields.js.map +1 -1
- package/dist/modules/forms/index.d.ts.map +1 -1
- package/dist/modules/forms/index.js +12 -1
- package/dist/modules/forms/index.js.map +1 -1
- package/dist/modules/forms/mapping.d.ts +62 -5
- package/dist/modules/forms/mapping.d.ts.map +1 -1
- package/dist/modules/forms/mapping.js +139 -5
- package/dist/modules/forms/mapping.js.map +1 -1
- package/dist/modules/forms/publicRoutes.d.ts.map +1 -1
- package/dist/modules/forms/publicRoutes.js +29 -1
- package/dist/modules/forms/publicRoutes.js.map +1 -1
- package/dist/modules/forms/repository.d.ts +31 -0
- package/dist/modules/forms/repository.d.ts.map +1 -1
- package/dist/modules/forms/repository.js +90 -1
- package/dist/modules/forms/repository.js.map +1 -1
- package/dist/modules/forms/routes.d.ts +83 -1
- package/dist/modules/forms/routes.d.ts.map +1 -1
- package/dist/modules/forms/routes.js +185 -2
- package/dist/modules/forms/routes.js.map +1 -1
- package/dist/modules/forms/schema.d.ts +672 -1
- package/dist/modules/forms/schema.d.ts.map +1 -1
- package/dist/modules/forms/schema.js +146 -3
- package/dist/modules/forms/schema.js.map +1 -1
- package/dist/modules/forms/service.d.ts +54 -1
- package/dist/modules/forms/service.d.ts.map +1 -1
- package/dist/modules/forms/service.js +338 -28
- package/dist/modules/forms/service.js.map +1 -1
- package/dist/modules/forms/submission.d.ts +15 -0
- package/dist/modules/forms/submission.d.ts.map +1 -1
- package/dist/modules/forms/submission.js +418 -40
- package/dist/modules/forms/submission.js.map +1 -1
- package/dist/modules/import-export/drafts.d.ts +10 -0
- package/dist/modules/import-export/drafts.d.ts.map +1 -1
- package/dist/modules/import-export/drafts.js +16 -2
- package/dist/modules/import-export/drafts.js.map +1 -1
- package/dist/modules/import-export/exportRows.d.ts +7 -4
- package/dist/modules/import-export/exportRows.d.ts.map +1 -1
- package/dist/modules/import-export/exportRows.js +20 -5
- package/dist/modules/import-export/exportRows.js.map +1 -1
- package/dist/modules/import-export/plan.d.ts +12 -1
- package/dist/modules/import-export/plan.d.ts.map +1 -1
- package/dist/modules/import-export/plan.js +29 -2
- package/dist/modules/import-export/plan.js.map +1 -1
- package/dist/modules/import-export/presets.d.ts.map +1 -1
- package/dist/modules/import-export/presets.js +10 -0
- package/dist/modules/import-export/presets.js.map +1 -1
- package/dist/modules/import-export/repository.d.ts +11 -1
- package/dist/modules/import-export/repository.d.ts.map +1 -1
- package/dist/modules/import-export/repository.js +42 -9
- package/dist/modules/import-export/repository.js.map +1 -1
- package/dist/modules/import-export/routes.d.ts.map +1 -1
- package/dist/modules/import-export/routes.js +4 -0
- package/dist/modules/import-export/routes.js.map +1 -1
- package/dist/modules/import-export/schema.d.ts +17 -0
- package/dist/modules/import-export/schema.d.ts.map +1 -1
- package/dist/modules/import-export/schema.js +11 -0
- package/dist/modules/import-export/schema.js.map +1 -1
- package/dist/modules/import-export/service.d.ts +6 -0
- package/dist/modules/import-export/service.d.ts.map +1 -1
- package/dist/modules/import-export/service.js +14 -2
- package/dist/modules/import-export/service.js.map +1 -1
- package/dist/modules/import-export/streams.d.ts.map +1 -1
- package/dist/modules/import-export/streams.js +3 -3
- package/dist/modules/import-export/streams.js.map +1 -1
- package/dist/modules/import-export/tools.d.ts.map +1 -1
- package/dist/modules/import-export/tools.js +8 -0
- package/dist/modules/import-export/tools.js.map +1 -1
- package/dist/modules/import-export/validation.d.ts.map +1 -1
- package/dist/modules/import-export/validation.js +22 -1
- package/dist/modules/import-export/validation.js.map +1 -1
- package/dist/modules/import-export/writes.d.ts.map +1 -1
- package/dist/modules/import-export/writes.js +37 -4
- package/dist/modules/import-export/writes.js.map +1 -1
- package/dist/modules/lists/repository.d.ts +11 -0
- package/dist/modules/lists/repository.d.ts.map +1 -1
- package/dist/modules/lists/repository.js +13 -0
- package/dist/modules/lists/repository.js.map +1 -1
- package/dist/modules/lists/routes.d.ts +4 -0
- package/dist/modules/lists/routes.d.ts.map +1 -1
- package/dist/modules/lists/routes.js +8 -0
- package/dist/modules/lists/routes.js.map +1 -1
- package/dist/modules/lists/schema.d.ts +17 -0
- package/dist/modules/lists/schema.d.ts.map +1 -1
- package/dist/modules/lists/schema.js +10 -0
- package/dist/modules/lists/schema.js.map +1 -1
- package/dist/modules/lists/service.d.ts +14 -2
- package/dist/modules/lists/service.d.ts.map +1 -1
- package/dist/modules/lists/service.js +55 -7
- package/dist/modules/lists/service.js.map +1 -1
- package/dist/modules/mcp/index.d.ts.map +1 -1
- package/dist/modules/mcp/index.js +5 -0
- package/dist/modules/mcp/index.js.map +1 -1
- package/dist/modules/notes/routes.d.ts +1 -0
- package/dist/modules/notes/routes.d.ts.map +1 -1
- package/dist/modules/opportunities/index.d.ts.map +1 -1
- package/dist/modules/opportunities/index.js +3 -1
- package/dist/modules/opportunities/index.js.map +1 -1
- package/dist/modules/opportunities/repository.d.ts +2 -0
- package/dist/modules/opportunities/repository.d.ts.map +1 -1
- package/dist/modules/opportunities/repository.js +4 -0
- package/dist/modules/opportunities/repository.js.map +1 -1
- package/dist/modules/opportunities/routes.d.ts +16 -0
- package/dist/modules/opportunities/routes.d.ts.map +1 -1
- package/dist/modules/opportunities/routes.js +13 -0
- package/dist/modules/opportunities/routes.js.map +1 -1
- package/dist/modules/opportunities/schema.d.ts +20 -0
- package/dist/modules/opportunities/schema.d.ts.map +1 -1
- package/dist/modules/opportunities/schema.js +6 -1
- package/dist/modules/opportunities/schema.js.map +1 -1
- package/dist/modules/opportunities/service.d.ts +20 -3
- package/dist/modules/opportunities/service.d.ts.map +1 -1
- package/dist/modules/opportunities/service.js +99 -18
- package/dist/modules/opportunities/service.js.map +1 -1
- package/dist/modules/opportunities/tools.d.ts.map +1 -1
- package/dist/modules/opportunities/tools.js +2 -0
- package/dist/modules/opportunities/tools.js.map +1 -1
- package/dist/modules/partnerships/index.d.ts.map +1 -1
- package/dist/modules/partnerships/index.js +3 -1
- package/dist/modules/partnerships/index.js.map +1 -1
- package/dist/modules/partnerships/repository.d.ts +0 -17
- package/dist/modules/partnerships/repository.d.ts.map +1 -1
- package/dist/modules/partnerships/repository.js +6 -82
- package/dist/modules/partnerships/repository.js.map +1 -1
- package/dist/modules/partnerships/routes.d.ts +14 -0
- package/dist/modules/partnerships/routes.d.ts.map +1 -1
- package/dist/modules/partnerships/routes.js +7 -0
- package/dist/modules/partnerships/routes.js.map +1 -1
- package/dist/modules/partnerships/schema.d.ts +20 -41
- package/dist/modules/partnerships/schema.d.ts.map +1 -1
- package/dist/modules/partnerships/schema.js +6 -10
- package/dist/modules/partnerships/schema.js.map +1 -1
- package/dist/modules/partnerships/service.d.ts +11 -1
- package/dist/modules/partnerships/service.d.ts.map +1 -1
- package/dist/modules/partnerships/service.js +43 -20
- package/dist/modules/partnerships/service.js.map +1 -1
- package/dist/modules/people/consentHydration.d.ts +26 -0
- package/dist/modules/people/consentHydration.d.ts.map +1 -0
- package/dist/modules/people/consentHydration.js +100 -0
- package/dist/modules/people/consentHydration.js.map +1 -0
- package/dist/modules/people/index.d.ts.map +1 -1
- package/dist/modules/people/index.js +3 -1
- package/dist/modules/people/index.js.map +1 -1
- package/dist/modules/people/personConsentWrites.d.ts +40 -0
- package/dist/modules/people/personConsentWrites.d.ts.map +1 -0
- package/dist/modules/people/personConsentWrites.js +98 -0
- package/dist/modules/people/personConsentWrites.js.map +1 -0
- package/dist/modules/people/repository.d.ts.map +1 -1
- package/dist/modules/people/repository.js +5 -1
- package/dist/modules/people/repository.js.map +1 -1
- package/dist/modules/people/routes.d.ts +57 -4
- package/dist/modules/people/routes.d.ts.map +1 -1
- package/dist/modules/people/routes.js +104 -5
- package/dist/modules/people/routes.js.map +1 -1
- package/dist/modules/people/schema.d.ts +366 -1
- package/dist/modules/people/schema.d.ts.map +1 -1
- package/dist/modules/people/schema.js +92 -2
- package/dist/modules/people/schema.js.map +1 -1
- package/dist/modules/people/service.d.ts +30 -1
- package/dist/modules/people/service.d.ts.map +1 -1
- package/dist/modules/people/service.js +115 -38
- package/dist/modules/people/service.js.map +1 -1
- package/dist/modules/people/tools.d.ts.map +1 -1
- package/dist/modules/people/tools.js +4 -1
- package/dist/modules/people/tools.js.map +1 -1
- package/dist/modules/personLinks.d.ts +79 -0
- package/dist/modules/personLinks.d.ts.map +1 -0
- package/dist/modules/personLinks.js +155 -0
- package/dist/modules/personLinks.js.map +1 -0
- package/dist/modules/pipelines/routes.d.ts +1 -0
- package/dist/modules/pipelines/routes.d.ts.map +1 -1
- package/dist/modules/plans/routes.d.ts +1 -0
- package/dist/modules/plans/routes.d.ts.map +1 -1
- package/dist/modules/raises/index.d.ts.map +1 -1
- package/dist/modules/raises/index.js +3 -1
- package/dist/modules/raises/index.js.map +1 -1
- package/dist/modules/raises/repository.d.ts +0 -17
- package/dist/modules/raises/repository.d.ts.map +1 -1
- package/dist/modules/raises/repository.js +6 -77
- package/dist/modules/raises/repository.js.map +1 -1
- package/dist/modules/raises/routes.d.ts +14 -0
- package/dist/modules/raises/routes.d.ts.map +1 -1
- package/dist/modules/raises/routes.js +7 -0
- package/dist/modules/raises/routes.js.map +1 -1
- package/dist/modules/raises/schema.d.ts +20 -41
- package/dist/modules/raises/schema.d.ts.map +1 -1
- package/dist/modules/raises/schema.js +6 -10
- package/dist/modules/raises/schema.js.map +1 -1
- package/dist/modules/raises/service.d.ts +11 -1
- package/dist/modules/raises/service.d.ts.map +1 -1
- package/dist/modules/raises/service.js +41 -18
- package/dist/modules/raises/service.js.map +1 -1
- package/dist/modules/recordTargets.d.ts.map +1 -1
- package/dist/modules/recordTargets.js +2 -0
- package/dist/modules/recordTargets.js.map +1 -1
- package/dist/modules/references.d.ts +10 -0
- package/dist/modules/references.d.ts.map +1 -1
- package/dist/modules/references.js +27 -4
- package/dist/modules/references.js.map +1 -1
- package/dist/modules/sample-data/fixture.d.ts +21 -0
- package/dist/modules/sample-data/fixture.d.ts.map +1 -1
- package/dist/modules/sample-data/fixture.js +40 -0
- package/dist/modules/sample-data/fixture.js.map +1 -1
- package/dist/modules/sample-data/index.d.ts.map +1 -1
- package/dist/modules/sample-data/index.js +1 -0
- package/dist/modules/sample-data/index.js.map +1 -1
- package/dist/modules/sample-data/routes.d.ts.map +1 -1
- package/dist/modules/sample-data/routes.js +1 -0
- package/dist/modules/sample-data/routes.js.map +1 -1
- package/dist/modules/sample-data/service.d.ts +1 -0
- package/dist/modules/sample-data/service.d.ts.map +1 -1
- package/dist/modules/sample-data/service.js +77 -8
- package/dist/modules/sample-data/service.js.map +1 -1
- package/dist/modules/search/index.d.ts +1 -1
- package/dist/modules/search/index.d.ts.map +1 -1
- package/dist/modules/search/index.js +2 -1
- package/dist/modules/search/index.js.map +1 -1
- package/dist/modules/search/repository.d.ts +1 -0
- package/dist/modules/search/repository.d.ts.map +1 -1
- package/dist/modules/search/repository.js +23 -0
- package/dist/modules/search/repository.js.map +1 -1
- package/dist/modules/search/service.d.ts +3 -3
- package/dist/modules/search/service.d.ts.map +1 -1
- package/dist/modules/search/service.js +5 -4
- package/dist/modules/search/service.js.map +1 -1
- package/dist/modules/stagedRecords.d.ts +3 -3
- package/dist/modules/stagedRecords.d.ts.map +1 -1
- package/dist/modules/stagedRecords.js +9 -0
- package/dist/modules/stagedRecords.js.map +1 -1
- package/dist/modules/webhooks/payloads.d.ts.map +1 -1
- package/dist/modules/webhooks/payloads.js +15 -2
- package/dist/modules/webhooks/payloads.js.map +1 -1
- package/dist/modules/workspace/repository.d.ts +2 -0
- package/dist/modules/workspace/repository.d.ts.map +1 -1
- package/dist/modules/workspace/repository.js +7 -0
- package/dist/modules/workspace/repository.js.map +1 -1
- package/dist/modules/workspace/service.d.ts.map +1 -1
- package/dist/modules/workspace/service.js +10 -0
- package/dist/modules/workspace/service.js.map +1 -1
- package/dist/modules/workspace/starters.d.ts.map +1 -1
- package/dist/modules/workspace/starters.js +5 -0
- package/dist/modules/workspace/starters.js.map +1 -1
- package/dist/runtime/events.d.ts +1 -1
- package/dist/runtime/events.d.ts.map +1 -1
- package/dist/runtime/events.js +1 -0
- package/dist/runtime/events.js.map +1 -1
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/testing/database.d.ts +5 -1
- package/dist/testing/database.d.ts.map +1 -1
- package/dist/testing/database.js +81 -10
- package/dist/testing/database.js.map +1 -1
- package/migrations/0024_third_king_cobra.sql +46 -0
- package/migrations/0025_worthless_chimera.sql +3 -0
- package/migrations/0026_late_aqueduct.sql +46 -0
- package/migrations/0027_brainy_silver_sable.sql +3 -0
- package/migrations/0028_freezing_scrambler.sql +19 -0
- package/migrations/0029_custom_fields.sql +26 -0
- package/migrations/0030_enquiries.sql +79 -0
- package/migrations/0031_consent.sql +45 -0
- package/migrations/0032_form_field_statement.sql +1 -0
- package/migrations/0033_form_field_consent_purpose_ids.sql +5 -0
- package/migrations/0034_drop_form_field_consent_purpose_id.sql +1 -0
- package/migrations/0035_form_field_consent_purpose_labels.sql +1 -0
- package/migrations/0036_form_field_notice_type.sql +2 -0
- package/migrations/meta/0024_snapshot.json +5516 -0
- package/migrations/meta/0025_snapshot.json +5336 -0
- package/migrations/meta/0026_snapshot.json +5710 -0
- package/migrations/meta/0027_snapshot.json +5716 -0
- package/migrations/meta/0028_snapshot.json +5740 -0
- package/migrations/meta/0029_snapshot.json +5935 -0
- package/migrations/meta/0030_snapshot.json +6245 -0
- package/migrations/meta/0031_snapshot.json +6572 -0
- package/migrations/meta/0032_snapshot.json +6578 -0
- package/migrations/meta/0033_snapshot.json +6572 -0
- package/migrations/meta/0034_snapshot.json +6566 -0
- package/migrations/meta/0035_snapshot.json +6573 -0
- package/migrations/meta/0036_snapshot.json +6573 -0
- package/migrations/meta/_journal.json +91 -0
- package/package.json +2 -2
- package/src/lib/ids.ts +11 -0
- package/src/modules/activities/repository.ts +22 -23
- package/src/modules/activities/wording.ts +18 -0
- package/src/modules/agent-tasks/catalog.ts +63 -0
- package/src/modules/agent-tasks/resolve.ts +64 -24
- package/src/modules/attachedRecords.ts +29 -2
- package/src/modules/companies/index.ts +3 -1
- package/src/modules/companies/routes.ts +7 -0
- package/src/modules/companies/schema.ts +7 -1
- package/src/modules/companies/service.ts +48 -13
- package/src/modules/consent-purposes/capabilities.ts +12 -0
- package/src/modules/consent-purposes/events.ts +38 -0
- package/src/modules/consent-purposes/index.ts +48 -0
- package/src/modules/consent-purposes/repository.ts +163 -0
- package/src/modules/consent-purposes/routes.ts +122 -0
- package/src/modules/consent-purposes/schema.ts +46 -0
- package/src/modules/consent-purposes/service.ts +423 -0
- package/src/modules/consent-purposes/starters.ts +32 -0
- package/src/modules/consent-purposes/tools.ts +44 -0
- package/src/modules/core.ts +10 -0
- package/src/modules/custom-fields/capabilities.ts +17 -0
- package/src/modules/custom-fields/events.ts +51 -0
- package/src/modules/custom-fields/index.ts +61 -0
- package/src/modules/custom-fields/repository.ts +225 -0
- package/src/modules/custom-fields/routes.ts +155 -0
- package/src/modules/custom-fields/schema.ts +61 -0
- package/src/modules/custom-fields/service.ts +439 -0
- package/src/modules/custom-fields/tools.ts +53 -0
- package/src/modules/custom-fields/values.ts +352 -0
- package/src/modules/custom-fields/wire.ts +32 -0
- package/src/modules/dashboard/repository.ts +4 -3
- package/src/modules/deals/index.ts +5 -2
- package/src/modules/deals/repository.ts +6 -106
- package/src/modules/deals/routes.ts +7 -0
- package/src/modules/deals/schema.ts +7 -15
- package/src/modules/deals/service.ts +92 -23
- package/src/modules/decisions/repository.ts +2 -0
- package/src/modules/enquiries/events.ts +45 -0
- package/src/modules/enquiries/index.ts +50 -0
- package/src/modules/enquiries/repository.ts +164 -0
- package/src/modules/enquiries/routes.ts +172 -0
- package/src/modules/enquiries/schema.ts +59 -0
- package/src/modules/enquiries/service.ts +644 -0
- package/src/modules/enquiries/tools.ts +66 -0
- package/src/modules/eventCatalogs.ts +3 -0
- package/src/modules/forms/embed.ts +391 -44
- package/src/modules/forms/events.ts +30 -2
- package/src/modules/forms/fields.ts +102 -2
- package/src/modules/forms/index.ts +12 -1
- package/src/modules/forms/mapping.ts +183 -6
- package/src/modules/forms/publicRoutes.ts +43 -1
- package/src/modules/forms/repository.ts +162 -1
- package/src/modules/forms/routes.ts +212 -2
- package/src/modules/forms/schema.ts +166 -4
- package/src/modules/forms/service.ts +565 -41
- package/src/modules/forms/submission.ts +718 -44
- package/src/modules/import-export/drafts.ts +20 -1
- package/src/modules/import-export/exportRows.ts +21 -5
- package/src/modules/import-export/plan.ts +47 -2
- package/src/modules/import-export/presets.ts +10 -0
- package/src/modules/import-export/repository.ts +73 -8
- package/src/modules/import-export/routes.ts +4 -0
- package/src/modules/import-export/schema.ts +11 -0
- package/src/modules/import-export/service.ts +28 -2
- package/src/modules/import-export/streams.ts +3 -1
- package/src/modules/import-export/tools.ts +10 -0
- package/src/modules/import-export/validation.ts +28 -0
- package/src/modules/import-export/writes.ts +70 -5
- package/src/modules/lists/repository.ts +30 -0
- package/src/modules/lists/routes.ts +8 -0
- package/src/modules/lists/schema.ts +10 -0
- package/src/modules/lists/service.ts +110 -9
- package/src/modules/mcp/index.ts +5 -0
- package/src/modules/opportunities/index.ts +3 -1
- package/src/modules/opportunities/repository.ts +11 -0
- package/src/modules/opportunities/routes.ts +13 -0
- package/src/modules/opportunities/schema.ts +7 -1
- package/src/modules/opportunities/service.ts +188 -22
- package/src/modules/opportunities/tools.ts +2 -0
- package/src/modules/partnerships/index.ts +3 -1
- package/src/modules/partnerships/repository.ts +6 -117
- package/src/modules/partnerships/routes.ts +7 -0
- package/src/modules/partnerships/schema.ts +7 -14
- package/src/modules/partnerships/service.ts +93 -22
- package/src/modules/people/consentHydration.ts +167 -0
- package/src/modules/people/index.ts +3 -1
- package/src/modules/people/personConsentWrites.ts +177 -0
- package/src/modules/people/repository.ts +5 -0
- package/src/modules/people/routes.ts +127 -18
- package/src/modules/people/schema.ts +109 -3
- package/src/modules/people/service.ts +186 -40
- package/src/modules/people/tools.ts +5 -1
- package/src/modules/personLinks.ts +278 -0
- package/src/modules/raises/index.ts +3 -1
- package/src/modules/raises/repository.ts +6 -107
- package/src/modules/raises/routes.ts +7 -0
- package/src/modules/raises/schema.ts +7 -14
- package/src/modules/raises/service.ts +91 -20
- package/src/modules/recordTargets.ts +2 -0
- package/src/modules/references.ts +43 -4
- package/src/modules/sample-data/fixture.ts +63 -0
- package/src/modules/sample-data/index.ts +1 -0
- package/src/modules/sample-data/routes.ts +1 -0
- package/src/modules/sample-data/service.ts +97 -8
- package/src/modules/search/index.ts +2 -1
- package/src/modules/search/repository.ts +33 -1
- package/src/modules/search/service.ts +7 -5
- package/src/modules/stagedRecords.ts +18 -3
- package/src/modules/webhooks/payloads.ts +20 -2
- package/src/modules/workspace/repository.ts +12 -0
- package/src/modules/workspace/service.ts +14 -0
- package/src/modules/workspace/starters.ts +5 -0
- package/src/runtime/events.ts +1 -0
- package/src/schema/index.ts +3 -0
- package/src/testing/database.ts +97 -11
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { CustomFieldWireValue } from '@kelpie/schemas'
|
|
2
|
+
|
|
1
3
|
import { changedKeys } from '../../lib/changes.ts'
|
|
2
4
|
import type { Database } from '../../lib/database.ts'
|
|
3
5
|
import { AppError } from '../../lib/errors.ts'
|
|
@@ -20,6 +22,8 @@ import { actorMemberId, requireWorkspaceId } from '../auth/actor.ts'
|
|
|
20
22
|
import './events.ts'
|
|
21
23
|
import { deleteRecordsAttachedTo } from '../attachedRecords.ts'
|
|
22
24
|
import * as companyRepository from '../companies/repository.ts'
|
|
25
|
+
import type { CustomFieldValuesValidator } from '../custom-fields/values.ts'
|
|
26
|
+
import * as personLinks from '../personLinks.ts'
|
|
23
27
|
import * as pipelineRepository from '../pipelines/repository.ts'
|
|
24
28
|
import type { PipelineStageRecord } from '../pipelines/repository.ts'
|
|
25
29
|
import * as repository from './repository.ts'
|
|
@@ -29,8 +33,8 @@ import type { DealFilters, DealRecord } from './repository.ts'
|
|
|
29
33
|
/**
|
|
30
34
|
* Deals: the sales pipeline, and the first of the four staged objects.
|
|
31
35
|
*
|
|
32
|
-
* People attach through `
|
|
33
|
-
* the
|
|
36
|
+
* People attach through `person_links` and appear as `person_ids` on the wire;
|
|
37
|
+
* the polymorphic link table is a storage detail. A stage move is an ordinary PATCH of
|
|
34
38
|
* `stage_id`, and it is the one change that files a `stage_changed` activity and
|
|
35
39
|
* a `stage.changed` event instead of the generic update pair.
|
|
36
40
|
*/
|
|
@@ -41,6 +45,7 @@ export interface DealsDependencies {
|
|
|
41
45
|
readonly createId: IdFactory
|
|
42
46
|
readonly now: () => Date
|
|
43
47
|
readonly recordActivity: ActivityRecorder
|
|
48
|
+
readonly customFields: CustomFieldValuesValidator
|
|
44
49
|
}
|
|
45
50
|
|
|
46
51
|
/** What a changed column is called on a timeline. `whyWin` is why these are written out. */
|
|
@@ -79,6 +84,8 @@ export interface CreateDealInput {
|
|
|
79
84
|
readonly summary: string
|
|
80
85
|
readonly tags: readonly string[]
|
|
81
86
|
readonly externalId: string | null
|
|
87
|
+
/** Wire shape for a create body: `null` values are ignored, non-null are validated. */
|
|
88
|
+
readonly customFields: Readonly<Record<string, CustomFieldWireValue | null>> | undefined
|
|
82
89
|
}
|
|
83
90
|
|
|
84
91
|
/** PATCH semantics: an absent field is left alone, and null clears a nullable one. */
|
|
@@ -98,6 +105,12 @@ export interface UpdateDealInput {
|
|
|
98
105
|
readonly summary?: string | undefined
|
|
99
106
|
readonly tags?: readonly string[] | undefined
|
|
100
107
|
readonly externalId?: string | null | undefined
|
|
108
|
+
/**
|
|
109
|
+
* Partial merge patch (wire shape): sent keys change, `null` clears a key,
|
|
110
|
+
* absent keys are left alone. The whole object is undefined when the caller
|
|
111
|
+
* sent nothing at all. Unknown keys are `422`.
|
|
112
|
+
*/
|
|
113
|
+
readonly customFields?: Readonly<Record<string, CustomFieldWireValue | null>> | undefined
|
|
101
114
|
}
|
|
102
115
|
|
|
103
116
|
export interface DealsService {
|
|
@@ -201,7 +214,7 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
|
|
|
201
214
|
workspaceId: string,
|
|
202
215
|
personIds: readonly string[],
|
|
203
216
|
): Promise<ReadonlyMap<string, string>> {
|
|
204
|
-
const named = await
|
|
217
|
+
const named = await personLinks.findPeopleNamed(dependencies.db, workspaceId, personIds)
|
|
205
218
|
const missing = personIds.filter((id) => !named.has(id))
|
|
206
219
|
|
|
207
220
|
if (missing.length > 0) {
|
|
@@ -216,9 +229,11 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
|
|
|
216
229
|
}
|
|
217
230
|
|
|
218
231
|
/** @returns The page's views, with every deal's people fetched in one query. */
|
|
219
|
-
async function toViews(records: readonly DealRecord[]): Promise<DealView[]> {
|
|
220
|
-
const peopleByDeal = await
|
|
232
|
+
async function toViews(workspaceId: string, records: readonly DealRecord[]): Promise<DealView[]> {
|
|
233
|
+
const peopleByDeal = await personLinks.listPersonIdsFor(
|
|
221
234
|
dependencies.db,
|
|
235
|
+
workspaceId,
|
|
236
|
+
'deal',
|
|
222
237
|
records.map((record) => record.id),
|
|
223
238
|
)
|
|
224
239
|
|
|
@@ -232,14 +247,20 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
|
|
|
232
247
|
const rows = await repository.listDeals(dependencies.db, workspaceId, filters, window)
|
|
233
248
|
const page = toPage(rows, window, (deal) => deal.id)
|
|
234
249
|
|
|
235
|
-
return { items: await toViews(page.items), nextCursor: page.nextCursor }
|
|
250
|
+
return { items: await toViews(workspaceId, page.items), nextCursor: page.nextCursor }
|
|
236
251
|
},
|
|
237
252
|
|
|
238
253
|
async get(actor, id) {
|
|
239
254
|
const workspaceId = requireWorkspaceId(actor)
|
|
240
255
|
const deal = await require(workspaceId, id)
|
|
241
256
|
|
|
242
|
-
return toView(
|
|
257
|
+
return toView(
|
|
258
|
+
deal,
|
|
259
|
+
await personLinks.listPersonIds(dependencies.db, workspaceId, {
|
|
260
|
+
targetType: 'deal',
|
|
261
|
+
targetId: id,
|
|
262
|
+
}),
|
|
263
|
+
)
|
|
243
264
|
},
|
|
244
265
|
|
|
245
266
|
async create(actor, input) {
|
|
@@ -262,6 +283,12 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
|
|
|
262
283
|
const id = dependencies.createId('deal')
|
|
263
284
|
|
|
264
285
|
return dependencies.transaction(async ({ tx, events }) => {
|
|
286
|
+
const customFields = await dependencies.customFields.forCreate(
|
|
287
|
+
tx,
|
|
288
|
+
workspaceId,
|
|
289
|
+
'deal',
|
|
290
|
+
input.customFields,
|
|
291
|
+
)
|
|
265
292
|
const created = await repository.insertDeal(tx, {
|
|
266
293
|
id,
|
|
267
294
|
workspaceId,
|
|
@@ -278,9 +305,16 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
|
|
|
278
305
|
summary: input.summary,
|
|
279
306
|
tags: [...input.tags],
|
|
280
307
|
externalId: input.externalId,
|
|
308
|
+
customFields,
|
|
281
309
|
})
|
|
282
310
|
|
|
283
|
-
await
|
|
311
|
+
await personLinks.linkPeople(
|
|
312
|
+
tx,
|
|
313
|
+
dependencies.createId,
|
|
314
|
+
workspaceId,
|
|
315
|
+
{ targetType: 'deal', targetId: id },
|
|
316
|
+
personIds,
|
|
317
|
+
)
|
|
284
318
|
|
|
285
319
|
await dependencies.recordActivity(tx, workspaceId, actor, {
|
|
286
320
|
targetType: 'deal',
|
|
@@ -325,7 +359,10 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
|
|
|
325
359
|
await requireOwner(workspaceId, changes.ownerId)
|
|
326
360
|
}
|
|
327
361
|
|
|
328
|
-
const currentPeople = await
|
|
362
|
+
const currentPeople = await personLinks.listPersonIds(dependencies.db, workspaceId, {
|
|
363
|
+
targetType: 'deal',
|
|
364
|
+
targetId: id,
|
|
365
|
+
})
|
|
329
366
|
const nextPeople = changes.personIds === undefined ? undefined : [...new Set(changes.personIds)]
|
|
330
367
|
const added =
|
|
331
368
|
nextPeople === undefined ? [] : nextPeople.filter((personId) => !currentPeople.includes(personId))
|
|
@@ -334,16 +371,26 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
|
|
|
334
371
|
const named = await requirePeople(workspaceId, [...added, ...removed])
|
|
335
372
|
|
|
336
373
|
const columns = toStoredColumns(changes)
|
|
337
|
-
const
|
|
374
|
+
const scalarChanged = changedKeys(existing, columns)
|
|
338
375
|
const linksChanged = added.length > 0 || removed.length > 0
|
|
339
376
|
|
|
340
|
-
if (changed.length === 0 && !linksChanged) {
|
|
341
|
-
return toView(existing, currentPeople)
|
|
342
|
-
}
|
|
343
|
-
|
|
344
377
|
return dependencies.transaction(async ({ tx, events }) => {
|
|
378
|
+
const cf = await dependencies.customFields.forUpdate(
|
|
379
|
+
tx,
|
|
380
|
+
workspaceId,
|
|
381
|
+
'deal',
|
|
382
|
+
existing.customFields,
|
|
383
|
+
changes.customFields,
|
|
384
|
+
)
|
|
385
|
+
const customFieldsChanged = cf !== undefined && cf.changedPaths.length > 0
|
|
386
|
+
|
|
387
|
+
if (scalarChanged.length === 0 && !linksChanged && !customFieldsChanged) {
|
|
388
|
+
return toView(existing, currentPeople)
|
|
389
|
+
}
|
|
390
|
+
|
|
345
391
|
const updated = await repository.updateDeal(tx, workspaceId, id, {
|
|
346
392
|
...columns,
|
|
393
|
+
...(customFieldsChanged ? { customFields: cf.merged } : {}),
|
|
347
394
|
updatedAt: dependencies.now(),
|
|
348
395
|
})
|
|
349
396
|
|
|
@@ -351,8 +398,19 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
|
|
|
351
398
|
throw AppError.notFound('Deal not found')
|
|
352
399
|
}
|
|
353
400
|
|
|
354
|
-
await
|
|
355
|
-
|
|
401
|
+
await personLinks.linkPeople(
|
|
402
|
+
tx,
|
|
403
|
+
dependencies.createId,
|
|
404
|
+
workspaceId,
|
|
405
|
+
{ targetType: 'deal', targetId: id },
|
|
406
|
+
added,
|
|
407
|
+
)
|
|
408
|
+
await personLinks.unlinkPeople(
|
|
409
|
+
tx,
|
|
410
|
+
workspaceId,
|
|
411
|
+
{ targetType: 'deal', targetId: id },
|
|
412
|
+
removed,
|
|
413
|
+
)
|
|
356
414
|
|
|
357
415
|
if (stageMove !== undefined) {
|
|
358
416
|
await dependencies.recordActivity(tx, workspaceId, actor, {
|
|
@@ -363,14 +421,19 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
|
|
|
363
421
|
})
|
|
364
422
|
}
|
|
365
423
|
|
|
366
|
-
const otherChanged =
|
|
424
|
+
const otherChanged = scalarChanged.filter((field) => field !== 'stageId')
|
|
425
|
+
const customFieldPaths = cf?.changedPaths ?? []
|
|
426
|
+
const activityChanged = [...otherChanged, ...customFieldPaths]
|
|
367
427
|
|
|
368
|
-
if (
|
|
428
|
+
if (activityChanged.length > 0) {
|
|
429
|
+
const labels: Record<string, string> = { ...DEAL_FIELD_LABELS, ...cf?.labels }
|
|
430
|
+
const before: Record<string, unknown> = { ...existing, ...cf?.flatBefore }
|
|
431
|
+
const after: Record<string, unknown> = { ...columns, ...cf?.flatAfter }
|
|
369
432
|
await dependencies.recordActivity(tx, workspaceId, actor, {
|
|
370
433
|
targetType: 'deal',
|
|
371
434
|
targetId: id,
|
|
372
435
|
kind: 'updated',
|
|
373
|
-
...describeUpdate(
|
|
436
|
+
...describeUpdate(activityChanged, labels, before, after),
|
|
374
437
|
})
|
|
375
438
|
}
|
|
376
439
|
|
|
@@ -398,7 +461,13 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
|
|
|
398
461
|
events.emit(
|
|
399
462
|
'deals.deal.updated',
|
|
400
463
|
{ type: 'deal', id },
|
|
401
|
-
{
|
|
464
|
+
{
|
|
465
|
+
changed: [
|
|
466
|
+
...scalarChanged,
|
|
467
|
+
...(linksChanged ? ['personIds'] : []),
|
|
468
|
+
...customFieldPaths,
|
|
469
|
+
],
|
|
470
|
+
},
|
|
402
471
|
)
|
|
403
472
|
|
|
404
473
|
if (stageMove !== undefined) {
|
|
@@ -419,9 +488,9 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
|
|
|
419
488
|
await dependencies.transaction(async ({ tx, events }) => {
|
|
420
489
|
await require(workspaceId, id)
|
|
421
490
|
|
|
422
|
-
//
|
|
423
|
-
//
|
|
424
|
-
//
|
|
491
|
+
// Form submissions unlink themselves through `set null`; notes,
|
|
492
|
+
// activities, decisions, plan items, and person_links have no key back
|
|
493
|
+
// to the deal, so they are removed here, in the same transaction.
|
|
425
494
|
await deleteRecordsAttachedTo(tx, workspaceId, 'deal', id)
|
|
426
495
|
await repository.deleteDeal(tx, workspaceId, id)
|
|
427
496
|
|
|
@@ -7,6 +7,7 @@ import { containsPattern } from '../../lib/search.ts'
|
|
|
7
7
|
import type { Queryable } from '../../runtime/transaction.ts'
|
|
8
8
|
import { companies } from '../companies/schema.ts'
|
|
9
9
|
import { deals } from '../deals/schema.ts'
|
|
10
|
+
import { enquiries } from '../enquiries/schema.ts'
|
|
10
11
|
import { opportunities } from '../opportunities/schema.ts'
|
|
11
12
|
import { partnerships } from '../partnerships/schema.ts'
|
|
12
13
|
import { people } from '../people/schema.ts'
|
|
@@ -55,6 +56,7 @@ const NAMED_TARGET_TABLES = [
|
|
|
55
56
|
{ table: opportunities, id: opportunities.id, workspaceId: opportunities.workspaceId, name: opportunities.name },
|
|
56
57
|
{ table: partnerships, id: partnerships.id, workspaceId: partnerships.workspaceId, name: partnerships.name },
|
|
57
58
|
{ table: raises, id: raises.id, workspaceId: raises.workspaceId, name: raises.name },
|
|
59
|
+
{ table: enquiries, id: enquiries.id, workspaceId: enquiries.workspaceId, name: enquiries.name },
|
|
58
60
|
]
|
|
59
61
|
|
|
60
62
|
/**
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
|
|
3
|
+
import type { ModuleEventCatalog } from '../../runtime/module.ts'
|
|
4
|
+
|
|
5
|
+
/** Domain events published by the enquiries module. */
|
|
6
|
+
|
|
7
|
+
export const enquiriesEvents = {
|
|
8
|
+
'enquiries.enquiry.created': z.object({}).strict(),
|
|
9
|
+
'enquiries.enquiry.updated': z.object({ changed: z.array(z.string()).readonly() }),
|
|
10
|
+
'enquiries.enquiry.deleted': z.object({}).strict(),
|
|
11
|
+
'enquiries.enquiry.stage_changed': z.object({
|
|
12
|
+
fromStageId: z.string().nullable(),
|
|
13
|
+
toStageId: z.string(),
|
|
14
|
+
}),
|
|
15
|
+
/**
|
|
16
|
+
* The enquiry has been converted to a Deal. Fires from
|
|
17
|
+
* `POST /v1/enquiries/:id/convert`. Not deliverable as a webhook: consumers
|
|
18
|
+
* outside Kelpie subscribe to `record.created` on the deal instead. Kept for
|
|
19
|
+
* internal listeners that want the semantic signal.
|
|
20
|
+
*/
|
|
21
|
+
'enquiries.enquiry.converted': z.object({ dealId: z.string() }),
|
|
22
|
+
} satisfies ModuleEventCatalog
|
|
23
|
+
|
|
24
|
+
export type EnquiryCreatedData = Record<string, never>
|
|
25
|
+
export interface EnquiryUpdatedData {
|
|
26
|
+
readonly changed: readonly string[]
|
|
27
|
+
}
|
|
28
|
+
export type EnquiryDeletedData = Record<string, never>
|
|
29
|
+
export interface EnquiryStageChangedData {
|
|
30
|
+
readonly fromStageId: string | null
|
|
31
|
+
readonly toStageId: string
|
|
32
|
+
}
|
|
33
|
+
export interface EnquiryConvertedData {
|
|
34
|
+
readonly dealId: string
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
declare module '../../runtime/events.ts' {
|
|
38
|
+
interface KelpieEventMap {
|
|
39
|
+
'enquiries.enquiry.created': EnquiryCreatedData
|
|
40
|
+
'enquiries.enquiry.updated': EnquiryUpdatedData
|
|
41
|
+
'enquiries.enquiry.deleted': EnquiryDeletedData
|
|
42
|
+
'enquiries.enquiry.stage_changed': EnquiryStageChangedData
|
|
43
|
+
'enquiries.enquiry.converted': EnquiryConvertedData
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { KelpieModule } from '../../runtime/module.ts'
|
|
2
|
+
import { createActivityRecorder } from '../activities/index.ts'
|
|
3
|
+
import { createCustomFieldValues } from '../custom-fields/index.ts'
|
|
4
|
+
import { enquiriesEvents } from './events.ts'
|
|
5
|
+
import { mountEnquiriesRoutes } from './routes.ts'
|
|
6
|
+
import * as schema from './schema.ts'
|
|
7
|
+
import { createEnquiriesService } from './service.ts'
|
|
8
|
+
import { registerEnquiriesTools } from './tools.ts'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Enquiries: the top-of-funnel pipeline.
|
|
12
|
+
*
|
|
13
|
+
* Requires its relations because creating one checks that the company, stage,
|
|
14
|
+
* and owner are all in the caller's workspace before linking them, and
|
|
15
|
+
* `activities` because every write leaves its timeline entry in the same
|
|
16
|
+
* transaction. `deals` is required for `convertToDeal`, which inserts into
|
|
17
|
+
* the deals table directly (the standard cross-module write pattern, per
|
|
18
|
+
* `architecture.md`).
|
|
19
|
+
*/
|
|
20
|
+
export function createEnquiriesModule(migrationsDirectory: string): KelpieModule {
|
|
21
|
+
return {
|
|
22
|
+
id: 'enquiries',
|
|
23
|
+
requires: ['companies', 'pipelines', 'activities', 'custom-fields', 'deals'],
|
|
24
|
+
events: enquiriesEvents,
|
|
25
|
+
|
|
26
|
+
register(context) {
|
|
27
|
+
const service = createEnquiriesService({
|
|
28
|
+
db: context.db,
|
|
29
|
+
transaction: context.transaction,
|
|
30
|
+
createId: context.createId,
|
|
31
|
+
now: context.now,
|
|
32
|
+
recordActivity: createActivityRecorder({
|
|
33
|
+
createId: context.createId,
|
|
34
|
+
now: context.now,
|
|
35
|
+
}),
|
|
36
|
+
customFields: createCustomFieldValues({ db: context.db }),
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
context.schema(schema, migrationsDirectory)
|
|
40
|
+
|
|
41
|
+
context.routes((router) => {
|
|
42
|
+
mountEnquiriesRoutes(router, { db: context.db, now: context.now, service })
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
registerEnquiriesTools(context.mcp, service)
|
|
46
|
+
|
|
47
|
+
return Promise.resolve()
|
|
48
|
+
},
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { and, eq, ilike, inArray, or, sql } from 'drizzle-orm'
|
|
2
|
+
import type { SQL } from 'drizzle-orm'
|
|
3
|
+
|
|
4
|
+
import { keysetCondition, orderByWindow, textSort, timestampSort } from '../../lib/pagination.ts'
|
|
5
|
+
import type { ListWindow, SortableFields } from '../../lib/pagination.ts'
|
|
6
|
+
import { arrayContainsPattern, containsPattern } from '../../lib/search.ts'
|
|
7
|
+
import type { Queryable } from '../../runtime/transaction.ts'
|
|
8
|
+
import { companies } from '../companies/schema.ts'
|
|
9
|
+
import { anyPersonLinked } from '../personLinks.ts'
|
|
10
|
+
import { workspaceMembers } from '../workspace/schema.ts'
|
|
11
|
+
import { enquiries } from './schema.ts'
|
|
12
|
+
|
|
13
|
+
export type EnquiryRecord = typeof enquiries.$inferSelect
|
|
14
|
+
|
|
15
|
+
/** The writable column shape. Services build one of these; nothing else knows the column names. */
|
|
16
|
+
export type EnquiryColumns = typeof enquiries.$inferInsert
|
|
17
|
+
|
|
18
|
+
/** The sort fields `?sort=` documents. */
|
|
19
|
+
export const ENQUIRY_SORTS: SortableFields<EnquiryRecord> = {
|
|
20
|
+
name: textSort(enquiries.name, (enquiry) => enquiry.name),
|
|
21
|
+
created_at: timestampSort(enquiries.createdAt, (enquiry) => enquiry.createdAt),
|
|
22
|
+
updated_at: timestampSort(enquiries.updatedAt, (enquiry) => enquiry.updatedAt),
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const DEFAULT_ENQUIRY_SORT = '-created_at'
|
|
26
|
+
|
|
27
|
+
export interface EnquiryFilters {
|
|
28
|
+
/** `?q=`: name, source, summary, tags, or the company's name. */
|
|
29
|
+
readonly term?: string | undefined
|
|
30
|
+
/** `?source=`, repeatable: sources are free text, so a match is exact, not fuzzy. */
|
|
31
|
+
readonly sources?: readonly string[] | undefined
|
|
32
|
+
/** `?company_id=`, repeatable. */
|
|
33
|
+
readonly companyIds?: readonly string[] | undefined
|
|
34
|
+
/** `?stage_id=`, repeatable: the board fetches one column with one of these. */
|
|
35
|
+
readonly stageIds?: readonly string[] | undefined
|
|
36
|
+
/** `?person_id=`, repeatable: enquiries any of these people are on. */
|
|
37
|
+
readonly personIds?: readonly string[] | undefined
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The company half of `?q=`. Reads the `companies` *table*, never its
|
|
42
|
+
* repository, the rule set for a filter spanning a relation (`architecture.md`).
|
|
43
|
+
*/
|
|
44
|
+
function companyNameMatches(pattern: string): SQL {
|
|
45
|
+
return sql`exists (
|
|
46
|
+
select 1
|
|
47
|
+
from ${companies}
|
|
48
|
+
where ${companies.id} = ${enquiries.companyId}
|
|
49
|
+
and ${companies.workspaceId} = ${enquiries.workspaceId}
|
|
50
|
+
and ${companies.name} ilike ${pattern}
|
|
51
|
+
)`
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function matchesTerm(term: string): SQL | undefined {
|
|
55
|
+
const pattern = containsPattern(term)
|
|
56
|
+
|
|
57
|
+
return or(
|
|
58
|
+
ilike(enquiries.name, pattern),
|
|
59
|
+
ilike(enquiries.source, pattern),
|
|
60
|
+
ilike(enquiries.summary, pattern),
|
|
61
|
+
arrayContainsPattern(enquiries.tags, pattern),
|
|
62
|
+
companyNameMatches(pattern),
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function conditionsFor(workspaceId: string, filters: EnquiryFilters): (SQL | undefined)[] {
|
|
67
|
+
return [
|
|
68
|
+
eq(enquiries.workspaceId, workspaceId),
|
|
69
|
+
filters.term === undefined ? undefined : matchesTerm(filters.term),
|
|
70
|
+
filters.sources === undefined ? undefined : inArray(enquiries.source, filters.sources),
|
|
71
|
+
filters.companyIds === undefined
|
|
72
|
+
? undefined
|
|
73
|
+
: inArray(enquiries.companyId, filters.companyIds),
|
|
74
|
+
filters.stageIds === undefined ? undefined : inArray(enquiries.stageId, filters.stageIds),
|
|
75
|
+
filters.personIds === undefined
|
|
76
|
+
? undefined
|
|
77
|
+
: anyPersonLinked('enquiry', enquiries.id, enquiries.workspaceId, filters.personIds),
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** @returns Up to `window.fetchLimit` rows: one more than the page, so the caller can tell there is a next one. */
|
|
82
|
+
export function listEnquiries(
|
|
83
|
+
db: Queryable,
|
|
84
|
+
workspaceId: string,
|
|
85
|
+
filters: EnquiryFilters,
|
|
86
|
+
window: ListWindow<EnquiryRecord>,
|
|
87
|
+
): Promise<EnquiryRecord[]> {
|
|
88
|
+
return db
|
|
89
|
+
.select()
|
|
90
|
+
.from(enquiries)
|
|
91
|
+
.where(and(...conditionsFor(workspaceId, filters), keysetCondition(window, enquiries.id)))
|
|
92
|
+
.orderBy(...orderByWindow(window, enquiries.id))
|
|
93
|
+
.limit(window.fetchLimit)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export async function findEnquiry(
|
|
97
|
+
db: Queryable,
|
|
98
|
+
workspaceId: string,
|
|
99
|
+
id: string,
|
|
100
|
+
): Promise<EnquiryRecord | undefined> {
|
|
101
|
+
const [found] = await db
|
|
102
|
+
.select()
|
|
103
|
+
.from(enquiries)
|
|
104
|
+
.where(and(eq(enquiries.workspaceId, workspaceId), eq(enquiries.id, id)))
|
|
105
|
+
.limit(1)
|
|
106
|
+
|
|
107
|
+
return found
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export async function insertEnquiry(
|
|
111
|
+
db: Queryable,
|
|
112
|
+
values: EnquiryColumns,
|
|
113
|
+
): Promise<EnquiryRecord> {
|
|
114
|
+
const [created] = await db.insert(enquiries).values(values).returning()
|
|
115
|
+
|
|
116
|
+
if (created === undefined) {
|
|
117
|
+
throw new Error(`Inserting enquiry ${values.id} returned no row`)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return created
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export async function updateEnquiry(
|
|
124
|
+
db: Queryable,
|
|
125
|
+
workspaceId: string,
|
|
126
|
+
id: string,
|
|
127
|
+
changes: Partial<EnquiryColumns>,
|
|
128
|
+
): Promise<EnquiryRecord | undefined> {
|
|
129
|
+
const [updated] = await db
|
|
130
|
+
.update(enquiries)
|
|
131
|
+
.set(changes)
|
|
132
|
+
.where(and(eq(enquiries.workspaceId, workspaceId), eq(enquiries.id, id)))
|
|
133
|
+
.returning()
|
|
134
|
+
|
|
135
|
+
return updated
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export async function deleteEnquiry(
|
|
139
|
+
db: Queryable,
|
|
140
|
+
workspaceId: string,
|
|
141
|
+
id: string,
|
|
142
|
+
): Promise<number> {
|
|
143
|
+
const deleted = await db
|
|
144
|
+
.delete(enquiries)
|
|
145
|
+
.where(and(eq(enquiries.workspaceId, workspaceId), eq(enquiries.id, id)))
|
|
146
|
+
.returning({ id: enquiries.id })
|
|
147
|
+
|
|
148
|
+
return deleted.length
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Whether a member belongs to this workspace, for validating `owner_id`. */
|
|
152
|
+
export async function memberExists(
|
|
153
|
+
db: Queryable,
|
|
154
|
+
workspaceId: string,
|
|
155
|
+
memberId: string,
|
|
156
|
+
): Promise<boolean> {
|
|
157
|
+
const [found] = await db
|
|
158
|
+
.select({ id: workspaceMembers.id })
|
|
159
|
+
.from(workspaceMembers)
|
|
160
|
+
.where(and(eq(workspaceMembers.workspaceId, workspaceId), eq(workspaceMembers.id, memberId)))
|
|
161
|
+
.limit(1)
|
|
162
|
+
|
|
163
|
+
return found !== undefined
|
|
164
|
+
}
|