@digimuza/saas-core 0.0.2
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/CLAUDE.md +1165 -0
- package/LICENSE +21 -0
- package/README.md +234 -0
- package/dist/api-keys/index.d.ts +9 -0
- package/dist/api-keys/index.d.ts.map +1 -0
- package/dist/api-keys/index.js +37 -0
- package/dist/api-keys/index.js.map +1 -0
- package/dist/api-keys/keys.d.ts +55 -0
- package/dist/api-keys/keys.d.ts.map +1 -0
- package/dist/api-keys/keys.js +92 -0
- package/dist/api-keys/keys.js.map +1 -0
- package/dist/api-keys/service.d.ts +111 -0
- package/dist/api-keys/service.d.ts.map +1 -0
- package/dist/api-keys/service.js +210 -0
- package/dist/api-keys/service.js.map +1 -0
- package/dist/audit/index.d.ts +5 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +44 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/service.d.ts +88 -0
- package/dist/audit/service.d.ts.map +1 -0
- package/dist/audit/service.js +128 -0
- package/dist/audit/service.js.map +1 -0
- package/dist/auth/client.d.ts +5 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +26 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/cookies.d.ts +51 -0
- package/dist/auth/cookies.d.ts.map +1 -0
- package/dist/auth/cookies.js +58 -0
- package/dist/auth/cookies.js.map +1 -0
- package/dist/auth/index.d.ts +14 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +46 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/service.d.ts +67 -0
- package/dist/auth/service.d.ts.map +1 -0
- package/dist/auth/service.js +275 -0
- package/dist/auth/service.js.map +1 -0
- package/dist/auth/types.d.ts +56 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/authorization/index.d.ts +4 -0
- package/dist/authorization/index.d.ts.map +1 -0
- package/dist/authorization/index.js +24 -0
- package/dist/authorization/index.js.map +1 -0
- package/dist/authorization/service.d.ts +92 -0
- package/dist/authorization/service.d.ts.map +1 -0
- package/dist/authorization/service.js +254 -0
- package/dist/authorization/service.js.map +1 -0
- package/dist/billing/index.d.ts +16 -0
- package/dist/billing/index.d.ts.map +1 -0
- package/dist/billing/index.js +47 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/billing/provider.d.ts +114 -0
- package/dist/billing/provider.d.ts.map +1 -0
- package/dist/billing/provider.js +2 -0
- package/dist/billing/provider.js.map +1 -0
- package/dist/billing/revolut.d.ts +68 -0
- package/dist/billing/revolut.d.ts.map +1 -0
- package/dist/billing/revolut.js +181 -0
- package/dist/billing/revolut.js.map +1 -0
- package/dist/billing/service.d.ts +124 -0
- package/dist/billing/service.d.ts.map +1 -0
- package/dist/billing/service.js +470 -0
- package/dist/billing/service.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +43 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +212 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/project.d.ts +12 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +49 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/docker.d.ts +50 -0
- package/dist/cli/docker.d.ts.map +1 -0
- package/dist/cli/docker.js +84 -0
- package/dist/cli/docker.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +198 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +30 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +66 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/templates.d.ts +52 -0
- package/dist/cli/templates.d.ts.map +1 -0
- package/dist/cli/templates.js +225 -0
- package/dist/cli/templates.js.map +1 -0
- package/dist/config/client.d.ts +60 -0
- package/dist/config/client.d.ts.map +1 -0
- package/dist/config/client.js +94 -0
- package/dist/config/client.js.map +1 -0
- package/dist/config/config-loader.d.ts +2 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +2 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/env.d.ts +24 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +40 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/errors.d.ts +17 -0
- package/dist/config/errors.d.ts.map +1 -0
- package/dist/config/errors.js +26 -0
- package/dist/config/errors.js.map +1 -0
- package/dist/config/index.d.ts +72 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +106 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/runtime.d.ts +15 -0
- package/dist/config/runtime.d.ts.map +1 -0
- package/dist/config/runtime.js +22 -0
- package/dist/config/runtime.js.map +1 -0
- package/dist/config/sections.d.ts +226 -0
- package/dist/config/sections.d.ts.map +1 -0
- package/dist/config/sections.js +141 -0
- package/dist/config/sections.js.map +1 -0
- package/dist/db/client.d.ts +43 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +77 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/errors.d.ts +39 -0
- package/dist/db/errors.d.ts.map +1 -0
- package/dist/db/errors.js +67 -0
- package/dist/db/errors.js.map +1 -0
- package/dist/db/index.d.ts +10 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +10 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate.d.ts +21 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +28 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/schema/_shared.d.ts +30 -0
- package/dist/db/schema/_shared.d.ts.map +1 -0
- package/dist/db/schema/_shared.js +36 -0
- package/dist/db/schema/_shared.js.map +1 -0
- package/dist/db/schema/apikeys.d.ts +263 -0
- package/dist/db/schema/apikeys.d.ts.map +1 -0
- package/dist/db/schema/apikeys.js +70 -0
- package/dist/db/schema/apikeys.js.map +1 -0
- package/dist/db/schema/authorization.d.ts +465 -0
- package/dist/db/schema/authorization.d.ts.map +1 -0
- package/dist/db/schema/authorization.js +134 -0
- package/dist/db/schema/authorization.js.map +1 -0
- package/dist/db/schema/billing.d.ts +1100 -0
- package/dist/db/schema/billing.d.ts.map +1 -0
- package/dist/db/schema/billing.js +223 -0
- package/dist/db/schema/billing.js.map +1 -0
- package/dist/db/schema/events.d.ts +161 -0
- package/dist/db/schema/events.d.ts.map +1 -0
- package/dist/db/schema/events.js +66 -0
- package/dist/db/schema/events.js.map +1 -0
- package/dist/db/schema/features.d.ts +243 -0
- package/dist/db/schema/features.d.ts.map +1 -0
- package/dist/db/schema/features.js +87 -0
- package/dist/db/schema/features.js.map +1 -0
- package/dist/db/schema/files.d.ts +253 -0
- package/dist/db/schema/files.d.ts.map +1 -0
- package/dist/db/schema/files.js +74 -0
- package/dist/db/schema/files.js.map +1 -0
- package/dist/db/schema/index.d.ts +38 -0
- package/dist/db/schema/index.d.ts.map +1 -0
- package/dist/db/schema/index.js +38 -0
- package/dist/db/schema/index.js.map +1 -0
- package/dist/db/schema/invitations.d.ts +214 -0
- package/dist/db/schema/invitations.d.ts.map +1 -0
- package/dist/db/schema/invitations.js +80 -0
- package/dist/db/schema/invitations.js.map +1 -0
- package/dist/db/schema/messaging.d.ts +442 -0
- package/dist/db/schema/messaging.d.ts.map +1 -0
- package/dist/db/schema/messaging.js +120 -0
- package/dist/db/schema/messaging.js.map +1 -0
- package/dist/db/schema/users.d.ts +246 -0
- package/dist/db/schema/users.d.ts.map +1 -0
- package/dist/db/schema/users.js +60 -0
- package/dist/db/schema/users.js.map +1 -0
- package/dist/db/schema/webhooks.d.ts +693 -0
- package/dist/db/schema/webhooks.d.ts.map +1 -0
- package/dist/db/schema/webhooks.js +147 -0
- package/dist/db/schema/webhooks.js.map +1 -0
- package/dist/db/schema/workspaces.d.ts +196 -0
- package/dist/db/schema/workspaces.d.ts.map +1 -0
- package/dist/db/schema/workspaces.js +57 -0
- package/dist/db/schema/workspaces.js.map +1 -0
- package/dist/db/types.d.ts +18 -0
- package/dist/db/types.d.ts.map +1 -0
- package/dist/db/types.js +2 -0
- package/dist/db/types.js.map +1 -0
- package/dist/email/adapters.d.ts +29 -0
- package/dist/email/adapters.d.ts.map +1 -0
- package/dist/email/adapters.js +60 -0
- package/dist/email/adapters.js.map +1 -0
- package/dist/email/index.d.ts +20 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +79 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/provider.d.ts +47 -0
- package/dist/email/provider.d.ts.map +1 -0
- package/dist/email/provider.js +7 -0
- package/dist/email/provider.js.map +1 -0
- package/dist/email/resend.d.ts +22 -0
- package/dist/email/resend.d.ts.map +1 -0
- package/dist/email/resend.js +51 -0
- package/dist/email/resend.js.map +1 -0
- package/dist/email/service.d.ts +55 -0
- package/dist/email/service.d.ts.map +1 -0
- package/dist/email/service.js +87 -0
- package/dist/email/service.js.map +1 -0
- package/dist/email/templates.d.ts +81 -0
- package/dist/email/templates.d.ts.map +1 -0
- package/dist/email/templates.js +84 -0
- package/dist/email/templates.js.map +1 -0
- package/dist/entitlements/index.d.ts +10 -0
- package/dist/entitlements/index.d.ts.map +1 -0
- package/dist/entitlements/index.js +28 -0
- package/dist/entitlements/index.js.map +1 -0
- package/dist/entitlements/service.d.ts +83 -0
- package/dist/entitlements/service.d.ts.map +1 -0
- package/dist/entitlements/service.js +158 -0
- package/dist/entitlements/service.js.map +1 -0
- package/dist/errors.d.ts +85 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +95 -0
- package/dist/errors.js.map +1 -0
- package/dist/events/core-events.d.ts +120 -0
- package/dist/events/core-events.d.ts.map +1 -0
- package/dist/events/core-events.js +109 -0
- package/dist/events/core-events.js.map +1 -0
- package/dist/events/index.d.ts +15 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +58 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/publisher.d.ts +46 -0
- package/dist/events/publisher.d.ts.map +1 -0
- package/dist/events/publisher.js +54 -0
- package/dist/events/publisher.js.map +1 -0
- package/dist/events/registry.d.ts +87 -0
- package/dist/events/registry.d.ts.map +1 -0
- package/dist/events/registry.js +34 -0
- package/dist/events/registry.js.map +1 -0
- package/dist/events/service.d.ts +78 -0
- package/dist/events/service.d.ts.map +1 -0
- package/dist/events/service.js +182 -0
- package/dist/events/service.js.map +1 -0
- package/dist/features/bucket.d.ts +22 -0
- package/dist/features/bucket.d.ts.map +1 -0
- package/dist/features/bucket.js +42 -0
- package/dist/features/bucket.js.map +1 -0
- package/dist/features/index.d.ts +15 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +78 -0
- package/dist/features/index.js.map +1 -0
- package/dist/features/registry.d.ts +51 -0
- package/dist/features/registry.d.ts.map +1 -0
- package/dist/features/registry.js +52 -0
- package/dist/features/registry.js.map +1 -0
- package/dist/features/service.d.ts +78 -0
- package/dist/features/service.d.ts.map +1 -0
- package/dist/features/service.js +207 -0
- package/dist/features/service.js.map +1 -0
- package/dist/files/index.d.ts +6 -0
- package/dist/files/index.d.ts.map +1 -0
- package/dist/files/index.js +64 -0
- package/dist/files/index.js.map +1 -0
- package/dist/files/service.d.ts +92 -0
- package/dist/files/service.d.ts.map +1 -0
- package/dist/files/service.js +303 -0
- package/dist/files/service.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/backend.d.ts +23 -0
- package/dist/jobs/backend.d.ts.map +1 -0
- package/dist/jobs/backend.js +23 -0
- package/dist/jobs/backend.js.map +1 -0
- package/dist/jobs/index.d.ts +29 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +114 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/service.d.ts +67 -0
- package/dist/jobs/service.d.ts.map +1 -0
- package/dist/jobs/service.js +139 -0
- package/dist/jobs/service.js.map +1 -0
- package/dist/jobs/types.d.ts +78 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/types.js +4 -0
- package/dist/jobs/types.js.map +1 -0
- package/dist/logger/default.d.ts +7 -0
- package/dist/logger/default.d.ts.map +1 -0
- package/dist/logger/default.js +28 -0
- package/dist/logger/default.js.map +1 -0
- package/dist/logger/index.d.ts +24 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +90 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/redact.d.ts +40 -0
- package/dist/logger/redact.d.ts.map +1 -0
- package/dist/logger/redact.js +178 -0
- package/dist/logger/redact.js.map +1 -0
- package/dist/logger/service.d.ts +14 -0
- package/dist/logger/service.d.ts.map +1 -0
- package/dist/logger/service.js +56 -0
- package/dist/logger/service.js.map +1 -0
- package/dist/logger/sinks.d.ts +37 -0
- package/dist/logger/sinks.d.ts.map +1 -0
- package/dist/logger/sinks.js +135 -0
- package/dist/logger/sinks.js.map +1 -0
- package/dist/logger/types.d.ts +47 -0
- package/dist/logger/types.d.ts.map +1 -0
- package/dist/logger/types.js +8 -0
- package/dist/logger/types.js.map +1 -0
- package/dist/notifications/index.d.ts +8 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +72 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/service.d.ts +79 -0
- package/dist/notifications/service.d.ts.map +1 -0
- package/dist/notifications/service.js +164 -0
- package/dist/notifications/service.js.map +1 -0
- package/dist/realtime/channels.d.ts +37 -0
- package/dist/realtime/channels.d.ts.map +1 -0
- package/dist/realtime/channels.js +58 -0
- package/dist/realtime/channels.js.map +1 -0
- package/dist/realtime/index.d.ts +19 -0
- package/dist/realtime/index.d.ts.map +1 -0
- package/dist/realtime/index.js +118 -0
- package/dist/realtime/index.js.map +1 -0
- package/dist/realtime/postgres.d.ts +48 -0
- package/dist/realtime/postgres.d.ts.map +1 -0
- package/dist/realtime/postgres.js +151 -0
- package/dist/realtime/postgres.js.map +1 -0
- package/dist/realtime/service.d.ts +75 -0
- package/dist/realtime/service.d.ts.map +1 -0
- package/dist/realtime/service.js +103 -0
- package/dist/realtime/service.js.map +1 -0
- package/dist/realtime/sse.d.ts +55 -0
- package/dist/realtime/sse.d.ts.map +1 -0
- package/dist/realtime/sse.js +123 -0
- package/dist/realtime/sse.js.map +1 -0
- package/dist/realtime/transport.d.ts +52 -0
- package/dist/realtime/transport.d.ts.map +1 -0
- package/dist/realtime/transport.js +2 -0
- package/dist/realtime/transport.js.map +1 -0
- package/dist/storage/index.d.ts +18 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +89 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/keys.d.ts +50 -0
- package/dist/storage/keys.d.ts.map +1 -0
- package/dist/storage/keys.js +120 -0
- package/dist/storage/keys.js.map +1 -0
- package/dist/storage/memory.d.ts +32 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +84 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/storage/provider.d.ts +93 -0
- package/dist/storage/provider.d.ts.map +1 -0
- package/dist/storage/provider.js +2 -0
- package/dist/storage/provider.js.map +1 -0
- package/dist/storage/s3.d.ts +34 -0
- package/dist/storage/s3.d.ts.map +1 -0
- package/dist/storage/s3.js +175 -0
- package/dist/storage/s3.js.map +1 -0
- package/dist/storage/service.d.ts +86 -0
- package/dist/storage/service.d.ts.map +1 -0
- package/dist/storage/service.js +107 -0
- package/dist/storage/service.js.map +1 -0
- package/dist/storage/sigv4.d.ts +58 -0
- package/dist/storage/sigv4.d.ts.map +1 -0
- package/dist/storage/sigv4.js +114 -0
- package/dist/storage/sigv4.js.map +1 -0
- package/dist/streams/client.d.ts +91 -0
- package/dist/streams/client.d.ts.map +1 -0
- package/dist/streams/client.js +128 -0
- package/dist/streams/client.js.map +1 -0
- package/dist/streams/events.d.ts +68 -0
- package/dist/streams/events.d.ts.map +1 -0
- package/dist/streams/events.js +81 -0
- package/dist/streams/events.js.map +1 -0
- package/dist/streams/index.d.ts +47 -0
- package/dist/streams/index.d.ts.map +1 -0
- package/dist/streams/index.js +47 -0
- package/dist/streams/index.js.map +1 -0
- package/dist/streams/realtime.d.ts +27 -0
- package/dist/streams/realtime.d.ts.map +1 -0
- package/dist/streams/realtime.js +50 -0
- package/dist/streams/realtime.js.map +1 -0
- package/dist/streams/state.d.ts +26 -0
- package/dist/streams/state.d.ts.map +1 -0
- package/dist/streams/state.js +34 -0
- package/dist/streams/state.js.map +1 -0
- package/dist/users/index.d.ts +9 -0
- package/dist/users/index.d.ts.map +1 -0
- package/dist/users/index.js +23 -0
- package/dist/users/index.js.map +1 -0
- package/dist/users/service.d.ts +43 -0
- package/dist/users/service.d.ts.map +1 -0
- package/dist/users/service.js +113 -0
- package/dist/users/service.js.map +1 -0
- package/dist/webhooks/inbound.d.ts +70 -0
- package/dist/webhooks/inbound.d.ts.map +1 -0
- package/dist/webhooks/inbound.js +146 -0
- package/dist/webhooks/inbound.js.map +1 -0
- package/dist/webhooks/index.d.ts +12 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +65 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/webhooks/outgoing.d.ts +89 -0
- package/dist/webhooks/outgoing.d.ts.map +1 -0
- package/dist/webhooks/outgoing.js +375 -0
- package/dist/webhooks/outgoing.js.map +1 -0
- package/dist/webhooks/signature.d.ts +40 -0
- package/dist/webhooks/signature.d.ts.map +1 -0
- package/dist/webhooks/signature.js +77 -0
- package/dist/webhooks/signature.js.map +1 -0
- package/dist/workspaces/context.d.ts +30 -0
- package/dist/workspaces/context.d.ts.map +1 -0
- package/dist/workspaces/context.js +12 -0
- package/dist/workspaces/context.js.map +1 -0
- package/dist/workspaces/index.d.ts +5 -0
- package/dist/workspaces/index.d.ts.map +1 -0
- package/dist/workspaces/index.js +21 -0
- package/dist/workspaces/index.js.map +1 -0
- package/dist/workspaces/service.d.ts +126 -0
- package/dist/workspaces/service.d.ts.map +1 -0
- package/dist/workspaces/service.js +495 -0
- package/dist/workspaces/service.js.map +1 -0
- package/docs/README.md +71 -0
- package/docs/api-keys.md +184 -0
- package/docs/audit.md +198 -0
- package/docs/auth.md +196 -0
- package/docs/authorization.md +225 -0
- package/docs/billing.md +293 -0
- package/docs/cli.md +238 -0
- package/docs/config.md +163 -0
- package/docs/db.md +219 -0
- package/docs/email.md +222 -0
- package/docs/entitlements.md +194 -0
- package/docs/errors.md +158 -0
- package/docs/events.md +279 -0
- package/docs/feature-flags.md +237 -0
- package/docs/files.md +229 -0
- package/docs/jobs.md +288 -0
- package/docs/logger.md +269 -0
- package/docs/notifications.md +179 -0
- package/docs/publishing.md +128 -0
- package/docs/realtime.md +360 -0
- package/docs/storage.md +279 -0
- package/docs/streams.md +296 -0
- package/docs/users.md +117 -0
- package/docs/webhooks.md +272 -0
- package/docs/workspaces.md +269 -0
- package/drizzle/0000_init_users.sql +21 -0
- package/drizzle/0001_workspaces_roles_permissions.sql +86 -0
- package/drizzle/0002_billing_entitlements.sql +97 -0
- package/drizzle/0003_events.sql +17 -0
- package/drizzle/0004_notifications_audit.sql +64 -0
- package/drizzle/0005_api_keys_webhooks.sql +77 -0
- package/drizzle/0006_feature_flags.sql +22 -0
- package/drizzle/0007_files.sql +23 -0
- package/drizzle/meta/0000_snapshot.json +160 -0
- package/drizzle/meta/0001_snapshot.json +837 -0
- package/drizzle/meta/0002_snapshot.json +1580 -0
- package/drizzle/meta/0003_snapshot.json +1751 -0
- package/drizzle/meta/0004_snapshot.json +2109 -0
- package/drizzle/meta/0005_snapshot.json +2719 -0
- package/drizzle/meta/0006_snapshot.json +2909 -0
- package/drizzle/meta/0007_snapshot.json +3113 -0
- package/drizzle/meta/_journal.json +62 -0
- package/package.json +180 -0
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import { and, asc, eq, inArray, ne, sql } from "drizzle-orm";
|
|
2
|
+
import { ConflictError, InvalidInputError, NotFoundError } from "../errors.js";
|
|
3
|
+
import { isUniqueViolation } from "../db/errors.js";
|
|
4
|
+
import { billingCustomers, billingEvents, ENTITLING_SUBSCRIPTION_STATUSES, entitlements, plans, subscriptions, workspaces, } from "../db/schema/index.js";
|
|
5
|
+
import { EventOutbox } from "../events/publisher.js";
|
|
6
|
+
/** Raised when a webhook's signature does not verify. */
|
|
7
|
+
export class InvalidWebhookSignatureError extends Error {
|
|
8
|
+
name = "InvalidWebhookSignatureError";
|
|
9
|
+
constructor() {
|
|
10
|
+
/**
|
|
11
|
+
* Deliberately uninformative. A caller who cannot produce a valid signature
|
|
12
|
+
* gets no hint about which part failed.
|
|
13
|
+
*/
|
|
14
|
+
super("Webhook signature verification failed.");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function createBillingService(deps) {
|
|
18
|
+
/**
|
|
19
|
+
* Read through `deps` on every call rather than capturing at construction, so
|
|
20
|
+
* the default service can be built at import time while the provider — and
|
|
21
|
+
* the credentials it needs — resolve only on first use.
|
|
22
|
+
*/
|
|
23
|
+
const providerName = () => deps.provider.name;
|
|
24
|
+
const outbox = () => new EventOutbox(deps.events);
|
|
25
|
+
async function findLiveSubscription(workspaceId) {
|
|
26
|
+
const rows = await deps.db
|
|
27
|
+
.select({ subscription: subscriptions, plan: plans })
|
|
28
|
+
.from(subscriptions)
|
|
29
|
+
.innerJoin(plans, eq(plans.id, subscriptions.planId))
|
|
30
|
+
.where(and(eq(subscriptions.workspaceId, workspaceId), inArray(subscriptions.status, [...ENTITLING_SUBSCRIPTION_STATUSES])))
|
|
31
|
+
.limit(1);
|
|
32
|
+
const row = rows[0];
|
|
33
|
+
return row === undefined ? undefined : { subscription: row.subscription, plan: row.plan };
|
|
34
|
+
}
|
|
35
|
+
async function replaceEntitlements(tx, planId, definitions) {
|
|
36
|
+
await tx.delete(entitlements).where(eq(entitlements.planId, planId));
|
|
37
|
+
if (definitions.length === 0) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
await tx.insert(entitlements).values(definitions.map((definition) => ({
|
|
41
|
+
planId,
|
|
42
|
+
key: definition.key,
|
|
43
|
+
kind: definition.kind,
|
|
44
|
+
/**
|
|
45
|
+
* Features carry no quota. Storing one would make `getLimit()` on a
|
|
46
|
+
* feature look meaningful when it is not.
|
|
47
|
+
*/
|
|
48
|
+
limitValue: definition.kind === "limit" ? (definition.limitValue ?? null) : null,
|
|
49
|
+
})));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Apply normalised subscription state from a verified webhook.
|
|
53
|
+
*
|
|
54
|
+
* Returns false when the event is not actionable — an unknown customer or an
|
|
55
|
+
* unresolvable plan — so the caller can record it as ignored rather than
|
|
56
|
+
* failed. That distinction matters: ignored events are expected (traffic for
|
|
57
|
+
* another environment sharing a provider account), failures need attention.
|
|
58
|
+
*/
|
|
59
|
+
async function applySubscriptionState(tx, state, events) {
|
|
60
|
+
const customerRows = await tx
|
|
61
|
+
.select()
|
|
62
|
+
.from(billingCustomers)
|
|
63
|
+
.where(and(eq(billingCustomers.provider, providerName()), eq(billingCustomers.providerCustomerId, state.providerCustomerId)))
|
|
64
|
+
.limit(1);
|
|
65
|
+
const customer = customerRows[0];
|
|
66
|
+
if (customer === undefined) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The workspace comes from our own customer record, never from the webhook
|
|
71
|
+
* payload. A provider-supplied workspace reference would be attacker-visible
|
|
72
|
+
* if the signing secret ever leaked, and this way tenancy is resolved from
|
|
73
|
+
* data we wrote ourselves.
|
|
74
|
+
*/
|
|
75
|
+
const workspaceId = customer.workspaceId;
|
|
76
|
+
const planRows = state.providerPriceId !== undefined
|
|
77
|
+
? await tx
|
|
78
|
+
.select()
|
|
79
|
+
.from(plans)
|
|
80
|
+
.where(eq(plans.providerPriceId, state.providerPriceId))
|
|
81
|
+
.limit(1)
|
|
82
|
+
: state.planKey !== undefined
|
|
83
|
+
? await tx.select().from(plans).where(eq(plans.key, state.planKey)).limit(1)
|
|
84
|
+
: [];
|
|
85
|
+
const plan = planRows[0];
|
|
86
|
+
if (plan === undefined) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
const isLive = ENTITLING_SUBSCRIPTION_STATUSES.includes(state.status);
|
|
90
|
+
/**
|
|
91
|
+
* Read the prior status before the upsert overwrites it, so the event can
|
|
92
|
+
* report the transition. Consumers care about the change — "became
|
|
93
|
+
* past_due" — far more than the resulting value.
|
|
94
|
+
*/
|
|
95
|
+
const priorRows = await tx
|
|
96
|
+
.select({ status: subscriptions.status })
|
|
97
|
+
.from(subscriptions)
|
|
98
|
+
.where(and(eq(subscriptions.provider, providerName()), eq(subscriptions.providerSubscriptionId, state.providerSubscriptionId)))
|
|
99
|
+
.limit(1);
|
|
100
|
+
const previousStatus = priorRows[0]?.status;
|
|
101
|
+
/**
|
|
102
|
+
* Retire any other live subscription for this workspace first.
|
|
103
|
+
*
|
|
104
|
+
* `subscriptions_one_live_per_workspace_idx` allows only one, and an upgrade
|
|
105
|
+
* arrives as a new subscription rather than a mutation of the old one, so
|
|
106
|
+
* without this the insert would violate the index.
|
|
107
|
+
*/
|
|
108
|
+
if (isLive) {
|
|
109
|
+
await tx
|
|
110
|
+
.update(subscriptions)
|
|
111
|
+
.set({ status: "canceled", canceledAt: new Date(), updatedAt: new Date() })
|
|
112
|
+
.where(and(eq(subscriptions.workspaceId, workspaceId), ne(subscriptions.providerSubscriptionId, state.providerSubscriptionId), inArray(subscriptions.status, [...ENTITLING_SUBSCRIPTION_STATUSES])));
|
|
113
|
+
}
|
|
114
|
+
const upserted = await tx
|
|
115
|
+
.insert(subscriptions)
|
|
116
|
+
.values({
|
|
117
|
+
workspaceId,
|
|
118
|
+
billingCustomerId: customer.id,
|
|
119
|
+
planId: plan.id,
|
|
120
|
+
provider: providerName(),
|
|
121
|
+
providerSubscriptionId: state.providerSubscriptionId,
|
|
122
|
+
status: state.status,
|
|
123
|
+
currentPeriodStart: state.currentPeriodStart ?? null,
|
|
124
|
+
currentPeriodEnd: state.currentPeriodEnd ?? null,
|
|
125
|
+
cancelAtPeriodEnd: state.cancelAtPeriodEnd ?? false,
|
|
126
|
+
canceledAt: state.canceledAt ?? null,
|
|
127
|
+
trialEndsAt: state.trialEndsAt ?? null,
|
|
128
|
+
})
|
|
129
|
+
.onConflictDoUpdate({
|
|
130
|
+
target: [subscriptions.provider, subscriptions.providerSubscriptionId],
|
|
131
|
+
set: {
|
|
132
|
+
planId: plan.id,
|
|
133
|
+
status: state.status,
|
|
134
|
+
currentPeriodStart: state.currentPeriodStart ?? null,
|
|
135
|
+
currentPeriodEnd: state.currentPeriodEnd ?? null,
|
|
136
|
+
cancelAtPeriodEnd: state.cancelAtPeriodEnd ?? false,
|
|
137
|
+
canceledAt: state.canceledAt ?? null,
|
|
138
|
+
trialEndsAt: state.trialEndsAt ?? null,
|
|
139
|
+
updatedAt: new Date(),
|
|
140
|
+
},
|
|
141
|
+
})
|
|
142
|
+
.returning({ id: subscriptions.id });
|
|
143
|
+
if (events.enabled && upserted[0] !== undefined) {
|
|
144
|
+
await events.record({
|
|
145
|
+
type: "billing.subscription.updated",
|
|
146
|
+
workspaceId,
|
|
147
|
+
// No human actor: this came from the provider.
|
|
148
|
+
actorId: null,
|
|
149
|
+
data: {
|
|
150
|
+
subscriptionId: upserted[0].id,
|
|
151
|
+
planKey: plan.key,
|
|
152
|
+
status: state.status,
|
|
153
|
+
...(previousStatus !== undefined ? { previousStatus } : {}),
|
|
154
|
+
},
|
|
155
|
+
}, tx);
|
|
156
|
+
}
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
const planAdmin = {
|
|
160
|
+
async list(options = {}) {
|
|
161
|
+
const query = deps.db.select().from(plans).orderBy(asc(plans.sortOrder), asc(plans.key));
|
|
162
|
+
if (options.includeInactive === true) {
|
|
163
|
+
return query;
|
|
164
|
+
}
|
|
165
|
+
return deps.db
|
|
166
|
+
.select()
|
|
167
|
+
.from(plans)
|
|
168
|
+
.where(eq(plans.isActive, true))
|
|
169
|
+
.orderBy(asc(plans.sortOrder), asc(plans.key));
|
|
170
|
+
},
|
|
171
|
+
async getByKey(key) {
|
|
172
|
+
const rows = await deps.db.select().from(plans).where(eq(plans.key, key)).limit(1);
|
|
173
|
+
return rows[0];
|
|
174
|
+
},
|
|
175
|
+
async upsert(input) {
|
|
176
|
+
return deps.db.transaction(async (tx) => {
|
|
177
|
+
const [plan] = await tx
|
|
178
|
+
.insert(plans)
|
|
179
|
+
.values({
|
|
180
|
+
key: input.key,
|
|
181
|
+
name: input.name,
|
|
182
|
+
description: input.description ?? null,
|
|
183
|
+
providerPriceId: input.providerPriceId ?? null,
|
|
184
|
+
amountCents: input.amountCents ?? 0,
|
|
185
|
+
currency: (input.currency ?? "EUR").toUpperCase(),
|
|
186
|
+
interval: input.interval ?? "month",
|
|
187
|
+
isActive: input.isActive ?? true,
|
|
188
|
+
sortOrder: input.sortOrder ?? 0,
|
|
189
|
+
})
|
|
190
|
+
.onConflictDoUpdate({
|
|
191
|
+
target: plans.key,
|
|
192
|
+
set: {
|
|
193
|
+
name: input.name,
|
|
194
|
+
description: input.description ?? null,
|
|
195
|
+
providerPriceId: input.providerPriceId ?? null,
|
|
196
|
+
amountCents: input.amountCents ?? 0,
|
|
197
|
+
currency: (input.currency ?? "EUR").toUpperCase(),
|
|
198
|
+
interval: input.interval ?? "month",
|
|
199
|
+
isActive: input.isActive ?? true,
|
|
200
|
+
sortOrder: input.sortOrder ?? 0,
|
|
201
|
+
updatedAt: new Date(),
|
|
202
|
+
},
|
|
203
|
+
})
|
|
204
|
+
.returning();
|
|
205
|
+
if (input.entitlements !== undefined) {
|
|
206
|
+
assertEntitlementDefinitions(input.entitlements);
|
|
207
|
+
await replaceEntitlements(tx, plan.id, input.entitlements);
|
|
208
|
+
}
|
|
209
|
+
return plan;
|
|
210
|
+
});
|
|
211
|
+
},
|
|
212
|
+
async setEntitlements(planKey, definitions) {
|
|
213
|
+
assertEntitlementDefinitions(definitions);
|
|
214
|
+
await deps.db.transaction(async (tx) => {
|
|
215
|
+
const rows = await tx.select({ id: plans.id }).from(plans).where(eq(plans.key, planKey)).limit(1);
|
|
216
|
+
const plan = rows[0];
|
|
217
|
+
if (plan === undefined) {
|
|
218
|
+
throw new NotFoundError(`Plan "${planKey}" not found.`);
|
|
219
|
+
}
|
|
220
|
+
await replaceEntitlements(tx, plan.id, definitions);
|
|
221
|
+
});
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
const webhooks = {
|
|
225
|
+
async handle(request) {
|
|
226
|
+
/**
|
|
227
|
+
* Verify before anything else. An unverified body must not reach the
|
|
228
|
+
* parser, let alone the database.
|
|
229
|
+
*/
|
|
230
|
+
const verified = deps.provider.verifyWebhook({
|
|
231
|
+
rawBody: request.rawBody,
|
|
232
|
+
signature: request.signature,
|
|
233
|
+
...(request.timestamp !== undefined ? { timestamp: request.timestamp } : {}),
|
|
234
|
+
});
|
|
235
|
+
if (!verified) {
|
|
236
|
+
throw new InvalidWebhookSignatureError();
|
|
237
|
+
}
|
|
238
|
+
const event = deps.provider.parseWebhookEvent(request.rawBody);
|
|
239
|
+
/**
|
|
240
|
+
* Claim the event with a conditional upsert.
|
|
241
|
+
*
|
|
242
|
+
* The insert is the claim, so at-least-once delivery is handled by the
|
|
243
|
+
* `(provider, provider_event_id)` unique constraint rather than by a
|
|
244
|
+
* check-then-act that two concurrent deliveries could both pass. The
|
|
245
|
+
* `setWhere` clause means a retry re-claims an event whose previous
|
|
246
|
+
* attempt *failed*, but never one already `processed` or currently
|
|
247
|
+
* `pending` — so a genuine failure can be retried without risking a
|
|
248
|
+
* double application.
|
|
249
|
+
*/
|
|
250
|
+
const claimed = await deps.db
|
|
251
|
+
.insert(billingEvents)
|
|
252
|
+
.values({
|
|
253
|
+
provider: providerName(),
|
|
254
|
+
providerEventId: event.providerEventId,
|
|
255
|
+
type: event.type,
|
|
256
|
+
payload: event.payload,
|
|
257
|
+
status: "pending",
|
|
258
|
+
})
|
|
259
|
+
.onConflictDoUpdate({
|
|
260
|
+
target: [billingEvents.provider, billingEvents.providerEventId],
|
|
261
|
+
set: { status: "pending", error: null, updatedAt: new Date() },
|
|
262
|
+
setWhere: eq(billingEvents.status, "failed"),
|
|
263
|
+
})
|
|
264
|
+
.returning({ id: billingEvents.id });
|
|
265
|
+
const claim = claimed[0];
|
|
266
|
+
if (claim === undefined) {
|
|
267
|
+
return { status: "duplicate", type: event.type };
|
|
268
|
+
}
|
|
269
|
+
const outgoing = outbox();
|
|
270
|
+
try {
|
|
271
|
+
const applied = event.subscription === undefined
|
|
272
|
+
? false
|
|
273
|
+
: await deps.db.transaction((tx) => applySubscriptionState(tx, event.subscription, outgoing));
|
|
274
|
+
// After commit: subscribers must not see uncommitted subscription state.
|
|
275
|
+
await outgoing.flush();
|
|
276
|
+
await deps.db
|
|
277
|
+
.update(billingEvents)
|
|
278
|
+
.set({
|
|
279
|
+
status: applied ? "processed" : "ignored",
|
|
280
|
+
processedAt: new Date(),
|
|
281
|
+
updatedAt: new Date(),
|
|
282
|
+
})
|
|
283
|
+
.where(eq(billingEvents.id, claim.id));
|
|
284
|
+
return applied
|
|
285
|
+
? { status: "processed", eventId: claim.id, type: event.type }
|
|
286
|
+
: { status: "ignored", eventId: claim.id, type: event.type };
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
/**
|
|
290
|
+
* Record the failure so the event can be replayed from the stored
|
|
291
|
+
* payload, then rethrow so the provider sees a non-2xx and retries.
|
|
292
|
+
*/
|
|
293
|
+
await deps.db
|
|
294
|
+
.update(billingEvents)
|
|
295
|
+
.set({
|
|
296
|
+
status: "failed",
|
|
297
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
298
|
+
updatedAt: new Date(),
|
|
299
|
+
})
|
|
300
|
+
.where(eq(billingEvents.id, claim.id));
|
|
301
|
+
throw error;
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
};
|
|
305
|
+
return {
|
|
306
|
+
async getCustomer(context) {
|
|
307
|
+
const rows = await deps.db
|
|
308
|
+
.select()
|
|
309
|
+
.from(billingCustomers)
|
|
310
|
+
.where(eq(billingCustomers.workspaceId, context.workspaceId))
|
|
311
|
+
.limit(1);
|
|
312
|
+
return rows[0];
|
|
313
|
+
},
|
|
314
|
+
async ensureCustomer(context, options = {}) {
|
|
315
|
+
const existing = await this.getCustomer(context);
|
|
316
|
+
if (existing !== undefined) {
|
|
317
|
+
return existing;
|
|
318
|
+
}
|
|
319
|
+
const workspaceRows = await deps.db
|
|
320
|
+
.select({ name: workspaces.name })
|
|
321
|
+
.from(workspaces)
|
|
322
|
+
.where(eq(workspaces.id, context.workspaceId))
|
|
323
|
+
.limit(1);
|
|
324
|
+
const workspace = workspaceRows[0];
|
|
325
|
+
if (workspace === undefined) {
|
|
326
|
+
throw new NotFoundError("Workspace not found.");
|
|
327
|
+
}
|
|
328
|
+
const created = await deps.provider.createCustomer({
|
|
329
|
+
workspaceId: context.workspaceId,
|
|
330
|
+
workspaceName: workspace.name,
|
|
331
|
+
...(options.email !== undefined ? { email: options.email } : {}),
|
|
332
|
+
});
|
|
333
|
+
try {
|
|
334
|
+
const [customer] = await deps.db
|
|
335
|
+
.insert(billingCustomers)
|
|
336
|
+
.values({
|
|
337
|
+
workspaceId: context.workspaceId,
|
|
338
|
+
provider: providerName(),
|
|
339
|
+
providerCustomerId: created.providerCustomerId,
|
|
340
|
+
email: options.email ?? null,
|
|
341
|
+
})
|
|
342
|
+
.returning();
|
|
343
|
+
return customer;
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
/**
|
|
347
|
+
* A concurrent request created this workspace's customer first. Its row
|
|
348
|
+
* is equally valid, so adopt it rather than failing the caller.
|
|
349
|
+
*
|
|
350
|
+
* Matched on the workspace constraint specifically. A violation of
|
|
351
|
+
* `billing_customers_provider_customer_unique` means the provider handed
|
|
352
|
+
* back an id already bound to a *different* workspace — a genuine fault
|
|
353
|
+
* that must surface, not a race to absorb.
|
|
354
|
+
*/
|
|
355
|
+
if (isUniqueViolation(error, "billing_customers_workspace_id_unique")) {
|
|
356
|
+
const raced = await this.getCustomer(context);
|
|
357
|
+
if (raced !== undefined) {
|
|
358
|
+
return raced;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
throw error;
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
async createCheckout(context, options) {
|
|
365
|
+
const plan = await planAdmin.getByKey(options.planKey);
|
|
366
|
+
if (plan === undefined) {
|
|
367
|
+
throw new NotFoundError(`Plan "${options.planKey}" not found.`);
|
|
368
|
+
}
|
|
369
|
+
if (!plan.isActive) {
|
|
370
|
+
throw new ConflictError(`Plan "${options.planKey}" is no longer available.`);
|
|
371
|
+
}
|
|
372
|
+
const customer = await this.ensureCustomer(context);
|
|
373
|
+
return deps.provider.createCheckout({
|
|
374
|
+
workspaceId: context.workspaceId,
|
|
375
|
+
providerCustomerId: customer.providerCustomerId,
|
|
376
|
+
plan,
|
|
377
|
+
successUrl: options.successUrl,
|
|
378
|
+
cancelUrl: options.cancelUrl,
|
|
379
|
+
...(options.quantity !== undefined ? { quantity: options.quantity } : {}),
|
|
380
|
+
...(options.metadata !== undefined ? { metadata: options.metadata } : {}),
|
|
381
|
+
});
|
|
382
|
+
},
|
|
383
|
+
async getSubscription(context) {
|
|
384
|
+
return findLiveSubscription(context.workspaceId);
|
|
385
|
+
},
|
|
386
|
+
async cancelSubscription(context, options = {}) {
|
|
387
|
+
const live = await findLiveSubscription(context.workspaceId);
|
|
388
|
+
if (live === undefined) {
|
|
389
|
+
throw new NotFoundError("No active subscription for this workspace.");
|
|
390
|
+
}
|
|
391
|
+
const atPeriodEnd = options.atPeriodEnd ?? true;
|
|
392
|
+
// Only when the provider actually supports it; see BillingProvider.
|
|
393
|
+
if (deps.provider.cancelSubscription !== undefined) {
|
|
394
|
+
await deps.provider.cancelSubscription({
|
|
395
|
+
providerSubscriptionId: live.subscription.providerSubscriptionId,
|
|
396
|
+
atPeriodEnd,
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Cancelling at period end keeps the subscription live — and therefore
|
|
401
|
+
* entitling — until the paid period expires. Cancelling immediately ends
|
|
402
|
+
* entitlements now.
|
|
403
|
+
*/
|
|
404
|
+
const events = outbox();
|
|
405
|
+
const updated = await deps.db.transaction(async (tx) => {
|
|
406
|
+
const [row] = await tx
|
|
407
|
+
.update(subscriptions)
|
|
408
|
+
.set(atPeriodEnd
|
|
409
|
+
? { cancelAtPeriodEnd: true, updatedAt: new Date() }
|
|
410
|
+
: { status: "canceled", canceledAt: new Date(), updatedAt: new Date() })
|
|
411
|
+
.where(eq(subscriptions.id, live.subscription.id))
|
|
412
|
+
.returning();
|
|
413
|
+
await events.record({
|
|
414
|
+
type: "billing.subscription.canceled",
|
|
415
|
+
workspaceId: context.workspaceId,
|
|
416
|
+
actorId: context.userId,
|
|
417
|
+
data: {
|
|
418
|
+
subscriptionId: live.subscription.id,
|
|
419
|
+
planKey: live.plan.key,
|
|
420
|
+
atPeriodEnd,
|
|
421
|
+
},
|
|
422
|
+
}, tx);
|
|
423
|
+
return row;
|
|
424
|
+
});
|
|
425
|
+
await events.flush();
|
|
426
|
+
return updated;
|
|
427
|
+
},
|
|
428
|
+
async getPortal(context, options) {
|
|
429
|
+
if (deps.provider.getPortalUrl === undefined) {
|
|
430
|
+
return { url: undefined };
|
|
431
|
+
}
|
|
432
|
+
const customer = await this.getCustomer(context);
|
|
433
|
+
if (customer === undefined) {
|
|
434
|
+
throw new NotFoundError("This workspace has no billing customer.");
|
|
435
|
+
}
|
|
436
|
+
const url = await deps.provider.getPortalUrl({
|
|
437
|
+
providerCustomerId: customer.providerCustomerId,
|
|
438
|
+
returnUrl: options.returnUrl,
|
|
439
|
+
});
|
|
440
|
+
return { url };
|
|
441
|
+
},
|
|
442
|
+
plans: planAdmin,
|
|
443
|
+
webhooks,
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
/** Validate an entitlement definition set before it reaches the database. */
|
|
447
|
+
export function assertEntitlementDefinitions(definitions) {
|
|
448
|
+
const seen = new Set();
|
|
449
|
+
for (const definition of definitions) {
|
|
450
|
+
if (seen.has(definition.key)) {
|
|
451
|
+
throw new InvalidInputError(`Duplicate entitlement key "${definition.key}".`);
|
|
452
|
+
}
|
|
453
|
+
seen.add(definition.key);
|
|
454
|
+
if (definition.kind === "limit" &&
|
|
455
|
+
definition.limitValue !== undefined &&
|
|
456
|
+
definition.limitValue !== null &&
|
|
457
|
+
(!Number.isInteger(definition.limitValue) || definition.limitValue < 0)) {
|
|
458
|
+
throw new InvalidInputError(`Limit for "${definition.key}" must be a non-negative integer or null for unlimited.`);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
/** Exposed for diagnostics: how many events are awaiting replay. */
|
|
463
|
+
export async function countFailedBillingEvents(db) {
|
|
464
|
+
const rows = await db
|
|
465
|
+
.select({ count: sql `count(*)::int` })
|
|
466
|
+
.from(billingEvents)
|
|
467
|
+
.where(eq(billingEvents.status, "failed"));
|
|
468
|
+
return rows[0]?.count ?? 0;
|
|
469
|
+
}
|
|
470
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/billing/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type CommandRunner } from "../docker.ts";
|
|
2
|
+
import { type StackConfig } from "../templates.ts";
|
|
3
|
+
/** Where the generated stack lives, relative to the project root. */
|
|
4
|
+
export declare const STACK_DIRECTORY = ".saas-core";
|
|
5
|
+
export interface DevOptions {
|
|
6
|
+
readonly cwd?: string;
|
|
7
|
+
readonly runner?: CommandRunner;
|
|
8
|
+
readonly projectName?: string;
|
|
9
|
+
readonly domain?: string;
|
|
10
|
+
readonly appPort?: number;
|
|
11
|
+
readonly postgresPort?: number;
|
|
12
|
+
readonly minioPort?: number;
|
|
13
|
+
/** Rewrite the generated files even if they already exist. */
|
|
14
|
+
readonly force?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface WrittenFile {
|
|
17
|
+
readonly path: string;
|
|
18
|
+
readonly action: "created" | "updated" | "kept";
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Write the stack files.
|
|
22
|
+
*
|
|
23
|
+
* Existing files are left alone unless `--force`. They are meant to be edited —
|
|
24
|
+
* a developer who changed the Caddyfile to add a second host should not lose it
|
|
25
|
+
* to the next `up`.
|
|
26
|
+
*/
|
|
27
|
+
export declare function writeStackFiles(cwd: string, options?: DevOptions): Promise<{
|
|
28
|
+
config: StackConfig;
|
|
29
|
+
directory: string;
|
|
30
|
+
files: WrittenFile[];
|
|
31
|
+
}>;
|
|
32
|
+
export declare function devUp(options?: DevOptions): Promise<void>;
|
|
33
|
+
export declare function devDown(options?: DevOptions & {
|
|
34
|
+
volumes?: boolean;
|
|
35
|
+
}): Promise<void>;
|
|
36
|
+
export declare function devStatus(options?: DevOptions): Promise<void>;
|
|
37
|
+
export declare function devLogs(options?: DevOptions & {
|
|
38
|
+
follow?: boolean;
|
|
39
|
+
service?: string;
|
|
40
|
+
}): Promise<void>;
|
|
41
|
+
/** Write the files without starting anything. For inspecting or editing first. */
|
|
42
|
+
export declare function devInit(options?: DevOptions): Promise<void>;
|
|
43
|
+
//# sourceMappingURL=dev.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,aAAa,EAEnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAEzB,qEAAqE;AACrE,eAAO,MAAM,eAAe,eAAe,CAAC;AAE5C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AA0BD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;CACjD;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC,CA2B3E;AAwCD,wBAAsB,KAAK,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEnE;AAED,wBAAsB,OAAO,CAAC,OAAO,GAAE,UAAU,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC7F;AAED,wBAAsB,SAAS,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBvE;AAED,wBAAsB,OAAO,CAC3B,OAAO,GAAE,UAAU,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAChE,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,kFAAkF;AAClF,wBAAsB,OAAO,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBrE"}
|