@kelpie/server 0.8.0 → 0.10.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/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- 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/index.d.ts +38 -0
- package/dist/modules/lists/index.d.ts.map +1 -1
- package/dist/modules/lists/index.js +27 -0
- package/dist/modules/lists/index.js.map +1 -1
- package/dist/modules/lists/repository.d.ts +26 -0
- package/dist/modules/lists/repository.d.ts.map +1 -1
- package/dist/modules/lists/repository.js +32 -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/index.ts +6 -0
- 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/index.ts +71 -0
- package/src/modules/lists/repository.ts +64 -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,5 +1,6 @@
|
|
|
1
1
|
import type { KelpieModule } from '../../runtime/module.ts'
|
|
2
2
|
import { createActivityRecorder } from '../activities/index.ts'
|
|
3
|
+
import { createCustomFieldValues } from '../custom-fields/index.ts'
|
|
3
4
|
import { raisesEvents } from './events.ts'
|
|
4
5
|
import { mountRaisesRoutes } from './routes.ts'
|
|
5
6
|
import * as schema from './schema.ts'
|
|
@@ -17,7 +18,7 @@ import { registerRaisesTools } from './tools.ts'
|
|
|
17
18
|
export function createRaisesModule(migrationsDirectory: string): KelpieModule {
|
|
18
19
|
return {
|
|
19
20
|
id: 'raises',
|
|
20
|
-
requires: ['companies', 'people', 'pipelines', 'activities'],
|
|
21
|
+
requires: ['companies', 'people', 'pipelines', 'activities', 'custom-fields'],
|
|
21
22
|
events: raisesEvents,
|
|
22
23
|
|
|
23
24
|
register(context) {
|
|
@@ -30,6 +31,7 @@ export function createRaisesModule(migrationsDirectory: string): KelpieModule {
|
|
|
30
31
|
createId: context.createId,
|
|
31
32
|
now: context.now,
|
|
32
33
|
}),
|
|
34
|
+
customFields: createCustomFieldValues({ db: context.db }),
|
|
33
35
|
})
|
|
34
36
|
|
|
35
37
|
context.schema(schema, migrationsDirectory)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { and,
|
|
1
|
+
import { and, eq, ilike, inArray, or, sql } from 'drizzle-orm'
|
|
2
2
|
import type { SQL } from 'drizzle-orm'
|
|
3
3
|
|
|
4
4
|
import { keysetCondition, orderByWindow, textSort, timestampSort } from '../../lib/pagination.ts'
|
|
@@ -6,9 +6,9 @@ import type { ListWindow, SortableFields } from '../../lib/pagination.ts'
|
|
|
6
6
|
import { arrayContainsPattern, containsPattern } from '../../lib/search.ts'
|
|
7
7
|
import type { Queryable } from '../../runtime/transaction.ts'
|
|
8
8
|
import { companies } from '../companies/schema.ts'
|
|
9
|
-
import {
|
|
9
|
+
import { anyPersonLinked } from '../personLinks.ts'
|
|
10
10
|
import { workspaceMembers } from '../workspace/schema.ts'
|
|
11
|
-
import {
|
|
11
|
+
import { raises } from './schema.ts'
|
|
12
12
|
|
|
13
13
|
export type RaiseRecord = typeof raises.$inferSelect
|
|
14
14
|
|
|
@@ -52,15 +52,6 @@ function companyNameMatches(pattern: string): SQL {
|
|
|
52
52
|
)`
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
function hasAnyOfPeople(personIds: readonly string[]): SQL {
|
|
56
|
-
return sql`exists (
|
|
57
|
-
select 1
|
|
58
|
-
from ${raisePeople}
|
|
59
|
-
where ${raisePeople.raiseId} = ${raises.id}
|
|
60
|
-
and ${inArray(raisePeople.personId, personIds)}
|
|
61
|
-
)`
|
|
62
|
-
}
|
|
63
|
-
|
|
64
55
|
function matchesTerm(term: string): SQL | undefined {
|
|
65
56
|
const pattern = containsPattern(term)
|
|
66
57
|
|
|
@@ -78,7 +69,9 @@ function conditionsFor(workspaceId: string, filters: RaiseFilters): (SQL | undef
|
|
|
78
69
|
filters.term === undefined ? undefined : matchesTerm(filters.term),
|
|
79
70
|
filters.companyIds === undefined ? undefined : inArray(raises.companyId, filters.companyIds),
|
|
80
71
|
filters.stageIds === undefined ? undefined : inArray(raises.stageId, filters.stageIds),
|
|
81
|
-
filters.personIds === undefined
|
|
72
|
+
filters.personIds === undefined
|
|
73
|
+
? undefined
|
|
74
|
+
: anyPersonLinked('raise', raises.id, raises.workspaceId, filters.personIds),
|
|
82
75
|
]
|
|
83
76
|
}
|
|
84
77
|
|
|
@@ -145,100 +138,6 @@ export async function deleteRaise(db: Queryable, workspaceId: string, id: string
|
|
|
145
138
|
return deleted.length
|
|
146
139
|
}
|
|
147
140
|
|
|
148
|
-
/** The key people on one raise. Ordered by id so a response is stable across reads. */
|
|
149
|
-
export async function listPersonIds(db: Queryable, raiseId: string): Promise<string[]> {
|
|
150
|
-
const rows = await db
|
|
151
|
-
.select({ personId: raisePeople.personId })
|
|
152
|
-
.from(raisePeople)
|
|
153
|
-
.where(eq(raisePeople.raiseId, raiseId))
|
|
154
|
-
.orderBy(asc(raisePeople.personId))
|
|
155
|
-
|
|
156
|
-
return rows.map((row) => row.personId)
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* The key people on each of a page of raises, in one query rather than one per
|
|
161
|
-
* row.
|
|
162
|
-
*
|
|
163
|
-
* @returns Ids missing from the map have no people.
|
|
164
|
-
*/
|
|
165
|
-
export async function listPersonIdsFor(
|
|
166
|
-
db: Queryable,
|
|
167
|
-
raiseIds: readonly string[],
|
|
168
|
-
): Promise<ReadonlyMap<string, readonly string[]>> {
|
|
169
|
-
if (raiseIds.length === 0) {
|
|
170
|
-
return new Map()
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const rows = await db
|
|
174
|
-
.select({ raiseId: raisePeople.raiseId, personId: raisePeople.personId })
|
|
175
|
-
.from(raisePeople)
|
|
176
|
-
.where(inArray(raisePeople.raiseId, raiseIds))
|
|
177
|
-
.orderBy(asc(raisePeople.personId))
|
|
178
|
-
|
|
179
|
-
const byRaise = new Map<string, string[]>()
|
|
180
|
-
|
|
181
|
-
for (const row of rows) {
|
|
182
|
-
const existing = byRaise.get(row.raiseId)
|
|
183
|
-
|
|
184
|
-
if (existing === undefined) {
|
|
185
|
-
byRaise.set(row.raiseId, [row.personId])
|
|
186
|
-
} else {
|
|
187
|
-
existing.push(row.personId)
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
return byRaise
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
export async function insertRaisePeople(
|
|
195
|
-
db: Queryable,
|
|
196
|
-
raiseId: string,
|
|
197
|
-
personIds: readonly string[],
|
|
198
|
-
): Promise<void> {
|
|
199
|
-
if (personIds.length === 0) {
|
|
200
|
-
return
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
await db.insert(raisePeople).values(personIds.map((personId) => ({ raiseId, personId })))
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
export async function deleteRaisePeople(
|
|
207
|
-
db: Queryable,
|
|
208
|
-
raiseId: string,
|
|
209
|
-
personIds: readonly string[],
|
|
210
|
-
): Promise<void> {
|
|
211
|
-
if (personIds.length === 0) {
|
|
212
|
-
return
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
await db
|
|
216
|
-
.delete(raisePeople)
|
|
217
|
-
.where(and(eq(raisePeople.raiseId, raiseId), inArray(raisePeople.personId, personIds)))
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* The names of these people in this workspace, keyed by id. An id missing from
|
|
222
|
-
* the map does not exist here, which is how `person_ids` is validated. Reads the
|
|
223
|
-
* `people` *table*, per the cross-relation rule in `architecture.md`.
|
|
224
|
-
*/
|
|
225
|
-
export async function findPeopleNamed(
|
|
226
|
-
db: Queryable,
|
|
227
|
-
workspaceId: string,
|
|
228
|
-
personIds: readonly string[],
|
|
229
|
-
): Promise<ReadonlyMap<string, string>> {
|
|
230
|
-
if (personIds.length === 0) {
|
|
231
|
-
return new Map()
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
const rows = await db
|
|
235
|
-
.select({ id: people.id, name: people.name })
|
|
236
|
-
.from(people)
|
|
237
|
-
.where(and(eq(people.workspaceId, workspaceId), inArray(people.id, personIds)))
|
|
238
|
-
|
|
239
|
-
return new Map(rows.map((row) => [row.id, row.name]))
|
|
240
|
-
}
|
|
241
|
-
|
|
242
141
|
/** Whether a member belongs to this workspace, for validating `owner_id`. */
|
|
243
142
|
export async function memberExists(
|
|
244
143
|
db: Queryable,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { customFieldsPatchShape } from '@kelpie/schemas'
|
|
1
2
|
import type { Context, Hono } from 'hono'
|
|
2
3
|
import { z } from 'zod'
|
|
3
4
|
|
|
@@ -6,6 +7,7 @@ import { pageBody, readIdFilter, readJsonBody, readListParameters } from '../../
|
|
|
6
7
|
import type { Actor } from '../auth/actor.ts'
|
|
7
8
|
import { resolveActorFrom } from '../auth/credentials.ts'
|
|
8
9
|
import type { CredentialDependencies } from '../auth/credentials.ts'
|
|
10
|
+
import { renderCustomFieldsForWire } from '../custom-fields/wire.ts'
|
|
9
11
|
import type { CreateRaiseInput, RaiseView, RaisesService, UpdateRaiseInput } from './service.ts'
|
|
10
12
|
|
|
11
13
|
/** Wire shapes for `/v1/raises`. Bodies are strict; an unknown field is a 422, per `api.md`. */
|
|
@@ -26,6 +28,7 @@ const raiseShape = {
|
|
|
26
28
|
person_ids: z.array(z.string().min(1)),
|
|
27
29
|
summary: z.string(),
|
|
28
30
|
tags: z.array(z.string().min(1)),
|
|
31
|
+
custom_fields: customFieldsPatchShape,
|
|
29
32
|
}
|
|
30
33
|
|
|
31
34
|
/**
|
|
@@ -48,6 +51,7 @@ export const createBody = z.strictObject({
|
|
|
48
51
|
person_ids: raiseShape.person_ids.default([]),
|
|
49
52
|
summary: raiseShape.summary.default(''),
|
|
50
53
|
tags: raiseShape.tags.default([]),
|
|
54
|
+
custom_fields: raiseShape.custom_fields.default({}),
|
|
51
55
|
})
|
|
52
56
|
|
|
53
57
|
export const updateBody = z.strictObject(raiseShape).partial()
|
|
@@ -70,6 +74,7 @@ export function toCreateInput(body: z.infer<typeof createBody>): CreateRaiseInpu
|
|
|
70
74
|
personIds: body.person_ids,
|
|
71
75
|
summary: body.summary,
|
|
72
76
|
tags: body.tags,
|
|
77
|
+
customFields: body.custom_fields,
|
|
73
78
|
}
|
|
74
79
|
}
|
|
75
80
|
|
|
@@ -87,6 +92,7 @@ export function toUpdateInput(body: z.infer<typeof updateBody>): UpdateRaiseInpu
|
|
|
87
92
|
...(body.person_ids === undefined ? {} : { personIds: body.person_ids }),
|
|
88
93
|
...(body.summary === undefined ? {} : { summary: body.summary }),
|
|
89
94
|
...(body.tags === undefined ? {} : { tags: body.tags }),
|
|
95
|
+
...(body.custom_fields === undefined ? {} : { customFields: body.custom_fields }),
|
|
90
96
|
}
|
|
91
97
|
}
|
|
92
98
|
|
|
@@ -105,6 +111,7 @@ export function raiseResponse(raise: RaiseView): Record<string, unknown> {
|
|
|
105
111
|
person_ids: raise.personIds,
|
|
106
112
|
summary: raise.summary,
|
|
107
113
|
tags: raise.tags,
|
|
114
|
+
custom_fields: renderCustomFieldsForWire(raise.customFields),
|
|
108
115
|
created_at: raise.createdAt.toISOString(),
|
|
109
116
|
updated_at: raise.updatedAt.toISOString(),
|
|
110
117
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { CustomFieldValue } from '@kelpie/schemas'
|
|
2
|
+
import { bigint, date, index, jsonb, pgTable, text } from 'drizzle-orm/pg-core'
|
|
2
3
|
|
|
3
4
|
import { createdAt, primaryId, searchVector, updatedAt } from '../../lib/columns.ts'
|
|
4
5
|
import type { SearchVectorPart } from '../../lib/columns.ts'
|
|
5
6
|
import { companies } from '../companies/schema.ts'
|
|
6
|
-
import { people } from '../people/schema.ts'
|
|
7
7
|
import { pipelineStages } from '../pipelines/schema.ts'
|
|
8
8
|
import { workspaceMembers, workspaces } from '../workspace/schema.ts'
|
|
9
9
|
|
|
@@ -34,6 +34,11 @@ export const raises = pgTable(
|
|
|
34
34
|
expectedClose: date('expected_close'),
|
|
35
35
|
summary: text('summary').notNull().default(''),
|
|
36
36
|
tags: text('tags').array().notNull().default([]),
|
|
37
|
+
// Workspace-defined fields, keyed by definition key. See people/schema.ts.
|
|
38
|
+
customFields: jsonb('custom_fields')
|
|
39
|
+
.$type<Readonly<Record<string, CustomFieldValue>>>()
|
|
40
|
+
.notNull()
|
|
41
|
+
.default({}),
|
|
37
42
|
createdAt: createdAt(),
|
|
38
43
|
updatedAt: updatedAt(),
|
|
39
44
|
searchVector: searchVector((): readonly SearchVectorPart[] => [
|
|
@@ -52,15 +57,3 @@ export const raises = pgTable(
|
|
|
52
57
|
],
|
|
53
58
|
)
|
|
54
59
|
|
|
55
|
-
export const raisePeople = pgTable(
|
|
56
|
-
'raise_people',
|
|
57
|
-
{
|
|
58
|
-
raiseId: text('raise_id')
|
|
59
|
-
.notNull()
|
|
60
|
-
.references(() => raises.id, { onDelete: 'cascade' }),
|
|
61
|
-
personId: text('person_id')
|
|
62
|
-
.notNull()
|
|
63
|
-
.references(() => people.id, { onDelete: 'restrict' }),
|
|
64
|
-
},
|
|
65
|
-
(table) => [primaryKey({ columns: [table.raiseId, table.personId] })],
|
|
66
|
-
)
|
|
@@ -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'
|
|
@@ -31,7 +35,7 @@ import type { RaiseFilters, RaiseRecord } from './repository.ts'
|
|
|
31
35
|
* passed. The firm is `company_id`; the ongoing relationship with that firm
|
|
32
36
|
* stays a Partnership (`brief.md`).
|
|
33
37
|
*
|
|
34
|
-
* Key people attach through `
|
|
38
|
+
* Key people attach through `person_links` and appear as `person_ids` on the
|
|
35
39
|
* wire, and the check size is integer cents plus an ISO 4217 code, both the
|
|
36
40
|
* Deals mechanics. A stage move is an ordinary PATCH of `stage_id`, and it is
|
|
37
41
|
* the one change that files a `stage_changed` activity and a `stage.changed`
|
|
@@ -44,6 +48,7 @@ export interface RaisesDependencies {
|
|
|
44
48
|
readonly createId: IdFactory
|
|
45
49
|
readonly now: () => Date
|
|
46
50
|
readonly recordActivity: ActivityRecorder
|
|
51
|
+
readonly customFields: CustomFieldValuesValidator
|
|
47
52
|
}
|
|
48
53
|
|
|
49
54
|
/** What a changed column is called on a timeline. The mockup says Firm and Target close, not Company and Expected close. */
|
|
@@ -89,6 +94,8 @@ export interface CreateRaiseInput {
|
|
|
89
94
|
readonly personIds: readonly string[]
|
|
90
95
|
readonly summary: string
|
|
91
96
|
readonly tags: readonly string[]
|
|
97
|
+
/** Wire shape for a create body: `null` values are ignored, non-null are validated. */
|
|
98
|
+
readonly customFields: Readonly<Record<string, CustomFieldWireValue | null>> | undefined
|
|
92
99
|
}
|
|
93
100
|
|
|
94
101
|
/** PATCH semantics: an absent field is left alone, and null clears a nullable one. */
|
|
@@ -106,6 +113,11 @@ export interface UpdateRaiseInput {
|
|
|
106
113
|
readonly personIds?: readonly string[] | undefined
|
|
107
114
|
readonly summary?: string | undefined
|
|
108
115
|
readonly tags?: readonly string[] | undefined
|
|
116
|
+
/**
|
|
117
|
+
* Partial merge patch (wire shape): sent keys change, `null` clears a key,
|
|
118
|
+
* absent keys are left alone. Unknown keys are `422`.
|
|
119
|
+
*/
|
|
120
|
+
readonly customFields?: Readonly<Record<string, CustomFieldWireValue | null>> | undefined
|
|
109
121
|
}
|
|
110
122
|
|
|
111
123
|
export interface RaisesService {
|
|
@@ -207,7 +219,7 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
|
|
|
207
219
|
workspaceId: string,
|
|
208
220
|
personIds: readonly string[],
|
|
209
221
|
): Promise<ReadonlyMap<string, string>> {
|
|
210
|
-
const named = await
|
|
222
|
+
const named = await personLinks.findPeopleNamed(dependencies.db, workspaceId, personIds)
|
|
211
223
|
const missing = personIds.filter((id) => !named.has(id))
|
|
212
224
|
|
|
213
225
|
if (missing.length > 0) {
|
|
@@ -222,9 +234,14 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
|
|
|
222
234
|
}
|
|
223
235
|
|
|
224
236
|
/** @returns The page's views, with every raise's people fetched in one query. */
|
|
225
|
-
async function toViews(
|
|
226
|
-
|
|
237
|
+
async function toViews(
|
|
238
|
+
workspaceId: string,
|
|
239
|
+
records: readonly RaiseRecord[],
|
|
240
|
+
): Promise<RaiseView[]> {
|
|
241
|
+
const peopleByRaise = await personLinks.listPersonIdsFor(
|
|
227
242
|
dependencies.db,
|
|
243
|
+
workspaceId,
|
|
244
|
+
'raise',
|
|
228
245
|
records.map((record) => record.id),
|
|
229
246
|
)
|
|
230
247
|
|
|
@@ -238,14 +255,20 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
|
|
|
238
255
|
const rows = await repository.listRaises(dependencies.db, workspaceId, filters, window)
|
|
239
256
|
const page = toPage(rows, window, (raise) => raise.id)
|
|
240
257
|
|
|
241
|
-
return { items: await toViews(page.items), nextCursor: page.nextCursor }
|
|
258
|
+
return { items: await toViews(workspaceId, page.items), nextCursor: page.nextCursor }
|
|
242
259
|
},
|
|
243
260
|
|
|
244
261
|
async get(actor, id) {
|
|
245
262
|
const workspaceId = requireWorkspaceId(actor)
|
|
246
263
|
const raise = await require(workspaceId, id)
|
|
247
264
|
|
|
248
|
-
return toView(
|
|
265
|
+
return toView(
|
|
266
|
+
raise,
|
|
267
|
+
await personLinks.listPersonIds(dependencies.db, workspaceId, {
|
|
268
|
+
targetType: 'raise',
|
|
269
|
+
targetId: id,
|
|
270
|
+
}),
|
|
271
|
+
)
|
|
249
272
|
},
|
|
250
273
|
|
|
251
274
|
async create(actor, input) {
|
|
@@ -268,6 +291,12 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
|
|
|
268
291
|
const id = dependencies.createId('raise')
|
|
269
292
|
|
|
270
293
|
return dependencies.transaction(async ({ tx, events }) => {
|
|
294
|
+
const customFields = await dependencies.customFields.forCreate(
|
|
295
|
+
tx,
|
|
296
|
+
workspaceId,
|
|
297
|
+
'raise',
|
|
298
|
+
input.customFields,
|
|
299
|
+
)
|
|
271
300
|
const created = await repository.insertRaise(tx, {
|
|
272
301
|
id,
|
|
273
302
|
workspaceId,
|
|
@@ -282,9 +311,16 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
|
|
|
282
311
|
expectedClose: input.expectedClose,
|
|
283
312
|
summary: input.summary,
|
|
284
313
|
tags: [...input.tags],
|
|
314
|
+
customFields,
|
|
285
315
|
})
|
|
286
316
|
|
|
287
|
-
await
|
|
317
|
+
await personLinks.linkPeople(
|
|
318
|
+
tx,
|
|
319
|
+
dependencies.createId,
|
|
320
|
+
workspaceId,
|
|
321
|
+
{ targetType: 'raise', targetId: id },
|
|
322
|
+
personIds,
|
|
323
|
+
)
|
|
288
324
|
|
|
289
325
|
await dependencies.recordActivity(tx, workspaceId, actor, {
|
|
290
326
|
targetType: 'raise',
|
|
@@ -329,7 +365,10 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
|
|
|
329
365
|
await requireOwner(workspaceId, changes.ownerId)
|
|
330
366
|
}
|
|
331
367
|
|
|
332
|
-
const currentPeople = await
|
|
368
|
+
const currentPeople = await personLinks.listPersonIds(dependencies.db, workspaceId, {
|
|
369
|
+
targetType: 'raise',
|
|
370
|
+
targetId: id,
|
|
371
|
+
})
|
|
333
372
|
const nextPeople =
|
|
334
373
|
changes.personIds === undefined ? undefined : [...new Set(changes.personIds)]
|
|
335
374
|
const added =
|
|
@@ -343,16 +382,26 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
|
|
|
343
382
|
const named = await requirePeople(workspaceId, [...added, ...removed])
|
|
344
383
|
|
|
345
384
|
const columns = toStoredColumns(changes)
|
|
346
|
-
const
|
|
385
|
+
const scalarChanged = changedKeys(existing, columns)
|
|
347
386
|
const linksChanged = added.length > 0 || removed.length > 0
|
|
348
387
|
|
|
349
|
-
if (changed.length === 0 && !linksChanged) {
|
|
350
|
-
return toView(existing, currentPeople)
|
|
351
|
-
}
|
|
352
|
-
|
|
353
388
|
return dependencies.transaction(async ({ tx, events }) => {
|
|
389
|
+
const cf = await dependencies.customFields.forUpdate(
|
|
390
|
+
tx,
|
|
391
|
+
workspaceId,
|
|
392
|
+
'raise',
|
|
393
|
+
existing.customFields,
|
|
394
|
+
changes.customFields,
|
|
395
|
+
)
|
|
396
|
+
const customFieldsChanged = cf !== undefined && cf.changedPaths.length > 0
|
|
397
|
+
|
|
398
|
+
if (scalarChanged.length === 0 && !linksChanged && !customFieldsChanged) {
|
|
399
|
+
return toView(existing, currentPeople)
|
|
400
|
+
}
|
|
401
|
+
|
|
354
402
|
const updated = await repository.updateRaise(tx, workspaceId, id, {
|
|
355
403
|
...columns,
|
|
404
|
+
...(customFieldsChanged ? { customFields: cf.merged } : {}),
|
|
356
405
|
updatedAt: dependencies.now(),
|
|
357
406
|
})
|
|
358
407
|
|
|
@@ -360,8 +409,19 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
|
|
|
360
409
|
throw AppError.notFound('Raise not found')
|
|
361
410
|
}
|
|
362
411
|
|
|
363
|
-
await
|
|
364
|
-
|
|
412
|
+
await personLinks.linkPeople(
|
|
413
|
+
tx,
|
|
414
|
+
dependencies.createId,
|
|
415
|
+
workspaceId,
|
|
416
|
+
{ targetType: 'raise', targetId: id },
|
|
417
|
+
added,
|
|
418
|
+
)
|
|
419
|
+
await personLinks.unlinkPeople(
|
|
420
|
+
tx,
|
|
421
|
+
workspaceId,
|
|
422
|
+
{ targetType: 'raise', targetId: id },
|
|
423
|
+
removed,
|
|
424
|
+
)
|
|
365
425
|
|
|
366
426
|
if (stageMove !== undefined) {
|
|
367
427
|
await dependencies.recordActivity(tx, workspaceId, actor, {
|
|
@@ -372,14 +432,19 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
|
|
|
372
432
|
})
|
|
373
433
|
}
|
|
374
434
|
|
|
375
|
-
const otherChanged =
|
|
435
|
+
const otherChanged = scalarChanged.filter((field) => field !== 'stageId')
|
|
436
|
+
const customFieldPaths = cf?.changedPaths ?? []
|
|
437
|
+
const activityChanged = [...otherChanged, ...customFieldPaths]
|
|
376
438
|
|
|
377
|
-
if (
|
|
439
|
+
if (activityChanged.length > 0) {
|
|
440
|
+
const labels: Record<string, string> = { ...RAISE_FIELD_LABELS, ...cf?.labels }
|
|
441
|
+
const before: Record<string, unknown> = { ...existing, ...cf?.flatBefore }
|
|
442
|
+
const after: Record<string, unknown> = { ...columns, ...cf?.flatAfter }
|
|
378
443
|
await dependencies.recordActivity(tx, workspaceId, actor, {
|
|
379
444
|
targetType: 'raise',
|
|
380
445
|
targetId: id,
|
|
381
446
|
kind: 'updated',
|
|
382
|
-
...describeUpdate(
|
|
447
|
+
...describeUpdate(activityChanged, labels, before, after),
|
|
383
448
|
})
|
|
384
449
|
}
|
|
385
450
|
|
|
@@ -407,7 +472,13 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
|
|
|
407
472
|
events.emit(
|
|
408
473
|
'raises.raise.updated',
|
|
409
474
|
{ type: 'raise', id },
|
|
410
|
-
{
|
|
475
|
+
{
|
|
476
|
+
changed: [
|
|
477
|
+
...scalarChanged,
|
|
478
|
+
...(linksChanged ? ['personIds'] : []),
|
|
479
|
+
...customFieldPaths,
|
|
480
|
+
],
|
|
481
|
+
},
|
|
411
482
|
)
|
|
412
483
|
|
|
413
484
|
if (stageMove !== undefined) {
|
|
@@ -428,7 +499,7 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
|
|
|
428
499
|
await dependencies.transaction(async ({ tx, events }) => {
|
|
429
500
|
await require(workspaceId, id)
|
|
430
501
|
|
|
431
|
-
//
|
|
502
|
+
// Notes, activities, decisions, plan items, and person_links have no key back to the raise;
|
|
432
503
|
// activities, decisions and plan items have no key, so they are removed
|
|
433
504
|
// here, in the same transaction.
|
|
434
505
|
await deleteRecordsAttachedTo(tx, workspaceId, 'raise', id)
|
|
@@ -4,6 +4,7 @@ import type { PgColumn, PgTable } from 'drizzle-orm/pg-core'
|
|
|
4
4
|
import type { Queryable } from '../runtime/transaction.ts'
|
|
5
5
|
import { companies } from './companies/schema.ts'
|
|
6
6
|
import { deals } from './deals/schema.ts'
|
|
7
|
+
import { enquiries } from './enquiries/schema.ts'
|
|
7
8
|
import { candidates } from './hiring/schema.ts'
|
|
8
9
|
import { RECORD_TARGET_TYPES } from './notes/schema.ts'
|
|
9
10
|
import { opportunities } from './opportunities/schema.ts'
|
|
@@ -64,6 +65,7 @@ const TABLES: Readonly<Record<RecordTargetType, TargetTable>> = {
|
|
|
64
65
|
partnerships.name,
|
|
65
66
|
),
|
|
66
67
|
raise: targetTable(raises, raises.id, raises.workspaceId, raises.name),
|
|
68
|
+
enquiry: targetTable(enquiries, enquiries.id, enquiries.workspaceId, enquiries.name),
|
|
67
69
|
candidate: targetTable(candidates, candidates.id, candidates.workspaceId),
|
|
68
70
|
}
|
|
69
71
|
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import type { PipelineKind } from '@kelpie/schemas'
|
|
2
|
+
import { PIPELINE_KINDS } from '@kelpie/schemas'
|
|
3
|
+
|
|
1
4
|
import { referenceViolationTable } from '../lib/database.ts'
|
|
2
5
|
import { AppError } from '../lib/errors.ts'
|
|
3
6
|
|
|
@@ -10,21 +13,30 @@ import { AppError } from '../lib/errors.ts'
|
|
|
10
13
|
* insert, and would need updating every time a table gains a foreign key.
|
|
11
14
|
*/
|
|
12
15
|
|
|
13
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* Referencing tables, as the domain names a user of the API would recognise.
|
|
18
|
+
*
|
|
19
|
+
* `person_links` is deliberately absent: its `target_type` is one of four
|
|
20
|
+
* pipeline kinds and the row itself names which, so a caller reads
|
|
21
|
+
* `referencedByPipelineRecords` for that path instead of losing detail to a
|
|
22
|
+
* generic "person link" label.
|
|
23
|
+
*/
|
|
14
24
|
const REFERENCING_TYPE_BY_TABLE: Readonly<Record<string, string>> = {
|
|
15
25
|
candidates: 'candidate',
|
|
16
|
-
deal_people: 'deal',
|
|
17
26
|
deals: 'deal',
|
|
27
|
+
enquiries: 'enquiry',
|
|
18
28
|
form_submissions: 'form submission',
|
|
19
29
|
forms: 'form',
|
|
20
30
|
opportunities: 'opportunity',
|
|
21
|
-
partnership_people: 'partnership',
|
|
22
31
|
partnerships: 'partnership',
|
|
23
|
-
raise_people: 'raise',
|
|
24
32
|
raises: 'raise',
|
|
25
33
|
workspace_members: 'team member',
|
|
26
34
|
}
|
|
27
35
|
|
|
36
|
+
const PIPELINE_KIND_ORDER: ReadonlyMap<PipelineKind, number> = new Map(
|
|
37
|
+
PIPELINE_KINDS.map((kind, index) => [kind, index] as const),
|
|
38
|
+
)
|
|
39
|
+
|
|
28
40
|
/**
|
|
29
41
|
* @param subject The record being deleted, e.g. `person`. Appears in the message.
|
|
30
42
|
* @returns A 409. The referencing type is omitted when the driver did not report
|
|
@@ -42,3 +54,30 @@ export function referencedElsewhere(error: unknown, subject: string): AppError {
|
|
|
42
54
|
{ field: 'id', message: `Referenced by ${type}` },
|
|
43
55
|
])
|
|
44
56
|
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The 409 for a person delete that `person_links` refused. The service queries
|
|
60
|
+
* the distinct target types still pointing at the person and passes them here,
|
|
61
|
+
* so the reply names one detail per pipeline the person is on (in
|
|
62
|
+
* `PIPELINE_KINDS` order, matching how the pipelines appear across the UI).
|
|
63
|
+
* Falls back to the generic wording only when the query came back empty, which
|
|
64
|
+
* is the delete-races-another-delete race — still a 409, just less specific.
|
|
65
|
+
*/
|
|
66
|
+
export function referencedByPipelineRecords(
|
|
67
|
+
subject: string,
|
|
68
|
+
types: readonly PipelineKind[],
|
|
69
|
+
): AppError {
|
|
70
|
+
if (types.length === 0) {
|
|
71
|
+
return AppError.conflict(`This ${subject} is still referenced by another record`)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const ordered = [...types].sort(
|
|
75
|
+
(left, right) => (PIPELINE_KIND_ORDER.get(left) ?? 0) - (PIPELINE_KIND_ORDER.get(right) ?? 0),
|
|
76
|
+
)
|
|
77
|
+
const [first] = ordered
|
|
78
|
+
|
|
79
|
+
return AppError.conflict(
|
|
80
|
+
`This ${subject} is still referenced by a ${first}`,
|
|
81
|
+
ordered.map((type) => ({ field: 'id', message: `Referenced by ${type}` })),
|
|
82
|
+
)
|
|
83
|
+
}
|