@elevasis/core 0.22.0 → 0.24.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 +3214 -2501
- package/dist/index.js +3112 -1222
- package/dist/knowledge/index.d.ts +1108 -1264
- package/dist/knowledge/index.js +112 -9
- package/dist/organization-model/index.d.ts +3214 -2501
- package/dist/organization-model/index.js +3112 -1222
- package/dist/test-utils/index.d.ts +985 -1103
- package/dist/test-utils/index.js +2464 -1165
- package/package.json +5 -5
- package/src/README.md +14 -14
- package/src/__tests__/publish.test.ts +24 -24
- package/src/__tests__/template-core-compatibility.test.ts +9 -80
- package/src/_gen/__tests__/__snapshots__/contracts.md.snap +2389 -2121
- package/src/_gen/__tests__/scaffold-contracts.test.ts +30 -30
- package/src/auth/multi-tenancy/credentials/__tests__/encryption.test.ts +217 -217
- package/src/auth/multi-tenancy/credentials/server/encryption.ts +69 -69
- package/src/auth/multi-tenancy/credentials/server/kek-loader.ts +37 -37
- package/src/auth/multi-tenancy/index.ts +26 -26
- package/src/auth/multi-tenancy/invitations/api-schemas.ts +104 -104
- package/src/auth/multi-tenancy/memberships/api-schemas.ts +143 -143
- package/src/auth/multi-tenancy/memberships/index.ts +26 -26
- package/src/auth/multi-tenancy/memberships/membership.ts +130 -130
- package/src/auth/multi-tenancy/organizations/__tests__/api-schemas.test.ts +194 -194
- package/src/auth/multi-tenancy/organizations/api-schemas.ts +136 -136
- package/src/auth/multi-tenancy/permissions.test.ts +42 -42
- package/src/auth/multi-tenancy/permissions.ts +123 -123
- package/src/auth/multi-tenancy/role-management/api-schemas.ts +78 -78
- package/src/auth/multi-tenancy/role-management/index.ts +16 -16
- package/src/auth/multi-tenancy/theme-presets.ts +45 -45
- package/src/auth/multi-tenancy/types.ts +57 -57
- package/src/auth/multi-tenancy/users/api-schemas.ts +165 -165
- package/src/business/README.md +2 -2
- package/src/business/acquisition/activity-events.test.ts +250 -250
- package/src/business/acquisition/activity-events.ts +93 -93
- package/src/business/acquisition/api-schemas.test.ts +1883 -1843
- package/src/business/acquisition/api-schemas.ts +1493 -1500
- package/src/business/acquisition/build-templates.test.ts +240 -240
- package/src/business/acquisition/build-templates.ts +83 -41
- package/src/business/acquisition/crm-next-action.test.ts +262 -262
- package/src/business/acquisition/crm-next-action.ts +220 -220
- package/src/business/acquisition/crm-priority.test.ts +216 -216
- package/src/business/acquisition/crm-priority.ts +349 -349
- package/src/business/acquisition/crm-state-actions.test.ts +153 -151
- package/src/business/acquisition/deal-ownership.test.ts +351 -351
- package/src/business/acquisition/deal-ownership.ts +120 -120
- package/src/business/acquisition/derive-actions.test.ts +129 -104
- package/src/business/acquisition/derive-actions.ts +74 -84
- package/src/business/acquisition/index.ts +171 -170
- package/src/business/acquisition/ontology-validation.ts +309 -0
- package/src/business/acquisition/stateful.ts +30 -30
- package/src/business/acquisition/types.ts +396 -392
- package/src/business/clients/api-schemas.test.ts +115 -115
- package/src/business/clients/api-schemas.ts +158 -158
- package/src/business/clients/index.ts +1 -1
- package/src/business/crm/api-schemas.ts +40 -40
- package/src/business/crm/index.ts +1 -1
- package/src/business/deals/api-schemas.ts +87 -87
- package/src/business/deals/index.ts +1 -1
- package/src/business/index.ts +5 -5
- package/src/business/projects/types.ts +144 -144
- package/src/commands/queue/types/task.ts +15 -15
- package/src/execution/core/runner-types.ts +61 -61
- package/src/execution/core/sse-executions.ts +7 -7
- package/src/execution/engine/__tests__/fixtures/test-agents.ts +10 -10
- package/src/execution/engine/agent/core/__tests__/agent.test.ts +16 -16
- package/src/execution/engine/agent/core/__tests__/error-passthrough.test.ts +4 -4
- package/src/execution/engine/agent/core/types.ts +25 -25
- package/src/execution/engine/agent/index.ts +6 -6
- package/src/execution/engine/agent/reasoning/__tests__/request-builder.test.ts +24 -24
- package/src/execution/engine/index.ts +443 -443
- package/src/execution/engine/tools/integration/server/adapters/apify/__tests__/apify-run-actor.integration.test.ts +298 -298
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.test.ts +55 -55
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +107 -107
- package/src/execution/engine/tools/integration/server/adapters/apollo/apollo-adapter.test.ts +48 -48
- package/src/execution/engine/tools/integration/server/adapters/apollo/apollo-adapter.ts +99 -99
- package/src/execution/engine/tools/integration/server/adapters/apollo/index.ts +1 -1
- package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +363 -363
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.test.ts +162 -162
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.test.ts +316 -316
- package/src/execution/engine/tools/integration/server/adapters/clickup/clickup-adapter.test.ts +18 -18
- package/src/execution/engine/tools/integration/server/adapters/clickup/clickup-adapter.ts +194 -194
- package/src/execution/engine/tools/integration/server/adapters/clickup/index.ts +7 -7
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +204 -204
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-tools.ts +105 -105
- package/src/execution/engine/tools/integration/server/adapters/google-calendar/google-calendar-adapter.ts +428 -428
- package/src/execution/engine/tools/integration/server/adapters/google-calendar/index.ts +2 -2
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/__tests__/google-sheets.integration.test.ts +261 -261
- package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-tools.ts +1474 -1474
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-tools.ts +103 -103
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.test.ts +88 -88
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +141 -141
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +76 -76
- package/src/execution/engine/tools/integration/server/adapters/signature-api/signature-api-tools.ts +182 -182
- package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-tools.ts +310 -310
- package/src/execution/engine/tools/integration/service.test.ts +239 -239
- package/src/execution/engine/tools/integration/service.ts +172 -172
- package/src/execution/engine/tools/integration/tool.ts +255 -255
- package/src/execution/engine/tools/lead-service-types.ts +1005 -1005
- package/src/execution/engine/tools/messages.ts +43 -43
- package/src/execution/engine/tools/platform/acquisition/company-tools.ts +7 -7
- package/src/execution/engine/tools/platform/acquisition/contact-tools.ts +6 -6
- package/src/execution/engine/tools/platform/acquisition/list-tools.ts +6 -6
- package/src/execution/engine/tools/platform/acquisition/types.ts +280 -280
- package/src/execution/engine/tools/platform/email/types.ts +97 -97
- package/src/execution/engine/tools/registry.ts +704 -704
- package/src/execution/engine/tools/tool-maps.ts +831 -831
- package/src/execution/engine/tools/types.ts +234 -234
- package/src/execution/engine/workflow/types.ts +202 -202
- package/src/execution/external/__tests__/api-schemas.test.ts +127 -127
- package/src/execution/external/api-schemas.ts +40 -40
- package/src/execution/external/index.ts +1 -1
- package/src/index.ts +18 -18
- package/src/integrations/credentials/__tests__/api-schemas.test.ts +420 -420
- package/src/integrations/credentials/api-schemas.ts +146 -146
- package/src/integrations/credentials/schemas.ts +200 -200
- package/src/integrations/oauth/__tests__/provider-registry.test.ts +7 -7
- package/src/integrations/oauth/provider-registry.ts +74 -74
- package/src/integrations/oauth/server/credentials.ts +43 -43
- package/src/integrations/webhook-endpoints/__tests__/api-schemas.test.ts +327 -327
- package/src/integrations/webhook-endpoints/api-schemas.ts +103 -103
- package/src/integrations/webhook-endpoints/types.ts +58 -58
- package/src/knowledge/README.md +33 -32
- package/src/knowledge/__tests__/queries.test.ts +633 -541
- package/src/knowledge/format.ts +100 -99
- package/src/knowledge/index.ts +5 -5
- package/src/knowledge/published.ts +5 -5
- package/src/knowledge/queries.ts +274 -222
- package/src/operations/activities/api-schemas.ts +80 -80
- package/src/operations/activities/types.ts +64 -64
- package/src/organization-model/README.md +149 -109
- package/src/organization-model/__tests__/content-kinds-registry.test.ts +210 -0
- package/src/organization-model/__tests__/defaults.test.ts +168 -194
- package/src/organization-model/__tests__/domains/actions.test.ts +78 -0
- package/src/organization-model/__tests__/domains/customers.test.ts +48 -44
- package/src/organization-model/__tests__/domains/entities.test.ts +56 -0
- package/src/organization-model/__tests__/domains/goals.test.ts +110 -96
- package/src/organization-model/__tests__/domains/identity.test.ts +4 -3
- package/src/organization-model/__tests__/domains/navigation.test.ts +222 -166
- package/src/organization-model/__tests__/domains/offerings.test.ts +83 -88
- package/src/organization-model/__tests__/domains/policies.test.ts +323 -0
- package/src/organization-model/__tests__/domains/resource-mappings.test.ts +30 -30
- package/src/organization-model/__tests__/domains/resources.test.ts +396 -175
- package/src/organization-model/__tests__/domains/roles.test.ts +463 -402
- package/src/organization-model/__tests__/domains/statuses.test.ts +13 -10
- package/src/organization-model/__tests__/domains/systems.test.ts +209 -193
- package/src/organization-model/__tests__/flatten-additive-merge.test.ts +362 -0
- package/src/organization-model/__tests__/foundation.test.ts +47 -75
- package/src/organization-model/__tests__/get-resources-for-system.test.ts +144 -0
- package/src/organization-model/__tests__/graph.test.ts +1336 -149
- package/src/organization-model/__tests__/icons.test.ts +10 -1
- package/src/organization-model/__tests__/knowledge.test.ts +418 -61
- package/src/organization-model/__tests__/lookup-helpers.test.ts +438 -0
- package/src/organization-model/__tests__/migration-helpers.test.ts +591 -0
- package/src/organization-model/__tests__/prospecting-ssot.test.ts +103 -94
- package/src/organization-model/__tests__/recursive-system-schema.test.ts +549 -0
- package/src/organization-model/__tests__/resolve.test.ts +303 -42
- package/src/organization-model/__tests__/schema.test.ts +863 -153
- package/src/organization-model/__tests__/surface-projection.test.ts +284 -174
- package/src/organization-model/catalogs/lead-gen.ts +144 -0
- package/src/organization-model/content-kinds/config.ts +36 -0
- package/src/organization-model/content-kinds/index.ts +78 -0
- package/src/organization-model/content-kinds/pipeline.ts +68 -0
- package/src/organization-model/content-kinds/registry.ts +44 -0
- package/src/organization-model/content-kinds/status.ts +71 -0
- package/src/organization-model/content-kinds/template.ts +83 -0
- package/src/organization-model/content-kinds/types.ts +117 -0
- package/src/organization-model/contracts.ts +27 -17
- package/src/organization-model/defaults.ts +489 -107
- package/src/organization-model/domains/actions.ts +333 -0
- package/src/organization-model/domains/customers.ts +10 -7
- package/src/organization-model/domains/entities.ts +144 -0
- package/src/organization-model/domains/goals.ts +9 -6
- package/src/organization-model/domains/knowledge.ts +128 -54
- package/src/organization-model/domains/navigation.ts +139 -416
- package/src/organization-model/domains/offerings.ts +15 -10
- package/src/organization-model/domains/policies.ts +102 -0
- package/src/organization-model/domains/projects.ts +6 -40
- package/src/organization-model/domains/prospecting.ts +395 -514
- package/src/organization-model/domains/resources.ts +173 -81
- package/src/organization-model/domains/roles.ts +96 -93
- package/src/organization-model/domains/sales.test.ts +218 -218
- package/src/organization-model/domains/sales.ts +380 -589
- package/src/organization-model/domains/shared.ts +8 -8
- package/src/organization-model/domains/statuses.ts +298 -89
- package/src/organization-model/domains/systems.ts +240 -38
- package/src/organization-model/foundation.ts +35 -48
- package/src/organization-model/graph/build.ts +1035 -279
- package/src/organization-model/graph/index.ts +4 -4
- package/src/organization-model/graph/link.ts +10 -10
- package/src/organization-model/graph/schema.ts +77 -56
- package/src/organization-model/graph/types.ts +75 -56
- package/src/organization-model/helpers.ts +312 -59
- package/src/organization-model/icons.ts +78 -66
- package/src/organization-model/index.ts +129 -16
- package/src/organization-model/migration-helpers.ts +252 -0
- package/src/organization-model/ontology.ts +661 -0
- package/src/organization-model/organization-graph.mdx +110 -89
- package/src/organization-model/organization-model.mdx +226 -171
- package/src/organization-model/published.ts +295 -139
- package/src/organization-model/resolve.ts +139 -21
- package/src/organization-model/schema.ts +841 -301
- package/src/organization-model/surface-projection.ts +212 -218
- package/src/organization-model/types.ts +181 -90
- package/src/platform/api/types.ts +38 -38
- package/src/platform/constants/versions.ts +3 -3
- package/src/platform/index.ts +23 -23
- package/src/platform/registry/__tests__/command-view.test.ts +5 -7
- package/src/platform/registry/__tests__/resource-link.test.ts +35 -30
- package/src/platform/registry/__tests__/resource-registry.integration.test.ts +17 -32
- package/src/platform/registry/__tests__/resource-registry.nested-systems.test.ts +245 -0
- package/src/platform/registry/__tests__/resource-registry.test.ts +2053 -2051
- package/src/platform/registry/__tests__/validation.test.ts +1347 -1343
- package/src/platform/registry/command-view.ts +10 -10
- package/src/platform/registry/index.ts +103 -103
- package/src/platform/registry/resource-link.ts +32 -32
- package/src/platform/registry/resource-registry.ts +890 -878
- package/src/platform/registry/serialization.ts +295 -295
- package/src/platform/registry/serialized-types.ts +166 -166
- package/src/platform/registry/stats-types.ts +68 -68
- package/src/platform/registry/types.ts +425 -425
- package/src/platform/registry/validation.ts +745 -743
- package/src/platform/utils/__tests__/validation.test.ts +1084 -1084
- package/src/platform/utils/validation.ts +425 -425
- package/src/projects/api-schemas.test.ts +39 -39
- package/src/projects/api-schemas.ts +291 -291
- package/src/reference/_generated/contracts.md +2389 -2121
- package/src/reference/glossary.md +76 -76
- package/src/scaffold-registry/__tests__/index.test.ts +206 -206
- package/src/scaffold-registry/__tests__/schema.test.ts +166 -166
- package/src/scaffold-registry/index.ts +392 -392
- package/src/scaffold-registry/schema.ts +243 -243
- package/src/server.ts +289 -289
- package/src/supabase/database.types.ts +3153 -3093
- package/src/test-utils/README.md +37 -37
- package/src/test-utils/entities.ts +108 -108
- package/src/test-utils/fixtures/memberships.ts +82 -82
- package/src/test-utils/index.ts +12 -12
- package/src/test-utils/organization-model.ts +65 -65
- package/src/test-utils/published.ts +6 -6
- package/src/test-utils/rls/RLSTestContext.ts +588 -588
- package/src/test-utils/test-utils.test.ts +44 -49
- package/src/organization-model/__tests__/domains/operations.test.ts +0 -203
- package/src/organization-model/domains/features.ts +0 -31
- package/src/organization-model/domains/operations.ts +0 -85
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
import { getSupabaseClient } from '../../../../supabase/server/client'
|
|
2
|
-
import { setKek, CURRENT_KEY_ID } from './encryption'
|
|
3
|
-
|
|
4
|
-
let loaded = false
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Loads the platform credential KEK from Supabase Vault and registers it under
|
|
8
|
-
* `CURRENT_KEY_ID` ('platform-v1').
|
|
9
|
-
*
|
|
10
|
-
* Idempotent: subsequent calls are no-ops.
|
|
11
|
-
*
|
|
12
|
-
* Fails fast on missing / malformed Vault KEK so misconfigured deploys do not
|
|
13
|
-
* silently start without a usable encryption key.
|
|
14
|
-
*/
|
|
15
|
-
export async function loadCredentialKEKs(): Promise<void> {
|
|
16
|
-
if (loaded) return
|
|
17
|
-
|
|
18
|
-
const supabase = await getSupabaseClient()
|
|
19
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- RPC isn't in generated types yet (run `supabase gen types` post-merge)
|
|
20
|
-
const { data, error } = await (supabase.rpc as any)('get_platform_credential_kek')
|
|
21
|
-
if (error) {
|
|
22
|
-
throw new Error(
|
|
23
|
-
`Failed to load platform credential KEK from Vault: ${error.message}. ` +
|
|
24
|
-
`Did you run provision-credential-kek.sql against this environment?`
|
|
25
|
-
)
|
|
26
|
-
}
|
|
27
|
-
if (typeof data !== 'string' || data.length === 0) {
|
|
28
|
-
throw new Error('Vault returned null/empty platform credential KEK')
|
|
29
|
-
}
|
|
30
|
-
const vaultKek = Buffer.from(data, 'hex')
|
|
31
|
-
if (vaultKek.length !== 32) {
|
|
32
|
-
throw new Error(`Vault KEK is ${vaultKek.length} bytes, expected 32`)
|
|
33
|
-
}
|
|
34
|
-
setKek(CURRENT_KEY_ID, vaultKek)
|
|
35
|
-
|
|
36
|
-
loaded = true
|
|
37
|
-
}
|
|
1
|
+
import { getSupabaseClient } from '../../../../supabase/server/client'
|
|
2
|
+
import { setKek, CURRENT_KEY_ID } from './encryption'
|
|
3
|
+
|
|
4
|
+
let loaded = false
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Loads the platform credential KEK from Supabase Vault and registers it under
|
|
8
|
+
* `CURRENT_KEY_ID` ('platform-v1').
|
|
9
|
+
*
|
|
10
|
+
* Idempotent: subsequent calls are no-ops.
|
|
11
|
+
*
|
|
12
|
+
* Fails fast on missing / malformed Vault KEK so misconfigured deploys do not
|
|
13
|
+
* silently start without a usable encryption key.
|
|
14
|
+
*/
|
|
15
|
+
export async function loadCredentialKEKs(): Promise<void> {
|
|
16
|
+
if (loaded) return
|
|
17
|
+
|
|
18
|
+
const supabase = await getSupabaseClient()
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- RPC isn't in generated types yet (run `supabase gen types` post-merge)
|
|
20
|
+
const { data, error } = await (supabase.rpc as any)('get_platform_credential_kek')
|
|
21
|
+
if (error) {
|
|
22
|
+
throw new Error(
|
|
23
|
+
`Failed to load platform credential KEK from Vault: ${error.message}. ` +
|
|
24
|
+
`Did you run provision-credential-kek.sql against this environment?`
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
if (typeof data !== 'string' || data.length === 0) {
|
|
28
|
+
throw new Error('Vault returned null/empty platform credential KEK')
|
|
29
|
+
}
|
|
30
|
+
const vaultKek = Buffer.from(data, 'hex')
|
|
31
|
+
if (vaultKek.length !== 32) {
|
|
32
|
+
throw new Error(`Vault KEK is ${vaultKek.length} bytes, expected 32`)
|
|
33
|
+
}
|
|
34
|
+
setKek(CURRENT_KEY_ID, vaultKek)
|
|
35
|
+
|
|
36
|
+
loaded = true
|
|
37
|
+
}
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
// Theme preset SSOT (const tuple + derived union + Zod enum)
|
|
2
|
-
export * from './theme-presets'
|
|
3
|
-
|
|
4
|
-
// Config types
|
|
5
|
-
export * from './types'
|
|
6
|
-
|
|
7
|
-
// Permission catalog (canonical PERMISSIONS constant + types)
|
|
8
|
-
export * from './permissions'
|
|
9
|
-
|
|
10
|
-
// Role management schemas
|
|
11
|
-
export * from './role-management/index'
|
|
12
|
-
|
|
13
|
-
// Organization types
|
|
14
|
-
export * from './organizations/index'
|
|
15
|
-
|
|
16
|
-
// User types
|
|
17
|
-
export * from './users/index'
|
|
18
|
-
|
|
19
|
-
// Membership types
|
|
20
|
-
export * from './memberships/index'
|
|
21
|
-
|
|
22
|
-
// Invitation types
|
|
23
|
-
export * from './invitations/index'
|
|
24
|
-
|
|
25
|
-
// Credentials types
|
|
26
|
-
export * from './credentials/index'
|
|
1
|
+
// Theme preset SSOT (const tuple + derived union + Zod enum)
|
|
2
|
+
export * from './theme-presets'
|
|
3
|
+
|
|
4
|
+
// Config types
|
|
5
|
+
export * from './types'
|
|
6
|
+
|
|
7
|
+
// Permission catalog (canonical PERMISSIONS constant + types)
|
|
8
|
+
export * from './permissions'
|
|
9
|
+
|
|
10
|
+
// Role management schemas
|
|
11
|
+
export * from './role-management/index'
|
|
12
|
+
|
|
13
|
+
// Organization types
|
|
14
|
+
export * from './organizations/index'
|
|
15
|
+
|
|
16
|
+
// User types
|
|
17
|
+
export * from './users/index'
|
|
18
|
+
|
|
19
|
+
// Membership types
|
|
20
|
+
export * from './memberships/index'
|
|
21
|
+
|
|
22
|
+
// Invitation types
|
|
23
|
+
export * from './invitations/index'
|
|
24
|
+
|
|
25
|
+
// Credentials types
|
|
26
|
+
export * from './credentials/index'
|
|
@@ -1,104 +1,104 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Invitations Domain - Zod Validation Schemas
|
|
3
|
-
*
|
|
4
|
-
* Validation schemas for invitation management endpoints.
|
|
5
|
-
* Includes request bodies, query params, and path params.
|
|
6
|
-
*
|
|
7
|
-
* Security:
|
|
8
|
-
* - All schemas use .strict() to prevent mass assignment attacks
|
|
9
|
-
* - Email validation prevents header injection
|
|
10
|
-
* - Role enum validation prevents privilege escalation
|
|
11
|
-
* - organizationId from JWT (not accepted in body for protected routes)
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { z } from 'zod'
|
|
15
|
-
import { EmailSchema } from '../../../platform/utils/validation'
|
|
16
|
-
import { MembershipRoleSchema } from '../memberships/api-schemas'
|
|
17
|
-
|
|
18
|
-
// ============================================================================
|
|
19
|
-
// Path Parameters
|
|
20
|
-
// ============================================================================
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Validate invitation ID in URL path
|
|
24
|
-
* Used by: GET/DELETE /invitations/:id
|
|
25
|
-
*/
|
|
26
|
-
export const InvitationIdParamSchema = z
|
|
27
|
-
.object({
|
|
28
|
-
id: z.string().min(1) // WorkOS invitation IDs
|
|
29
|
-
})
|
|
30
|
-
.strict()
|
|
31
|
-
|
|
32
|
-
// ============================================================================
|
|
33
|
-
// Request Bodies
|
|
34
|
-
// ============================================================================
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Send new invitation
|
|
38
|
-
* POST /invitations
|
|
39
|
-
*
|
|
40
|
-
* Security:
|
|
41
|
-
* - Email format validated (prevents header injection)
|
|
42
|
-
* - roleSlug validated as non-empty slug; service layer checks against org_rol_definitions
|
|
43
|
-
* - expiresInDays bounded (1-90 days)
|
|
44
|
-
* - organizationId NOT in body (from JWT via requireOrganization middleware)
|
|
45
|
-
*/
|
|
46
|
-
export const SendInvitationSchema = z
|
|
47
|
-
.object({
|
|
48
|
-
email: EmailSchema,
|
|
49
|
-
organizationId: z.string().optional(), // For WorkOS API - but typically from JWT
|
|
50
|
-
roleSlug: MembershipRoleSchema.default('member'),
|
|
51
|
-
expiresInDays: z.number().int().min(1).max(90).default(7)
|
|
52
|
-
})
|
|
53
|
-
.strict()
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Accept invitation by token
|
|
57
|
-
* POST /invitations/accept
|
|
58
|
-
*
|
|
59
|
-
* Security:
|
|
60
|
-
* - Token validated (non-empty string)
|
|
61
|
-
*/
|
|
62
|
-
export const AcceptInvitationSchema = z
|
|
63
|
-
.object({
|
|
64
|
-
invitation_token: z.string().min(1, 'Invitation token is required')
|
|
65
|
-
})
|
|
66
|
-
.strict()
|
|
67
|
-
|
|
68
|
-
// ============================================================================
|
|
69
|
-
// Query Parameters
|
|
70
|
-
// ============================================================================
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* List invitations with filters
|
|
74
|
-
* GET /invitations
|
|
75
|
-
*
|
|
76
|
-
* Filters:
|
|
77
|
-
* - organizationId: Filter by organization
|
|
78
|
-
* - email: Filter by email
|
|
79
|
-
*
|
|
80
|
-
* Security:
|
|
81
|
-
* - Requires organizationId or userId filter
|
|
82
|
-
* - Email validated
|
|
83
|
-
*/
|
|
84
|
-
export const ListInvitationsQuerySchema = z
|
|
85
|
-
.object({
|
|
86
|
-
organizationId: z.string().optional(),
|
|
87
|
-
userId: z.string().optional(),
|
|
88
|
-
email: EmailSchema.optional(),
|
|
89
|
-
limit: z.coerce.number().int().min(1).max(100).optional(),
|
|
90
|
-
before: z.string().optional(), // WorkOS pagination cursor
|
|
91
|
-
after: z.string().optional() // WorkOS pagination cursor
|
|
92
|
-
})
|
|
93
|
-
.strict()
|
|
94
|
-
.refine((data) => data.organizationId || data.userId, { message: 'Either organizationId or userId must be provided' })
|
|
95
|
-
|
|
96
|
-
// ============================================================================
|
|
97
|
-
// TypeScript Type Exports
|
|
98
|
-
// ============================================================================
|
|
99
|
-
|
|
100
|
-
// Export inferred types for use in route handlers
|
|
101
|
-
export type SendInvitationInput = z.infer<typeof SendInvitationSchema>
|
|
102
|
-
export type AcceptInvitationInput = z.infer<typeof AcceptInvitationSchema>
|
|
103
|
-
export type ListInvitationsQuery = z.infer<typeof ListInvitationsQuerySchema>
|
|
104
|
-
export type InvitationIdParam = z.infer<typeof InvitationIdParamSchema>
|
|
1
|
+
/**
|
|
2
|
+
* Invitations Domain - Zod Validation Schemas
|
|
3
|
+
*
|
|
4
|
+
* Validation schemas for invitation management endpoints.
|
|
5
|
+
* Includes request bodies, query params, and path params.
|
|
6
|
+
*
|
|
7
|
+
* Security:
|
|
8
|
+
* - All schemas use .strict() to prevent mass assignment attacks
|
|
9
|
+
* - Email validation prevents header injection
|
|
10
|
+
* - Role enum validation prevents privilege escalation
|
|
11
|
+
* - organizationId from JWT (not accepted in body for protected routes)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { z } from 'zod'
|
|
15
|
+
import { EmailSchema } from '../../../platform/utils/validation'
|
|
16
|
+
import { MembershipRoleSchema } from '../memberships/api-schemas'
|
|
17
|
+
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Path Parameters
|
|
20
|
+
// ============================================================================
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Validate invitation ID in URL path
|
|
24
|
+
* Used by: GET/DELETE /invitations/:id
|
|
25
|
+
*/
|
|
26
|
+
export const InvitationIdParamSchema = z
|
|
27
|
+
.object({
|
|
28
|
+
id: z.string().min(1) // WorkOS invitation IDs
|
|
29
|
+
})
|
|
30
|
+
.strict()
|
|
31
|
+
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// Request Bodies
|
|
34
|
+
// ============================================================================
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Send new invitation
|
|
38
|
+
* POST /invitations
|
|
39
|
+
*
|
|
40
|
+
* Security:
|
|
41
|
+
* - Email format validated (prevents header injection)
|
|
42
|
+
* - roleSlug validated as non-empty slug; service layer checks against org_rol_definitions
|
|
43
|
+
* - expiresInDays bounded (1-90 days)
|
|
44
|
+
* - organizationId NOT in body (from JWT via requireOrganization middleware)
|
|
45
|
+
*/
|
|
46
|
+
export const SendInvitationSchema = z
|
|
47
|
+
.object({
|
|
48
|
+
email: EmailSchema,
|
|
49
|
+
organizationId: z.string().optional(), // For WorkOS API - but typically from JWT
|
|
50
|
+
roleSlug: MembershipRoleSchema.default('member'),
|
|
51
|
+
expiresInDays: z.number().int().min(1).max(90).default(7)
|
|
52
|
+
})
|
|
53
|
+
.strict()
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Accept invitation by token
|
|
57
|
+
* POST /invitations/accept
|
|
58
|
+
*
|
|
59
|
+
* Security:
|
|
60
|
+
* - Token validated (non-empty string)
|
|
61
|
+
*/
|
|
62
|
+
export const AcceptInvitationSchema = z
|
|
63
|
+
.object({
|
|
64
|
+
invitation_token: z.string().min(1, 'Invitation token is required')
|
|
65
|
+
})
|
|
66
|
+
.strict()
|
|
67
|
+
|
|
68
|
+
// ============================================================================
|
|
69
|
+
// Query Parameters
|
|
70
|
+
// ============================================================================
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* List invitations with filters
|
|
74
|
+
* GET /invitations
|
|
75
|
+
*
|
|
76
|
+
* Filters:
|
|
77
|
+
* - organizationId: Filter by organization
|
|
78
|
+
* - email: Filter by email
|
|
79
|
+
*
|
|
80
|
+
* Security:
|
|
81
|
+
* - Requires organizationId or userId filter
|
|
82
|
+
* - Email validated
|
|
83
|
+
*/
|
|
84
|
+
export const ListInvitationsQuerySchema = z
|
|
85
|
+
.object({
|
|
86
|
+
organizationId: z.string().optional(),
|
|
87
|
+
userId: z.string().optional(),
|
|
88
|
+
email: EmailSchema.optional(),
|
|
89
|
+
limit: z.coerce.number().int().min(1).max(100).optional(),
|
|
90
|
+
before: z.string().optional(), // WorkOS pagination cursor
|
|
91
|
+
after: z.string().optional() // WorkOS pagination cursor
|
|
92
|
+
})
|
|
93
|
+
.strict()
|
|
94
|
+
.refine((data) => data.organizationId || data.userId, { message: 'Either organizationId or userId must be provided' })
|
|
95
|
+
|
|
96
|
+
// ============================================================================
|
|
97
|
+
// TypeScript Type Exports
|
|
98
|
+
// ============================================================================
|
|
99
|
+
|
|
100
|
+
// Export inferred types for use in route handlers
|
|
101
|
+
export type SendInvitationInput = z.infer<typeof SendInvitationSchema>
|
|
102
|
+
export type AcceptInvitationInput = z.infer<typeof AcceptInvitationSchema>
|
|
103
|
+
export type ListInvitationsQuery = z.infer<typeof ListInvitationsQuerySchema>
|
|
104
|
+
export type InvitationIdParam = z.infer<typeof InvitationIdParamSchema>
|
|
@@ -1,143 +1,143 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memberships Domain - Zod Validation Schemas
|
|
3
|
-
*
|
|
4
|
-
* Validation schemas for membership management endpoints.
|
|
5
|
-
* Includes request bodies, query params, and path params.
|
|
6
|
-
*
|
|
7
|
-
* Security:
|
|
8
|
-
* - All schemas use .strict() to prevent mass assignment attacks
|
|
9
|
-
* - UUID validation prevents invalid references
|
|
10
|
-
* - Role enum validation prevents privilege escalation
|
|
11
|
-
* - organizationId never accepted in body (from JWT when needed)
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { z } from 'zod'
|
|
15
|
-
|
|
16
|
-
// ============================================================================
|
|
17
|
-
// Shared Schemas
|
|
18
|
-
// ============================================================================
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Membership role validation
|
|
22
|
-
* Accepts any non-empty role slug (max 64 chars).
|
|
23
|
-
*
|
|
24
|
-
* Roles are now DB-driven via `org_rol_definitions`. Runtime validation
|
|
25
|
-
* against valid slugs happens at the service layer, not here.
|
|
26
|
-
*/
|
|
27
|
-
export const MembershipRoleSchema = z.string().min(1).max(64)
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Membership status validation
|
|
31
|
-
* Note: Database constraint only allows 'active' | 'inactive'
|
|
32
|
-
*/
|
|
33
|
-
export const MembershipStatusSchema = z.enum(['active', 'inactive'])
|
|
34
|
-
|
|
35
|
-
// ============================================================================
|
|
36
|
-
// Path Parameters
|
|
37
|
-
// ============================================================================
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Validate membership ID in URL path
|
|
41
|
-
* Used by: GET/PUT/DELETE /memberships/:id
|
|
42
|
-
*/
|
|
43
|
-
export const MembershipIdParamSchema = z
|
|
44
|
-
.object({
|
|
45
|
-
id: z.string().min(1) // WorkOS membership IDs can be various formats
|
|
46
|
-
})
|
|
47
|
-
.strict()
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Validate organization ID (Supabase UUID) in URL path
|
|
51
|
-
* Used by: GET /memberships/my-permissions/:orgId
|
|
52
|
-
*/
|
|
53
|
-
export const OrgIdParamSchema = z
|
|
54
|
-
.object({
|
|
55
|
-
orgId: z.string().uuid()
|
|
56
|
-
})
|
|
57
|
-
.strict()
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Response shape for GET /memberships/my-permissions/:orgId
|
|
61
|
-
*/
|
|
62
|
-
export const MyOrgPermissionsResponseSchema = z.object({
|
|
63
|
-
permissions: z.array(z.string())
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
// ============================================================================
|
|
67
|
-
// Request Bodies
|
|
68
|
-
// ============================================================================
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Create new membership
|
|
72
|
-
* POST /memberships
|
|
73
|
-
*
|
|
74
|
-
* Security:
|
|
75
|
-
* - userId must be valid (string format for WorkOS)
|
|
76
|
-
* - organizationId must be valid (string format for WorkOS)
|
|
77
|
-
* - roleSlug validated as non-empty slug; service layer checks against org_rol_definitions
|
|
78
|
-
* - Strict mode prevents injection
|
|
79
|
-
*/
|
|
80
|
-
export const CreateMembershipSchema = z
|
|
81
|
-
.object({
|
|
82
|
-
userId: z.string().min(1),
|
|
83
|
-
organizationId: z.string().min(1),
|
|
84
|
-
roleSlug: MembershipRoleSchema.default('member')
|
|
85
|
-
})
|
|
86
|
-
.strict()
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Update membership role
|
|
90
|
-
* PUT /memberships/:id
|
|
91
|
-
*
|
|
92
|
-
* Security:
|
|
93
|
-
* - Only roleSlug can be updated
|
|
94
|
-
* - Service layer validates slug against org_rol_definitions
|
|
95
|
-
*/
|
|
96
|
-
export const UpdateMembershipSchema = z
|
|
97
|
-
.object({
|
|
98
|
-
roleSlug: MembershipRoleSchema
|
|
99
|
-
})
|
|
100
|
-
.strict()
|
|
101
|
-
|
|
102
|
-
// ============================================================================
|
|
103
|
-
// Query Parameters
|
|
104
|
-
// ============================================================================
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* List memberships with filters
|
|
108
|
-
* GET /memberships
|
|
109
|
-
*
|
|
110
|
-
* Filters:
|
|
111
|
-
* - userId: Filter by user
|
|
112
|
-
* - organizationId: Filter by organization
|
|
113
|
-
*
|
|
114
|
-
* Security:
|
|
115
|
-
* - Requires at least one filter parameter
|
|
116
|
-
* - String IDs validated for WorkOS format
|
|
117
|
-
*/
|
|
118
|
-
export const ListMembershipsQuerySchema = z
|
|
119
|
-
.object({
|
|
120
|
-
userId: z.string().optional(),
|
|
121
|
-
organizationId: z.string().optional(),
|
|
122
|
-
limit: z.coerce.number().int().min(1).max(100).optional(),
|
|
123
|
-
before: z.string().optional(), // WorkOS pagination cursor
|
|
124
|
-
after: z.string().optional() // WorkOS pagination cursor
|
|
125
|
-
})
|
|
126
|
-
.strict()
|
|
127
|
-
.refine((data) => data.userId || data.organizationId, {
|
|
128
|
-
message: 'Either userId or organizationId must be provided'
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
// ============================================================================
|
|
132
|
-
// TypeScript Type Exports
|
|
133
|
-
// ============================================================================
|
|
134
|
-
|
|
135
|
-
// Export inferred types for use in route handlers
|
|
136
|
-
export type CreateMembershipInput = z.infer<typeof CreateMembershipSchema>
|
|
137
|
-
export type UpdateMembershipInput = z.infer<typeof UpdateMembershipSchema>
|
|
138
|
-
export type ListMembershipsQuery = z.infer<typeof ListMembershipsQuerySchema>
|
|
139
|
-
export type MembershipIdParam = z.infer<typeof MembershipIdParamSchema>
|
|
140
|
-
export type MembershipRole = z.infer<typeof MembershipRoleSchema>
|
|
141
|
-
export type MembershipStatus = z.infer<typeof MembershipStatusSchema>
|
|
142
|
-
export type OrgIdParam = z.infer<typeof OrgIdParamSchema>
|
|
143
|
-
export type MyOrgPermissionsResponse = z.infer<typeof MyOrgPermissionsResponseSchema>
|
|
1
|
+
/**
|
|
2
|
+
* Memberships Domain - Zod Validation Schemas
|
|
3
|
+
*
|
|
4
|
+
* Validation schemas for membership management endpoints.
|
|
5
|
+
* Includes request bodies, query params, and path params.
|
|
6
|
+
*
|
|
7
|
+
* Security:
|
|
8
|
+
* - All schemas use .strict() to prevent mass assignment attacks
|
|
9
|
+
* - UUID validation prevents invalid references
|
|
10
|
+
* - Role enum validation prevents privilege escalation
|
|
11
|
+
* - organizationId never accepted in body (from JWT when needed)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { z } from 'zod'
|
|
15
|
+
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Shared Schemas
|
|
18
|
+
// ============================================================================
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Membership role validation
|
|
22
|
+
* Accepts any non-empty role slug (max 64 chars).
|
|
23
|
+
*
|
|
24
|
+
* Roles are now DB-driven via `org_rol_definitions`. Runtime validation
|
|
25
|
+
* against valid slugs happens at the service layer, not here.
|
|
26
|
+
*/
|
|
27
|
+
export const MembershipRoleSchema = z.string().min(1).max(64)
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Membership status validation
|
|
31
|
+
* Note: Database constraint only allows 'active' | 'inactive'
|
|
32
|
+
*/
|
|
33
|
+
export const MembershipStatusSchema = z.enum(['active', 'inactive'])
|
|
34
|
+
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// Path Parameters
|
|
37
|
+
// ============================================================================
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Validate membership ID in URL path
|
|
41
|
+
* Used by: GET/PUT/DELETE /memberships/:id
|
|
42
|
+
*/
|
|
43
|
+
export const MembershipIdParamSchema = z
|
|
44
|
+
.object({
|
|
45
|
+
id: z.string().min(1) // WorkOS membership IDs can be various formats
|
|
46
|
+
})
|
|
47
|
+
.strict()
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Validate organization ID (Supabase UUID) in URL path
|
|
51
|
+
* Used by: GET /memberships/my-permissions/:orgId
|
|
52
|
+
*/
|
|
53
|
+
export const OrgIdParamSchema = z
|
|
54
|
+
.object({
|
|
55
|
+
orgId: z.string().uuid()
|
|
56
|
+
})
|
|
57
|
+
.strict()
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Response shape for GET /memberships/my-permissions/:orgId
|
|
61
|
+
*/
|
|
62
|
+
export const MyOrgPermissionsResponseSchema = z.object({
|
|
63
|
+
permissions: z.array(z.string())
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
// ============================================================================
|
|
67
|
+
// Request Bodies
|
|
68
|
+
// ============================================================================
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Create new membership
|
|
72
|
+
* POST /memberships
|
|
73
|
+
*
|
|
74
|
+
* Security:
|
|
75
|
+
* - userId must be valid (string format for WorkOS)
|
|
76
|
+
* - organizationId must be valid (string format for WorkOS)
|
|
77
|
+
* - roleSlug validated as non-empty slug; service layer checks against org_rol_definitions
|
|
78
|
+
* - Strict mode prevents injection
|
|
79
|
+
*/
|
|
80
|
+
export const CreateMembershipSchema = z
|
|
81
|
+
.object({
|
|
82
|
+
userId: z.string().min(1),
|
|
83
|
+
organizationId: z.string().min(1),
|
|
84
|
+
roleSlug: MembershipRoleSchema.default('member')
|
|
85
|
+
})
|
|
86
|
+
.strict()
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Update membership role
|
|
90
|
+
* PUT /memberships/:id
|
|
91
|
+
*
|
|
92
|
+
* Security:
|
|
93
|
+
* - Only roleSlug can be updated
|
|
94
|
+
* - Service layer validates slug against org_rol_definitions
|
|
95
|
+
*/
|
|
96
|
+
export const UpdateMembershipSchema = z
|
|
97
|
+
.object({
|
|
98
|
+
roleSlug: MembershipRoleSchema
|
|
99
|
+
})
|
|
100
|
+
.strict()
|
|
101
|
+
|
|
102
|
+
// ============================================================================
|
|
103
|
+
// Query Parameters
|
|
104
|
+
// ============================================================================
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* List memberships with filters
|
|
108
|
+
* GET /memberships
|
|
109
|
+
*
|
|
110
|
+
* Filters:
|
|
111
|
+
* - userId: Filter by user
|
|
112
|
+
* - organizationId: Filter by organization
|
|
113
|
+
*
|
|
114
|
+
* Security:
|
|
115
|
+
* - Requires at least one filter parameter
|
|
116
|
+
* - String IDs validated for WorkOS format
|
|
117
|
+
*/
|
|
118
|
+
export const ListMembershipsQuerySchema = z
|
|
119
|
+
.object({
|
|
120
|
+
userId: z.string().optional(),
|
|
121
|
+
organizationId: z.string().optional(),
|
|
122
|
+
limit: z.coerce.number().int().min(1).max(100).optional(),
|
|
123
|
+
before: z.string().optional(), // WorkOS pagination cursor
|
|
124
|
+
after: z.string().optional() // WorkOS pagination cursor
|
|
125
|
+
})
|
|
126
|
+
.strict()
|
|
127
|
+
.refine((data) => data.userId || data.organizationId, {
|
|
128
|
+
message: 'Either userId or organizationId must be provided'
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
// ============================================================================
|
|
132
|
+
// TypeScript Type Exports
|
|
133
|
+
// ============================================================================
|
|
134
|
+
|
|
135
|
+
// Export inferred types for use in route handlers
|
|
136
|
+
export type CreateMembershipInput = z.infer<typeof CreateMembershipSchema>
|
|
137
|
+
export type UpdateMembershipInput = z.infer<typeof UpdateMembershipSchema>
|
|
138
|
+
export type ListMembershipsQuery = z.infer<typeof ListMembershipsQuerySchema>
|
|
139
|
+
export type MembershipIdParam = z.infer<typeof MembershipIdParamSchema>
|
|
140
|
+
export type MembershipRole = z.infer<typeof MembershipRoleSchema>
|
|
141
|
+
export type MembershipStatus = z.infer<typeof MembershipStatusSchema>
|
|
142
|
+
export type OrgIdParam = z.infer<typeof OrgIdParamSchema>
|
|
143
|
+
export type MyOrgPermissionsResponse = z.infer<typeof MyOrgPermissionsResponseSchema>
|