@kelpie/server 0.7.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/consumerEmailDomains.d.ts +2 -0
- package/dist/lib/consumerEmailDomains.d.ts.map +1 -0
- package/dist/lib/consumerEmailDomains.js +62 -0
- package/dist/lib/consumerEmailDomains.js.map +1 -0
- package/dist/lib/email.d.ts +7 -0
- package/dist/lib/email.d.ts.map +1 -1
- package/dist/lib/email.js.map +1 -1
- package/dist/lib/emailContent.d.ts +33 -0
- package/dist/lib/emailContent.d.ts.map +1 -0
- package/dist/lib/emailContent.js +54 -0
- package/dist/lib/emailContent.js.map +1 -0
- package/dist/lib/emailDomainAutoLink.d.ts +27 -0
- package/dist/lib/emailDomainAutoLink.d.ts.map +1 -0
- package/dist/lib/emailDomainAutoLink.js +119 -0
- package/dist/lib/emailDomainAutoLink.js.map +1 -0
- package/dist/lib/ids.d.ts +13 -0
- package/dist/lib/ids.d.ts.map +1 -1
- package/dist/lib/ids.js +13 -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 +18 -2
- package/dist/modules/attachedRecords.js.map +1 -1
- package/dist/modules/auth/preferences.d.ts +11 -1
- package/dist/modules/auth/preferences.d.ts.map +1 -1
- package/dist/modules/auth/preferences.js +11 -0
- package/dist/modules/auth/preferences.js.map +1 -1
- package/dist/modules/auth/routes.d.ts.map +1 -1
- package/dist/modules/auth/routes.js +18 -0
- package/dist/modules/auth/routes.js.map +1 -1
- package/dist/modules/auth/schema.d.ts +20 -0
- package/dist/modules/auth/schema.d.ts.map +1 -1
- package/dist/modules/auth/schema.js +11 -1
- package/dist/modules/auth/schema.js.map +1 -1
- package/dist/modules/auth/service.d.ts.map +1 -1
- package/dist/modules/auth/service.js +27 -3
- package/dist/modules/auth/service.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/repository.d.ts +2 -0
- package/dist/modules/companies/repository.d.ts.map +1 -1
- package/dist/modules/companies/repository.js +1 -0
- package/dist/modules/companies/repository.js.map +1 -1
- package/dist/modules/companies/routes.d.ts +16 -0
- package/dist/modules/companies/routes.d.ts.map +1 -1
- package/dist/modules/companies/routes.js +18 -0
- package/dist/modules/companies/routes.js.map +1 -1
- package/dist/modules/companies/schema.d.ts +37 -0
- package/dist/modules/companies/schema.d.ts.map +1 -1
- package/dist/modules/companies/schema.js +10 -1
- package/dist/modules/companies/schema.js.map +1 -1
- package/dist/modules/companies/service.d.ts +6 -0
- package/dist/modules/companies/service.d.ts.map +1 -1
- package/dist/modules/companies/service.js +45 -11
- 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 +21 -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/email-domain-linker/index.d.ts +12 -0
- package/dist/modules/email-domain-linker/index.d.ts.map +1 -0
- package/dist/modules/email-domain-linker/index.js +34 -0
- package/dist/modules/email-domain-linker/index.js.map +1 -0
- package/dist/modules/email-domain-linker/routes.d.ts +14 -0
- package/dist/modules/email-domain-linker/routes.d.ts.map +1 -0
- package/dist/modules/email-domain-linker/routes.js +15 -0
- package/dist/modules/email-domain-linker/routes.js.map +1 -0
- package/dist/modules/email-domain-linker/service.d.ts +37 -0
- package/dist/modules/email-domain-linker/service.d.ts.map +1 -0
- package/dist/modules/email-domain-linker/service.js +63 -0
- package/dist/modules/email-domain-linker/service.js.map +1 -0
- 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 +4 -0
- package/dist/modules/eventCatalogs.d.ts.map +1 -1
- package/dist/modules/eventCatalogs.js +4 -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/events.d.ts +42 -0
- package/dist/modules/lists/events.d.ts.map +1 -0
- package/dist/modules/lists/events.js +16 -0
- package/dist/modules/lists/events.js.map +1 -0
- package/dist/modules/lists/index.d.ts +10 -0
- package/dist/modules/lists/index.d.ts.map +1 -0
- package/dist/modules/lists/index.js +35 -0
- package/dist/modules/lists/index.js.map +1 -0
- package/dist/modules/lists/repository.d.ts +80 -0
- package/dist/modules/lists/repository.d.ts.map +1 -0
- package/dist/modules/lists/repository.js +178 -0
- package/dist/modules/lists/repository.js.map +1 -0
- package/dist/modules/lists/routes.d.ts +55 -0
- package/dist/modules/lists/routes.d.ts.map +1 -0
- package/dist/modules/lists/routes.js +168 -0
- package/dist/modules/lists/routes.js.map +1 -0
- package/dist/modules/lists/schema.d.ts +281 -0
- package/dist/modules/lists/schema.d.ts.map +1 -0
- package/dist/modules/lists/schema.js +83 -0
- package/dist/modules/lists/schema.js.map +1 -0
- package/dist/modules/lists/service.d.ts +82 -0
- package/dist/modules/lists/service.d.ts.map +1 -0
- package/dist/modules/lists/service.js +262 -0
- package/dist/modules/lists/service.js.map +1 -0
- package/dist/modules/lists/tools.d.ts +4 -0
- package/dist/modules/lists/tools.d.ts.map +1 -0
- package/dist/modules/lists/tools.js +86 -0
- package/dist/modules/lists/tools.js.map +1 -0
- 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 +11 -0
- package/dist/modules/people/repository.d.ts.map +1 -1
- package/dist/modules/people/repository.js +21 -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 +131 -36
- 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/positions/routes.d.ts.map +1 -1
- package/dist/modules/positions/routes.js +4 -2
- package/dist/modules/positions/routes.js.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 +160 -0
- package/dist/modules/sample-data/fixture.d.ts.map +1 -0
- package/dist/modules/sample-data/fixture.js +501 -0
- package/dist/modules/sample-data/fixture.js.map +1 -0
- package/dist/modules/sample-data/index.d.ts +11 -0
- package/dist/modules/sample-data/index.d.ts.map +1 -0
- package/dist/modules/sample-data/index.js +44 -0
- package/dist/modules/sample-data/index.js.map +1 -0
- package/dist/modules/sample-data/routes.d.ts +15 -0
- package/dist/modules/sample-data/routes.d.ts.map +1 -0
- package/dist/modules/sample-data/routes.js +25 -0
- package/dist/modules/sample-data/routes.js.map +1 -0
- package/dist/modules/sample-data/service.d.ts +39 -0
- package/dist/modules/sample-data/service.d.ts.map +1 -0
- package/dist/modules/sample-data/service.js +481 -0
- package/dist/modules/sample-data/service.js.map +1 -0
- package/dist/modules/sample-data/tools.d.ts +4 -0
- package/dist/modules/sample-data/tools.d.ts.map +1 -0
- package/dist/modules/sample-data/tools.js +22 -0
- package/dist/modules/sample-data/tools.js.map +1 -0
- 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/smtp-email/index.d.ts +1 -0
- package/dist/modules/smtp-email/index.d.ts.map +1 -1
- package/dist/modules/smtp-email/index.js +1 -0
- package/dist/modules/smtp-email/index.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 +20 -1
- 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 +4 -0
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +4 -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/0021_certain_maggott.sql +30 -0
- package/migrations/0022_stormy_manta.sql +1 -0
- package/migrations/0023_funny_maddog.sql +1 -0
- 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/0021_snapshot.json +5389 -0
- package/migrations/meta/0022_snapshot.json +5396 -0
- package/migrations/meta/0023_snapshot.json +5403 -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 +112 -0
- package/package.json +3 -2
- package/src/lib/consumerEmailDomains.ts +62 -0
- package/src/lib/email.ts +7 -0
- package/src/lib/emailContent.ts +91 -0
- package/src/lib/emailDomainAutoLink.ts +165 -0
- package/src/lib/ids.ts +13 -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 +37 -3
- package/src/modules/auth/preferences.ts +13 -1
- package/src/modules/auth/routes.ts +22 -0
- package/src/modules/auth/schema.ts +12 -2
- package/src/modules/auth/service.ts +37 -3
- package/src/modules/companies/index.ts +3 -1
- package/src/modules/companies/repository.ts +3 -0
- package/src/modules/companies/routes.ts +20 -0
- package/src/modules/companies/schema.ts +11 -1
- package/src/modules/companies/service.ts +72 -12
- 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 +21 -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/email-domain-linker/index.ts +40 -0
- package/src/modules/email-domain-linker/routes.ts +40 -0
- package/src/modules/email-domain-linker/service.ts +122 -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 +4 -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/events.ts +41 -0
- package/src/modules/lists/index.ts +41 -0
- package/src/modules/lists/repository.ts +343 -0
- package/src/modules/lists/routes.ts +255 -0
- package/src/modules/lists/schema.ts +95 -0
- package/src/modules/lists/service.ts +505 -0
- package/src/modules/lists/tools.ts +128 -0
- 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 +31 -0
- package/src/modules/people/routes.ts +127 -18
- package/src/modules/people/schema.ts +109 -3
- package/src/modules/people/service.ts +205 -39
- package/src/modules/people/tools.ts +5 -1
- package/src/modules/personLinks.ts +278 -0
- package/src/modules/positions/routes.ts +4 -2
- 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 +690 -0
- package/src/modules/sample-data/index.ts +51 -0
- package/src/modules/sample-data/routes.ts +50 -0
- package/src/modules/sample-data/service.ts +679 -0
- package/src/modules/sample-data/tools.ts +32 -0
- 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/smtp-email/index.ts +8 -1
- 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 +27 -1
- package/src/modules/workspace/starters.ts +5 -0
- package/src/runtime/events.ts +1 -0
- package/src/schema/index.ts +4 -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,40 @@
|
|
|
1
|
+
import type { KelpieModule } from '../../runtime/module.ts'
|
|
2
|
+
import { createActivityRecorder } from '../activities/index.ts'
|
|
3
|
+
import { mountEmailDomainLinkerRoutes } from './routes.ts'
|
|
4
|
+
import { createEmailDomainLinkerService } from './service.ts'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Rebuild every email-domain link across the workspace.
|
|
8
|
+
*
|
|
9
|
+
* Owns no tables. Requires the modules whose data the sweep reads and writes.
|
|
10
|
+
* The sweep is the same one the companies service runs on a domain change,
|
|
11
|
+
* applied to every workspace Company at once — used to backfill links for
|
|
12
|
+
* data that predates the auto-linker, or after a bulk import.
|
|
13
|
+
*/
|
|
14
|
+
export function createEmailDomainLinkerModule(): KelpieModule {
|
|
15
|
+
return {
|
|
16
|
+
id: 'email-domain-linker',
|
|
17
|
+
requires: ['workspace', 'companies', 'people', 'positions', 'activities'],
|
|
18
|
+
|
|
19
|
+
register(context) {
|
|
20
|
+
const service = createEmailDomainLinkerService({
|
|
21
|
+
db: context.db,
|
|
22
|
+
transaction: context.transaction,
|
|
23
|
+
createId: context.createId,
|
|
24
|
+
now: context.now,
|
|
25
|
+
recordActivity: createActivityRecorder({
|
|
26
|
+
createId: context.createId,
|
|
27
|
+
now: context.now,
|
|
28
|
+
}),
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
context.routes((router) => {
|
|
32
|
+
mountEmailDomainLinkerRoutes(router, { db: context.db, now: context.now, service })
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
return Promise.resolve()
|
|
36
|
+
},
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type { EmailDomainLinkerService, RelinkCounts } from './service.ts'
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Context, Hono } from 'hono'
|
|
2
|
+
|
|
3
|
+
import type { Actor } from '../auth/actor.ts'
|
|
4
|
+
import { resolveActorFrom } from '../auth/credentials.ts'
|
|
5
|
+
import type { CredentialDependencies } from '../auth/credentials.ts'
|
|
6
|
+
import type { EmailDomainLinkerService, RelinkCounts } from './service.ts'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Wire shape for `POST /v1/workspaces/:id/relink-email-domains`.
|
|
10
|
+
*
|
|
11
|
+
* No request body. The response counts what the sweep did.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export interface EmailDomainLinkerRoutesDependencies extends CredentialDependencies {
|
|
15
|
+
readonly service: EmailDomainLinkerService
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function relinkResponse(counts: RelinkCounts): Record<string, unknown> {
|
|
19
|
+
return {
|
|
20
|
+
companies_scanned: counts.companiesScanned,
|
|
21
|
+
positions_created: counts.positionsCreated,
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function mountEmailDomainLinkerRoutes(
|
|
26
|
+
router: Hono,
|
|
27
|
+
dependencies: EmailDomainLinkerRoutesDependencies,
|
|
28
|
+
): void {
|
|
29
|
+
const requireActor = (context: Context): Promise<Actor> =>
|
|
30
|
+
resolveActorFrom(dependencies, context)
|
|
31
|
+
|
|
32
|
+
router.post('/workspaces/:id/relink-email-domains', async (context) => {
|
|
33
|
+
const counts = await dependencies.service.relink(
|
|
34
|
+
await requireActor(context),
|
|
35
|
+
context.req.param('id'),
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
return context.json(relinkResponse(counts))
|
|
39
|
+
})
|
|
40
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { and, eq, isNotNull } from 'drizzle-orm'
|
|
2
|
+
|
|
3
|
+
import { toEventActor } from '../../lib/actor.ts'
|
|
4
|
+
import type { Database } from '../../lib/database.ts'
|
|
5
|
+
import { autoLinkCompanyByDomain } from '../../lib/emailDomainAutoLink.ts'
|
|
6
|
+
import { AppError } from '../../lib/errors.ts'
|
|
7
|
+
import type { IdFactory } from '../../lib/ids.ts'
|
|
8
|
+
import type { TransactionScope } from '../../runtime/transaction.ts'
|
|
9
|
+
import type { ActivityRecorder } from '../activities/recorder.ts'
|
|
10
|
+
import type { Actor } from '../auth/actor.ts'
|
|
11
|
+
import { requireWorkspaceId } from '../auth/actor.ts'
|
|
12
|
+
import * as authRepository from '../auth/repository.ts'
|
|
13
|
+
import { companies } from '../companies/schema.ts'
|
|
14
|
+
import { parseMemberRole, roleAllows } from '../workspace/roles.ts'
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Rebuild every email-domain link across the workspace.
|
|
18
|
+
*
|
|
19
|
+
* Iterates each Company that carries a domain and runs the same sweep the
|
|
20
|
+
* companies service runs on a domain change — every workspace Person whose
|
|
21
|
+
* email is at that domain gets a titleless Position where none exists yet.
|
|
22
|
+
*
|
|
23
|
+
* Idempotent: a follow-up run adds nothing. Add-only, consumer-host-skipping,
|
|
24
|
+
* and workspace-scoped, same as the inline auto-linker.
|
|
25
|
+
*
|
|
26
|
+
* One transaction per Company, not one for the whole sweep. A workspace can
|
|
27
|
+
* carry thousands of Companies, and a single transaction that long would
|
|
28
|
+
* hold row-share locks against every write elsewhere for the whole run.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
export interface EmailDomainLinkerDependencies {
|
|
32
|
+
readonly db: Database
|
|
33
|
+
readonly transaction: TransactionScope
|
|
34
|
+
readonly createId: IdFactory
|
|
35
|
+
readonly now: () => Date
|
|
36
|
+
readonly recordActivity: ActivityRecorder
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface RelinkCounts {
|
|
40
|
+
/** Companies with a non-null domain that were considered. Consumer hosts are counted but skipped. */
|
|
41
|
+
readonly companiesScanned: number
|
|
42
|
+
/** New Positions the sweep inserted this run. */
|
|
43
|
+
readonly positionsCreated: number
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface EmailDomainLinkerService {
|
|
47
|
+
relink(actor: Actor, workspaceId: string): Promise<RelinkCounts>
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function createEmailDomainLinkerService(
|
|
51
|
+
dependencies: EmailDomainLinkerDependencies,
|
|
52
|
+
): EmailDomainLinkerService {
|
|
53
|
+
async function requireAdmin(actor: Actor, workspaceId: string): Promise<void> {
|
|
54
|
+
if (actor.workspaceId !== workspaceId) {
|
|
55
|
+
throw AppError.notFound('Workspace not found')
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (actor.kind === 'api_key' && actor.userId === null) {
|
|
59
|
+
if (!roleAllows(actor.role, 'admin')) {
|
|
60
|
+
throw new AppError('forbidden', 'This action needs the admin role')
|
|
61
|
+
}
|
|
62
|
+
return
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const userId = actor.userId
|
|
66
|
+
|
|
67
|
+
if (userId === null) {
|
|
68
|
+
throw AppError.notFound('Workspace not found')
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const membership = await authRepository.findMembership(dependencies.db, workspaceId, userId)
|
|
72
|
+
|
|
73
|
+
if (membership === undefined) {
|
|
74
|
+
throw AppError.notFound('Workspace not found')
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const role = parseMemberRole(membership.role)
|
|
78
|
+
|
|
79
|
+
if (role === undefined) {
|
|
80
|
+
throw new Error(`workspace_members.role holds "${membership.role}", which its check forbids`)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (!roleAllows(role, 'admin')) {
|
|
84
|
+
throw new AppError('forbidden', 'This action needs the admin role')
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
async relink(actor, workspaceId) {
|
|
90
|
+
requireWorkspaceId(actor)
|
|
91
|
+
await requireAdmin(actor, workspaceId)
|
|
92
|
+
|
|
93
|
+
// Every workspace Company that carries a domain — the ones the sweep
|
|
94
|
+
// can match against. Pooled read outside the per-company transactions:
|
|
95
|
+
// the work-list is one query, each write opens its own scope.
|
|
96
|
+
const rows = await dependencies.db
|
|
97
|
+
.select()
|
|
98
|
+
.from(companies)
|
|
99
|
+
.where(and(eq(companies.workspaceId, workspaceId), isNotNull(companies.domain)))
|
|
100
|
+
|
|
101
|
+
let created = 0
|
|
102
|
+
|
|
103
|
+
// One transaction per Company, not one for the whole sweep. A workspace
|
|
104
|
+
// can carry thousands of Companies; a single transaction that long would
|
|
105
|
+
// hold row-share locks against every write elsewhere for the whole run.
|
|
106
|
+
for (const company of rows) {
|
|
107
|
+
const inserted = await dependencies.transaction(
|
|
108
|
+
async ({ tx, events }) =>
|
|
109
|
+
autoLinkCompanyByDomain(tx, events, workspaceId, company, {
|
|
110
|
+
createId: dependencies.createId,
|
|
111
|
+
now: dependencies.now,
|
|
112
|
+
recordActivity: dependencies.recordActivity,
|
|
113
|
+
}),
|
|
114
|
+
{ workspaceId, actor: toEventActor(actor) },
|
|
115
|
+
)
|
|
116
|
+
created += inserted.length
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return { companiesScanned: rows.length, positionsCreated: created }
|
|
120
|
+
},
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -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
|
+
}
|