@baruk/core 0.3.0 → 0.4.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/.baruk-provenance.json +10 -0
- package/CHANGELOG.md +97 -0
- package/README.md +9 -2
- package/dist/auth/password-reset.d.ts +30 -1
- package/dist/auth/password-reset.d.ts.map +1 -1
- package/dist/auth/password-reset.js +139 -11
- package/dist/auth/password-reset.js.map +1 -1
- package/dist/auth/service.d.ts +39 -2
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +75 -10
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +334 -0
- package/dist/billing/ar-repository.d.ts.map +1 -0
- package/dist/billing/ar-repository.js +707 -0
- package/dist/billing/ar-repository.js.map +1 -0
- package/dist/billing/auto-generation.d.ts +87 -0
- package/dist/billing/auto-generation.d.ts.map +1 -0
- package/dist/billing/auto-generation.js +181 -0
- package/dist/billing/auto-generation.js.map +1 -0
- package/dist/billing/live-guard.d.ts +64 -0
- package/dist/billing/live-guard.d.ts.map +1 -0
- package/dist/billing/live-guard.js +68 -0
- package/dist/billing/live-guard.js.map +1 -0
- package/dist/billing/payment-means-catalog.d.ts +17 -0
- package/dist/billing/payment-means-catalog.d.ts.map +1 -0
- package/dist/billing/payment-means-catalog.js +21 -0
- package/dist/billing/payment-means-catalog.js.map +1 -0
- package/dist/billing/payment-means.d.ts +38 -0
- package/dist/billing/payment-means.d.ts.map +1 -0
- package/dist/billing/payment-means.js +29 -0
- package/dist/billing/payment-means.js.map +1 -0
- package/dist/billing/payment-rail.d.ts +118 -0
- package/dist/billing/payment-rail.d.ts.map +1 -0
- package/dist/billing/payment-rail.js +295 -0
- package/dist/billing/payment-rail.js.map +1 -0
- package/dist/billing/provider/asaas.d.ts +46 -1
- package/dist/billing/provider/asaas.d.ts.map +1 -1
- package/dist/billing/provider/asaas.js +194 -14
- package/dist/billing/provider/asaas.js.map +1 -1
- package/dist/billing/provider/manual.js +1 -1
- package/dist/billing/provider/manual.js.map +1 -1
- package/dist/billing/provider/types.d.ts +115 -8
- package/dist/billing/provider/types.d.ts.map +1 -1
- package/dist/billing/provider-account.d.ts +89 -0
- package/dist/billing/provider-account.d.ts.map +1 -0
- package/dist/billing/provider-account.js +161 -0
- package/dist/billing/provider-account.js.map +1 -0
- package/dist/billing/provider-onboarding.d.ts +67 -0
- package/dist/billing/provider-onboarding.d.ts.map +1 -0
- package/dist/billing/provider-onboarding.js +234 -0
- package/dist/billing/provider-onboarding.js.map +1 -0
- package/dist/billing/receivable.d.ts +5 -1
- package/dist/billing/receivable.d.ts.map +1 -1
- package/dist/billing/reconcile.d.ts +58 -0
- package/dist/billing/reconcile.d.ts.map +1 -0
- package/dist/billing/reconcile.js +138 -0
- package/dist/billing/reconcile.js.map +1 -0
- package/dist/billing/repository.d.ts +90 -1
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +148 -19
- package/dist/billing/repository.js.map +1 -1
- package/dist/cjs/auth/password-reset.js +141 -11
- package/dist/cjs/auth/password-reset.js.map +1 -1
- package/dist/cjs/auth/service.js +75 -9
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +728 -0
- package/dist/cjs/billing/ar-repository.js.map +1 -0
- package/dist/cjs/billing/auto-generation.js +186 -0
- package/dist/cjs/billing/auto-generation.js.map +1 -0
- package/dist/cjs/billing/live-guard.js +72 -0
- package/dist/cjs/billing/live-guard.js.map +1 -0
- package/dist/cjs/billing/payment-means-catalog.js +25 -0
- package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
- package/dist/cjs/billing/payment-means.js +33 -0
- package/dist/cjs/billing/payment-means.js.map +1 -0
- package/dist/cjs/billing/payment-rail.js +301 -0
- package/dist/cjs/billing/payment-rail.js.map +1 -0
- package/dist/cjs/billing/provider/asaas.js +194 -14
- package/dist/cjs/billing/provider/asaas.js.map +1 -1
- package/dist/cjs/billing/provider/manual.js +1 -1
- package/dist/cjs/billing/provider/manual.js.map +1 -1
- package/dist/cjs/billing/provider-account.js +170 -0
- package/dist/cjs/billing/provider-account.js.map +1 -0
- package/dist/cjs/billing/provider-onboarding.js +239 -0
- package/dist/cjs/billing/provider-onboarding.js.map +1 -0
- package/dist/cjs/billing/reconcile.js +143 -0
- package/dist/cjs/billing/reconcile.js.map +1 -0
- package/dist/cjs/billing/repository.js +150 -18
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/repository.js +96 -20
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +140 -0
- package/dist/cjs/collection/branding.js.map +1 -0
- package/dist/cjs/collection/channel-accounts.js +137 -0
- package/dist/cjs/collection/channel-accounts.js.map +1 -0
- package/dist/cjs/collection/channel.js +17 -0
- package/dist/cjs/collection/channel.js.map +1 -0
- package/dist/cjs/collection/communication-bridge.js +140 -0
- package/dist/cjs/collection/communication-bridge.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +193 -0
- package/dist/cjs/collection/communication-runtime.js.map +1 -0
- package/dist/cjs/collection/consent-repository.js +84 -0
- package/dist/cjs/collection/consent-repository.js.map +1 -0
- package/dist/cjs/collection/copy.js +125 -0
- package/dist/cjs/collection/copy.js.map +1 -0
- package/dist/cjs/collection/delivery-callback.js +151 -0
- package/dist/cjs/collection/delivery-callback.js.map +1 -0
- package/dist/cjs/collection/email-layout.js +252 -0
- package/dist/cjs/collection/email-layout.js.map +1 -0
- package/dist/cjs/collection/engine.js +414 -0
- package/dist/cjs/collection/engine.js.map +1 -0
- package/dist/cjs/collection/format.js +76 -0
- package/dist/cjs/collection/format.js.map +1 -0
- package/dist/cjs/collection/payment-block.js +3 -0
- package/dist/cjs/collection/payment-block.js.map +1 -0
- package/dist/cjs/collection/policy.js +147 -0
- package/dist/cjs/collection/policy.js.map +1 -0
- package/dist/cjs/collection/repository.js +260 -0
- package/dist/cjs/collection/repository.js.map +1 -0
- package/dist/cjs/collection/subject.js +104 -0
- package/dist/cjs/collection/subject.js.map +1 -0
- package/dist/cjs/collection/template-catalog.js +165 -0
- package/dist/cjs/collection/template-catalog.js.map +1 -0
- package/dist/cjs/collection/template.js +78 -0
- package/dist/cjs/collection/template.js.map +1 -0
- package/dist/cjs/communication/adapters/email.js +132 -0
- package/dist/cjs/communication/adapters/email.js.map +1 -0
- package/dist/cjs/communication/adapters/sms.js +127 -0
- package/dist/cjs/communication/adapters/sms.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp.js +213 -0
- package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
- package/dist/cjs/communication/audit.js +61 -0
- package/dist/cjs/communication/audit.js.map +1 -0
- package/dist/cjs/communication/capabilities.js +76 -0
- package/dist/cjs/communication/capabilities.js.map +1 -0
- package/dist/cjs/communication/channel.js +53 -0
- package/dist/cjs/communication/channel.js.map +1 -0
- package/dist/cjs/communication/claim.js +228 -0
- package/dist/cjs/communication/claim.js.map +1 -0
- package/dist/cjs/communication/consent.js +43 -0
- package/dist/cjs/communication/consent.js.map +1 -0
- package/dist/cjs/communication/context.js +45 -0
- package/dist/cjs/communication/context.js.map +1 -0
- package/dist/cjs/communication/credentials.js +121 -0
- package/dist/cjs/communication/credentials.js.map +1 -0
- package/dist/cjs/communication/dry-run-scenario.js +161 -0
- package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
- package/dist/cjs/communication/dry-run.js +97 -0
- package/dist/cjs/communication/dry-run.js.map +1 -0
- package/dist/cjs/communication/engine.js +483 -0
- package/dist/cjs/communication/engine.js.map +1 -0
- package/dist/cjs/communication/graph.js +50 -0
- package/dist/cjs/communication/graph.js.map +1 -0
- package/dist/cjs/communication/idempotency.js +26 -0
- package/dist/cjs/communication/idempotency.js.map +1 -0
- package/dist/cjs/communication/identity.js +110 -0
- package/dist/cjs/communication/identity.js.map +1 -0
- package/dist/cjs/communication/index.js +135 -0
- package/dist/cjs/communication/index.js.map +1 -0
- package/dist/cjs/communication/onboarding.js +297 -0
- package/dist/cjs/communication/onboarding.js.map +1 -0
- package/dist/cjs/communication/policy.js +16 -0
- package/dist/cjs/communication/policy.js.map +1 -0
- package/dist/cjs/communication/routing.js +77 -0
- package/dist/cjs/communication/routing.js.map +1 -0
- package/dist/cjs/communication/sender-profile.js +128 -0
- package/dist/cjs/communication/sender-profile.js.map +1 -0
- package/dist/cjs/communication/status.js +86 -0
- package/dist/cjs/communication/status.js.map +1 -0
- package/dist/cjs/communication/stores/onboarding.js +135 -0
- package/dist/cjs/communication/stores/onboarding.js.map +1 -0
- package/dist/cjs/communication/stores/postgres.js +458 -0
- package/dist/cjs/communication/stores/postgres.js.map +1 -0
- package/dist/cjs/communication/stores/routing.js +334 -0
- package/dist/cjs/communication/stores/routing.js.map +1 -0
- package/dist/cjs/communication/stores/secrets.js +126 -0
- package/dist/cjs/communication/stores/secrets.js.map +1 -0
- package/dist/cjs/communication/template-provider.js +22 -0
- package/dist/cjs/communication/template-provider.js.map +1 -0
- package/dist/cjs/communication/template.js +63 -0
- package/dist/cjs/communication/template.js.map +1 -0
- package/dist/cjs/communication/webhook-subscription.js +258 -0
- package/dist/cjs/communication/webhook-subscription.js.map +1 -0
- package/dist/cjs/communication/webhook.js +292 -0
- package/dist/cjs/communication/webhook.js.map +1 -0
- package/dist/cjs/competence/repository.js +309 -0
- package/dist/cjs/competence/repository.js.map +1 -0
- package/dist/cjs/contacts/phone.js +192 -0
- package/dist/cjs/contacts/phone.js.map +1 -0
- package/dist/cjs/db/seed-catalog.js +48 -0
- package/dist/cjs/db/seed-catalog.js.map +1 -0
- package/dist/cjs/db/seed.js +15 -7
- package/dist/cjs/db/seed.js.map +1 -1
- package/dist/cjs/documents/repository.js +244 -0
- package/dist/cjs/documents/repository.js.map +1 -0
- package/dist/cjs/documents/requests.js +136 -0
- package/dist/cjs/documents/requests.js.map +1 -0
- package/dist/cjs/index.js +427 -48
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/company.js +36 -0
- package/dist/cjs/legal/company.js.map +1 -0
- package/dist/cjs/legal/documents.js +671 -0
- package/dist/cjs/legal/documents.js.map +1 -0
- package/dist/cjs/legal/index.js +15 -0
- package/dist/cjs/legal/index.js.map +1 -0
- package/dist/cjs/legal/types.js +34 -0
- package/dist/cjs/legal/types.js.map +1 -0
- package/dist/cjs/mail/auth-templates.js +29 -0
- package/dist/cjs/mail/auth-templates.js.map +1 -0
- package/dist/cjs/mail/dedup-store.js +12 -51
- package/dist/cjs/mail/dedup-store.js.map +1 -1
- package/dist/cjs/mail/index.js +16 -4
- package/dist/cjs/mail/index.js.map +1 -1
- package/dist/cjs/mail/provider.js +12 -247
- package/dist/cjs/mail/provider.js.map +1 -1
- package/dist/cjs/mail/resend.js +14 -18
- package/dist/cjs/mail/resend.js.map +1 -1
- package/dist/cjs/mail/sender-resolver.js +12 -11
- package/dist/cjs/mail/sender-resolver.js.map +1 -1
- package/dist/cjs/mail/template-renderer.js +11 -16
- package/dist/cjs/mail/template-renderer.js.map +1 -1
- package/dist/cjs/mail/transactional-outbound.js +117 -0
- package/dist/cjs/mail/transactional-outbound.js.map +1 -0
- package/dist/cjs/mail/types.js +8 -35
- package/dist/cjs/mail/types.js.map +1 -1
- package/dist/cjs/portal/provisioning.js +144 -0
- package/dist/cjs/portal/provisioning.js.map +1 -0
- package/dist/cjs/pricing-engine/canonical.js +42 -0
- package/dist/cjs/pricing-engine/canonical.js.map +1 -0
- package/dist/cjs/pricing-engine/errors.js +6 -1
- package/dist/cjs/pricing-engine/errors.js.map +1 -1
- package/dist/cjs/pricing-engine/index.js +12 -1
- package/dist/cjs/pricing-engine/index.js.map +1 -1
- package/dist/cjs/pricing-engine/pipeline.js +200 -26
- package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
- package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
- package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
- package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
- package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/cjs/rbac/authorize.js +28 -0
- package/dist/cjs/rbac/authorize.js.map +1 -1
- package/dist/cjs/rbac/catalog.js +67 -1
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/rbac/workload-provisioning.js +160 -0
- package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
- package/dist/cjs/rbac/workload.js +191 -0
- package/dist/cjs/rbac/workload.js.map +1 -0
- package/dist/cjs/storage/checksum.js +15 -0
- package/dist/cjs/storage/checksum.js.map +1 -0
- package/dist/cjs/storage/key.js +72 -0
- package/dist/cjs/storage/key.js.map +1 -0
- package/dist/cjs/storage/local.js +100 -0
- package/dist/cjs/storage/local.js.map +1 -0
- package/dist/cjs/storage/r2.js +181 -0
- package/dist/cjs/storage/r2.js.map +1 -0
- package/dist/cjs/storage/registry.js +41 -0
- package/dist/cjs/storage/registry.js.map +1 -0
- package/dist/cjs/storage/types.js +50 -0
- package/dist/cjs/storage/types.js.map +1 -0
- package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
- package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
- package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/registry.js +17 -0
- package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
- package/dist/cjs/subscription-billing/service.js +57 -8
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/subscription-billing/types.js.map +1 -1
- package/dist/cjs/tenancy/provisioning.js +32 -8
- package/dist/cjs/tenancy/provisioning.js.map +1 -1
- package/dist/cjs/users/repository.js +119 -2
- package/dist/cjs/users/repository.js.map +1 -1
- package/dist/cjs/vault/repository.js +81 -0
- package/dist/cjs/vault/repository.js.map +1 -1
- package/dist/clients/repository.d.ts +42 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +94 -21
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +72 -0
- package/dist/collection/branding.d.ts.map +1 -0
- package/dist/collection/branding.js +136 -0
- package/dist/collection/branding.js.map +1 -0
- package/dist/collection/channel-accounts.d.ts +57 -0
- package/dist/collection/channel-accounts.d.ts.map +1 -0
- package/dist/collection/channel-accounts.js +133 -0
- package/dist/collection/channel-accounts.js.map +1 -0
- package/dist/collection/channel.d.ts +24 -0
- package/dist/collection/channel.d.ts.map +1 -0
- package/dist/collection/channel.js +16 -0
- package/dist/collection/channel.js.map +1 -0
- package/dist/collection/communication-bridge.d.ts +66 -0
- package/dist/collection/communication-bridge.d.ts.map +1 -0
- package/dist/collection/communication-bridge.js +134 -0
- package/dist/collection/communication-bridge.js.map +1 -0
- package/dist/collection/communication-runtime.d.ts +95 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -0
- package/dist/collection/communication-runtime.js +187 -0
- package/dist/collection/communication-runtime.js.map +1 -0
- package/dist/collection/consent-repository.d.ts +32 -0
- package/dist/collection/consent-repository.d.ts.map +1 -0
- package/dist/collection/consent-repository.js +79 -0
- package/dist/collection/consent-repository.js.map +1 -0
- package/dist/collection/copy.d.ts +50 -0
- package/dist/collection/copy.d.ts.map +1 -0
- package/dist/collection/copy.js +122 -0
- package/dist/collection/copy.js.map +1 -0
- package/dist/collection/delivery-callback.d.ts +49 -0
- package/dist/collection/delivery-callback.d.ts.map +1 -0
- package/dist/collection/delivery-callback.js +147 -0
- package/dist/collection/delivery-callback.js.map +1 -0
- package/dist/collection/email-layout.d.ts +45 -0
- package/dist/collection/email-layout.d.ts.map +1 -0
- package/dist/collection/email-layout.js +247 -0
- package/dist/collection/email-layout.js.map +1 -0
- package/dist/collection/engine.d.ts +177 -0
- package/dist/collection/engine.d.ts.map +1 -0
- package/dist/collection/engine.js +407 -0
- package/dist/collection/engine.js.map +1 -0
- package/dist/collection/format.d.ts +32 -0
- package/dist/collection/format.d.ts.map +1 -0
- package/dist/collection/format.js +70 -0
- package/dist/collection/format.js.map +1 -0
- package/dist/collection/payment-block.d.ts +24 -0
- package/dist/collection/payment-block.d.ts.map +1 -0
- package/dist/collection/payment-block.js +2 -0
- package/dist/collection/payment-block.js.map +1 -0
- package/dist/collection/policy.d.ts +53 -0
- package/dist/collection/policy.d.ts.map +1 -0
- package/dist/collection/policy.js +141 -0
- package/dist/collection/policy.js.map +1 -0
- package/dist/collection/repository.d.ts +129 -0
- package/dist/collection/repository.d.ts.map +1 -0
- package/dist/collection/repository.js +246 -0
- package/dist/collection/repository.js.map +1 -0
- package/dist/collection/subject.d.ts +66 -0
- package/dist/collection/subject.d.ts.map +1 -0
- package/dist/collection/subject.js +99 -0
- package/dist/collection/subject.js.map +1 -0
- package/dist/collection/template-catalog.d.ts +16 -0
- package/dist/collection/template-catalog.d.ts.map +1 -0
- package/dist/collection/template-catalog.js +162 -0
- package/dist/collection/template-catalog.js.map +1 -0
- package/dist/collection/template.d.ts +37 -0
- package/dist/collection/template.d.ts.map +1 -0
- package/dist/collection/template.js +73 -0
- package/dist/collection/template.js.map +1 -0
- package/dist/communication/adapters/email.d.ts +28 -0
- package/dist/communication/adapters/email.d.ts.map +1 -0
- package/dist/communication/adapters/email.js +129 -0
- package/dist/communication/adapters/email.js.map +1 -0
- package/dist/communication/adapters/sms.d.ts +95 -0
- package/dist/communication/adapters/sms.d.ts.map +1 -0
- package/dist/communication/adapters/sms.js +121 -0
- package/dist/communication/adapters/sms.js.map +1 -0
- package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
- package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-language.js +36 -0
- package/dist/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.js +97 -0
- package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/communication/adapters/whatsapp.d.ts +29 -0
- package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp.js +210 -0
- package/dist/communication/adapters/whatsapp.js.map +1 -0
- package/dist/communication/audit.d.ts +105 -0
- package/dist/communication/audit.d.ts.map +1 -0
- package/dist/communication/audit.js +56 -0
- package/dist/communication/audit.js.map +1 -0
- package/dist/communication/capabilities.d.ts +88 -0
- package/dist/communication/capabilities.d.ts.map +1 -0
- package/dist/communication/capabilities.js +72 -0
- package/dist/communication/capabilities.js.map +1 -0
- package/dist/communication/channel.d.ts +125 -0
- package/dist/communication/channel.d.ts.map +1 -0
- package/dist/communication/channel.js +47 -0
- package/dist/communication/channel.js.map +1 -0
- package/dist/communication/claim.d.ts +368 -0
- package/dist/communication/claim.d.ts.map +1 -0
- package/dist/communication/claim.js +224 -0
- package/dist/communication/claim.js.map +1 -0
- package/dist/communication/consent.d.ts +65 -0
- package/dist/communication/consent.d.ts.map +1 -0
- package/dist/communication/consent.js +40 -0
- package/dist/communication/consent.js.map +1 -0
- package/dist/communication/context.d.ts +48 -0
- package/dist/communication/context.d.ts.map +1 -0
- package/dist/communication/context.js +41 -0
- package/dist/communication/context.js.map +1 -0
- package/dist/communication/credentials.d.ts +74 -0
- package/dist/communication/credentials.d.ts.map +1 -0
- package/dist/communication/credentials.js +115 -0
- package/dist/communication/credentials.js.map +1 -0
- package/dist/communication/dry-run-scenario.d.ts +37 -0
- package/dist/communication/dry-run-scenario.d.ts.map +1 -0
- package/dist/communication/dry-run-scenario.js +158 -0
- package/dist/communication/dry-run-scenario.js.map +1 -0
- package/dist/communication/dry-run.d.ts +40 -0
- package/dist/communication/dry-run.d.ts.map +1 -0
- package/dist/communication/dry-run.js +92 -0
- package/dist/communication/dry-run.js.map +1 -0
- package/dist/communication/engine.d.ts +153 -0
- package/dist/communication/engine.d.ts.map +1 -0
- package/dist/communication/engine.js +480 -0
- package/dist/communication/engine.js.map +1 -0
- package/dist/communication/graph.d.ts +38 -0
- package/dist/communication/graph.d.ts.map +1 -0
- package/dist/communication/graph.js +45 -0
- package/dist/communication/graph.js.map +1 -0
- package/dist/communication/idempotency.d.ts +33 -0
- package/dist/communication/idempotency.d.ts.map +1 -0
- package/dist/communication/idempotency.js +23 -0
- package/dist/communication/idempotency.js.map +1 -0
- package/dist/communication/identity.d.ts +127 -0
- package/dist/communication/identity.d.ts.map +1 -0
- package/dist/communication/identity.js +105 -0
- package/dist/communication/identity.js.map +1 -0
- package/dist/communication/index.d.ts +66 -0
- package/dist/communication/index.d.ts.map +1 -0
- package/dist/communication/index.js +42 -0
- package/dist/communication/index.js.map +1 -0
- package/dist/communication/onboarding.d.ts +223 -0
- package/dist/communication/onboarding.d.ts.map +1 -0
- package/dist/communication/onboarding.js +287 -0
- package/dist/communication/onboarding.js.map +1 -0
- package/dist/communication/policy.d.ts +99 -0
- package/dist/communication/policy.d.ts.map +1 -0
- package/dist/communication/policy.js +13 -0
- package/dist/communication/policy.js.map +1 -0
- package/dist/communication/routing.d.ts +99 -0
- package/dist/communication/routing.d.ts.map +1 -0
- package/dist/communication/routing.js +73 -0
- package/dist/communication/routing.js.map +1 -0
- package/dist/communication/sender-profile.d.ts +100 -0
- package/dist/communication/sender-profile.d.ts.map +1 -0
- package/dist/communication/sender-profile.js +123 -0
- package/dist/communication/sender-profile.js.map +1 -0
- package/dist/communication/status.d.ts +48 -0
- package/dist/communication/status.d.ts.map +1 -0
- package/dist/communication/status.js +79 -0
- package/dist/communication/status.js.map +1 -0
- package/dist/communication/stores/onboarding.d.ts +88 -0
- package/dist/communication/stores/onboarding.d.ts.map +1 -0
- package/dist/communication/stores/onboarding.js +127 -0
- package/dist/communication/stores/onboarding.js.map +1 -0
- package/dist/communication/stores/postgres.d.ts +81 -0
- package/dist/communication/stores/postgres.d.ts.map +1 -0
- package/dist/communication/stores/postgres.js +453 -0
- package/dist/communication/stores/postgres.js.map +1 -0
- package/dist/communication/stores/routing.d.ts +169 -0
- package/dist/communication/stores/routing.d.ts.map +1 -0
- package/dist/communication/stores/routing.js +324 -0
- package/dist/communication/stores/routing.js.map +1 -0
- package/dist/communication/stores/secrets.d.ts +89 -0
- package/dist/communication/stores/secrets.d.ts.map +1 -0
- package/dist/communication/stores/secrets.js +122 -0
- package/dist/communication/stores/secrets.js.map +1 -0
- package/dist/communication/template-provider.d.ts +85 -0
- package/dist/communication/template-provider.d.ts.map +1 -0
- package/dist/communication/template-provider.js +21 -0
- package/dist/communication/template-provider.js.map +1 -0
- package/dist/communication/template.d.ts +87 -0
- package/dist/communication/template.d.ts.map +1 -0
- package/dist/communication/template.js +59 -0
- package/dist/communication/template.js.map +1 -0
- package/dist/communication/webhook-subscription.d.ts +156 -0
- package/dist/communication/webhook-subscription.d.ts.map +1 -0
- package/dist/communication/webhook-subscription.js +252 -0
- package/dist/communication/webhook-subscription.js.map +1 -0
- package/dist/communication/webhook.d.ts +121 -0
- package/dist/communication/webhook.d.ts.map +1 -0
- package/dist/communication/webhook.js +283 -0
- package/dist/communication/webhook.js.map +1 -0
- package/dist/competence/repository.d.ts +147 -0
- package/dist/competence/repository.d.ts.map +1 -0
- package/dist/competence/repository.js +294 -0
- package/dist/competence/repository.js.map +1 -0
- package/dist/contacts/phone.d.ts +70 -0
- package/dist/contacts/phone.d.ts.map +1 -0
- package/dist/contacts/phone.js +186 -0
- package/dist/contacts/phone.js.map +1 -0
- package/dist/db/migrate.js +17 -11
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/seed-catalog.d.ts +18 -0
- package/dist/db/seed-catalog.d.ts.map +1 -0
- package/dist/db/seed-catalog.js +45 -0
- package/dist/db/seed-catalog.js.map +1 -0
- package/dist/db/seed.js +16 -8
- package/dist/db/seed.js.map +1 -1
- package/dist/documents/repository.d.ts +97 -0
- package/dist/documents/repository.d.ts.map +1 -0
- package/dist/documents/repository.js +236 -0
- package/dist/documents/repository.js.map +1 -0
- package/dist/documents/requests.d.ts +73 -0
- package/dist/documents/requests.d.ts.map +1 -0
- package/dist/documents/requests.js +127 -0
- package/dist/documents/requests.js.map +1 -0
- package/dist/index.d.ts +113 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +104 -8
- package/dist/index.js.map +1 -1
- package/dist/legal/company.d.ts +32 -0
- package/dist/legal/company.d.ts.map +1 -0
- package/dist/legal/company.js +33 -0
- package/dist/legal/company.js.map +1 -0
- package/dist/legal/documents.d.ts +30 -0
- package/dist/legal/documents.d.ts.map +1 -0
- package/dist/legal/documents.js +666 -0
- package/dist/legal/documents.js.map +1 -0
- package/dist/legal/index.d.ts +5 -0
- package/dist/legal/index.d.ts.map +1 -0
- package/dist/legal/index.js +4 -0
- package/dist/legal/index.js.map +1 -0
- package/dist/legal/types.d.ts +145 -0
- package/dist/legal/types.d.ts.map +1 -0
- package/dist/legal/types.js +31 -0
- package/dist/legal/types.js.map +1 -0
- package/dist/mail/auth-templates.d.ts +15 -0
- package/dist/mail/auth-templates.d.ts.map +1 -0
- package/dist/mail/auth-templates.js +26 -0
- package/dist/mail/auth-templates.js.map +1 -0
- package/dist/mail/dedup-store.d.ts +1 -24
- package/dist/mail/dedup-store.d.ts.map +1 -1
- package/dist/mail/dedup-store.js +9 -48
- package/dist/mail/dedup-store.js.map +1 -1
- package/dist/mail/index.d.ts +2 -1
- package/dist/mail/index.d.ts.map +1 -1
- package/dist/mail/index.js +13 -2
- package/dist/mail/index.js.map +1 -1
- package/dist/mail/provider.d.ts +2 -30
- package/dist/mail/provider.d.ts.map +1 -1
- package/dist/mail/provider.js +10 -246
- package/dist/mail/provider.js.map +1 -1
- package/dist/mail/resend.d.ts +2 -12
- package/dist/mail/resend.d.ts.map +1 -1
- package/dist/mail/resend.js +11 -17
- package/dist/mail/resend.js.map +1 -1
- package/dist/mail/sender-resolver.d.ts +1 -7
- package/dist/mail/sender-resolver.d.ts.map +1 -1
- package/dist/mail/sender-resolver.js +11 -10
- package/dist/mail/sender-resolver.js.map +1 -1
- package/dist/mail/template-renderer.d.ts +1 -9
- package/dist/mail/template-renderer.d.ts.map +1 -1
- package/dist/mail/template-renderer.js +10 -15
- package/dist/mail/template-renderer.js.map +1 -1
- package/dist/mail/transactional-outbound.d.ts +115 -0
- package/dist/mail/transactional-outbound.d.ts.map +1 -0
- package/dist/mail/transactional-outbound.js +113 -0
- package/dist/mail/transactional-outbound.js.map +1 -0
- package/dist/mail/types.d.ts +2 -142
- package/dist/mail/types.d.ts.map +1 -1
- package/dist/mail/types.js +1 -33
- package/dist/mail/types.js.map +1 -1
- package/dist/portal/provisioning.d.ts +58 -0
- package/dist/portal/provisioning.d.ts.map +1 -0
- package/dist/portal/provisioning.js +139 -0
- package/dist/portal/provisioning.js.map +1 -0
- package/dist/pricing-engine/canonical.d.ts +14 -0
- package/dist/pricing-engine/canonical.d.ts.map +1 -0
- package/dist/pricing-engine/canonical.js +39 -0
- package/dist/pricing-engine/canonical.js.map +1 -0
- package/dist/pricing-engine/errors.d.ts.map +1 -1
- package/dist/pricing-engine/errors.js +6 -1
- package/dist/pricing-engine/errors.js.map +1 -1
- package/dist/pricing-engine/index.d.ts +12 -2
- package/dist/pricing-engine/index.d.ts.map +1 -1
- package/dist/pricing-engine/index.js +6 -1
- package/dist/pricing-engine/index.js.map +1 -1
- package/dist/pricing-engine/pipeline.d.ts.map +1 -1
- package/dist/pricing-engine/pipeline.js +202 -28
- package/dist/pricing-engine/pipeline.js.map +1 -1
- package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
- package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-adapter.js +75 -0
- package/dist/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/pricing-engine/shadow-diff.d.ts +26 -0
- package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-diff.js +52 -0
- package/dist/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/pricing-engine/shadow-facade.d.ts +42 -0
- package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-facade.js +82 -0
- package/dist/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.js +18 -0
- package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
- package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-metrics.js +31 -0
- package/dist/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.js +39 -0
- package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/pricing-engine/types.d.ts +2 -0
- package/dist/pricing-engine/types.d.ts.map +1 -1
- package/dist/rbac/authorize.d.ts +12 -0
- package/dist/rbac/authorize.d.ts.map +1 -1
- package/dist/rbac/authorize.js +27 -0
- package/dist/rbac/authorize.js.map +1 -1
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +67 -1
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/rbac/workload-provisioning.d.ts +66 -0
- package/dist/rbac/workload-provisioning.d.ts.map +1 -0
- package/dist/rbac/workload-provisioning.js +153 -0
- package/dist/rbac/workload-provisioning.js.map +1 -0
- package/dist/rbac/workload.d.ts +124 -0
- package/dist/rbac/workload.d.ts.map +1 -0
- package/dist/rbac/workload.js +184 -0
- package/dist/rbac/workload.js.map +1 -0
- package/dist/storage/checksum.d.ts +9 -0
- package/dist/storage/checksum.d.ts.map +1 -0
- package/dist/storage/checksum.js +12 -0
- package/dist/storage/checksum.js.map +1 -0
- package/dist/storage/key.d.ts +37 -0
- package/dist/storage/key.d.ts.map +1 -0
- package/dist/storage/key.js +67 -0
- package/dist/storage/key.js.map +1 -0
- package/dist/storage/local.d.ts +40 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +96 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/r2.d.ts +43 -0
- package/dist/storage/r2.d.ts.map +1 -0
- package/dist/storage/r2.js +177 -0
- package/dist/storage/r2.js.map +1 -0
- package/dist/storage/registry.d.ts +23 -0
- package/dist/storage/registry.d.ts.map +1 -0
- package/dist/storage/registry.js +37 -0
- package/dist/storage/registry.js.map +1 -0
- package/dist/storage/types.d.ts +67 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +45 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/subscription-billing/provider/asaas.d.ts +14 -0
- package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
- package/dist/subscription-billing/provider/asaas.js +32 -7
- package/dist/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/subscription-billing/provider/disabled.d.ts +9 -0
- package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
- package/dist/subscription-billing/provider/disabled.js +8 -0
- package/dist/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/subscription-billing/provider/registry.d.ts +10 -0
- package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
- package/dist/subscription-billing/provider/registry.js +17 -0
- package/dist/subscription-billing/provider/registry.js.map +1 -1
- package/dist/subscription-billing/service.d.ts +17 -1
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +57 -8
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/subscription-billing/types.d.ts +13 -0
- package/dist/subscription-billing/types.d.ts.map +1 -1
- package/dist/subscription-billing/types.js.map +1 -1
- package/dist/tenancy/provisioning.d.ts.map +1 -1
- package/dist/tenancy/provisioning.js +32 -8
- package/dist/tenancy/provisioning.js.map +1 -1
- package/dist/users/repository.d.ts +38 -0
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +118 -3
- package/dist/users/repository.js.map +1 -1
- package/dist/vault/repository.d.ts +67 -0
- package/dist/vault/repository.d.ts.map +1 -1
- package/dist/vault/repository.js +78 -0
- package/dist/vault/repository.js.map +1 -1
- package/package.json +19 -4
- package/src/db/migrations/0023_user_invite_activation.sql +15 -0
- package/src/db/migrations/0024_set_user_password_function.sql +32 -0
- package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
- package/src/db/migrations/0026_documents_and_competence.sql +353 -0
- package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
- package/src/db/migrations/0028_collection_engine.sql +94 -0
- package/src/db/migrations/0029_payment_rail.sql +107 -0
- package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
- package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
- package/src/db/migrations/0032_settlement_reversal.sql +76 -0
- package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
- package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
- package/src/db/migrations/0035_payment_account_environments.sql +61 -0
- package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
- package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
- package/src/db/migrations/0038_notification_channels.sql +175 -0
- package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
- package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
- package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
- package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
- package/src/db/migrations/0043_workload_identity.sql +105 -0
- package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
- package/dist/cjs/mail/resend-client.js +0 -103
- package/dist/cjs/mail/resend-client.js.map +0 -1
- package/dist/mail/resend-client.d.ts +0 -16
- package/dist/mail/resend-client.d.ts.map +0 -1
- package/dist/mail/resend-client.js +0 -100
- package/dist/mail/resend-client.js.map +0 -1
|
@@ -3,7 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.listTenantMembers = listTenantMembers;
|
|
4
4
|
exports.setUserRole = setUserRole;
|
|
5
5
|
exports.setMembershipStatus = setMembershipStatus;
|
|
6
|
+
exports.inviteUser = inviteUser;
|
|
7
|
+
exports.reissueStaffActivation = reissueStaffActivation;
|
|
6
8
|
const shared_1 = require("@baruk/shared");
|
|
9
|
+
const password_reset_js_1 = require("../auth/password-reset.js");
|
|
10
|
+
const audit_js_1 = require("../audit/audit.js");
|
|
7
11
|
const ADMIN_ROLE_KEYS = ['owner', 'admin'];
|
|
8
12
|
async function listTenantMembers(tx) {
|
|
9
13
|
const rows = await tx `
|
|
@@ -43,7 +47,9 @@ async function countActiveAdmins(tx, excludeUserId) {
|
|
|
43
47
|
async function setUserRole(tx, userId, roleKey) {
|
|
44
48
|
// Guard: não permitir rebaixar o último admin.
|
|
45
49
|
const isAdminTarget = ADMIN_ROLE_KEYS.includes(roleKey);
|
|
46
|
-
if (!isAdminTarget &&
|
|
50
|
+
if (!isAdminTarget &&
|
|
51
|
+
(await isUserAdmin(tx, userId)) &&
|
|
52
|
+
(await countActiveAdmins(tx, userId)) === 0) {
|
|
47
53
|
throw new shared_1.ConflictError('Não é possível rebaixar o último administrador do tenant');
|
|
48
54
|
}
|
|
49
55
|
const role = await tx `SELECT id FROM role WHERE key = ${roleKey} AND tenant_id IS NULL`;
|
|
@@ -69,7 +75,9 @@ async function isUserAdmin(tx, userId) {
|
|
|
69
75
|
}
|
|
70
76
|
/** Ativa/desativa (ou revoga) a membership. Bloqueia desativar o último admin. */
|
|
71
77
|
async function setMembershipStatus(tx, userId, status) {
|
|
72
|
-
if (status !== 'active' &&
|
|
78
|
+
if (status !== 'active' &&
|
|
79
|
+
(await isUserAdmin(tx, userId)) &&
|
|
80
|
+
(await countActiveAdmins(tx, userId)) === 0) {
|
|
73
81
|
throw new shared_1.ConflictError('Não é possível desativar o último administrador do tenant');
|
|
74
82
|
}
|
|
75
83
|
const rows = await tx `
|
|
@@ -80,4 +88,113 @@ async function setMembershipStatus(tx, userId, status) {
|
|
|
80
88
|
`;
|
|
81
89
|
return rows.count;
|
|
82
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* Convida um usuário para o tenant corrente: cria (ou reaproveita, se o
|
|
93
|
+
* e-mail já existe em outro tenant — identidade é global/SSO) o registro de
|
|
94
|
+
* `user`, a `membership` em status `invited` e o papel. Para usuário novo,
|
|
95
|
+
* emite o token de ativação; a camada HTTP compõe o link e envia o e-mail
|
|
96
|
+
* (core não conhece BARUK_HUB_URL/Resend — mesma separação de
|
|
97
|
+
* `requestPasswordReset`).
|
|
98
|
+
*/
|
|
99
|
+
async function inviteUser(tx, input) {
|
|
100
|
+
const tenantId = await currentTenantId(tx);
|
|
101
|
+
const existing = await tx `
|
|
102
|
+
SELECT id, full_name, status, user_type FROM "user" WHERE email = ${input.email} AND deleted_at IS NULL
|
|
103
|
+
`;
|
|
104
|
+
let userId;
|
|
105
|
+
let fullName;
|
|
106
|
+
let isNewUser;
|
|
107
|
+
if (existing[0]) {
|
|
108
|
+
// Uma identidade de contribuinte não pode ser promovida para staff por
|
|
109
|
+
// convite. Os fluxos têm permissões, superfície e ciclo de recuperação
|
|
110
|
+
// próprios; misturá-los aqui criaria uma conta dual-role insegura.
|
|
111
|
+
if (existing[0].user_type !== 'staff') {
|
|
112
|
+
throw new shared_1.ConflictError('Este e-mail já pertence a uma identidade do Portal. Use uma identidade staff distinta.');
|
|
113
|
+
}
|
|
114
|
+
userId = existing[0].id;
|
|
115
|
+
fullName = existing[0].full_name;
|
|
116
|
+
isNewUser = false;
|
|
117
|
+
const already = await tx `
|
|
118
|
+
SELECT id FROM membership WHERE user_id = ${userId} AND tenant_id = ${tenantId} AND deleted_at IS NULL
|
|
119
|
+
`;
|
|
120
|
+
if (already[0])
|
|
121
|
+
throw new shared_1.ConflictError('Usuário já pertence a este tenant');
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
userId = (0, shared_1.uuidv7)();
|
|
125
|
+
fullName = input.fullName;
|
|
126
|
+
isNewUser = true;
|
|
127
|
+
await tx `
|
|
128
|
+
INSERT INTO "user" (id, email, full_name, user_type, status, auth_provider)
|
|
129
|
+
VALUES (${userId}, ${input.email}, ${input.fullName}, 'staff', 'invited', 'password')
|
|
130
|
+
`;
|
|
131
|
+
}
|
|
132
|
+
await tx `
|
|
133
|
+
INSERT INTO membership (id, tenant_id, user_id, status, invited_by)
|
|
134
|
+
VALUES (${(0, shared_1.uuidv7)()}, ${tenantId}, ${userId}, 'invited', ${input.invitedBy})
|
|
135
|
+
`;
|
|
136
|
+
await setUserRole(tx, userId, input.roleKey);
|
|
137
|
+
let activationToken = null;
|
|
138
|
+
if (isNewUser) {
|
|
139
|
+
const activation = await (0, password_reset_js_1.createActivationToken)(tx, { userId, tenantId });
|
|
140
|
+
activationToken = activation.token;
|
|
141
|
+
}
|
|
142
|
+
await (0, audit_js_1.appendAudit)(tx, {
|
|
143
|
+
actorId: input.invitedBy,
|
|
144
|
+
action: 'user_invited',
|
|
145
|
+
resourceType: 'user',
|
|
146
|
+
resourceId: userId,
|
|
147
|
+
metadata: { email: input.email, roleKey: input.roleKey, isNewUser },
|
|
148
|
+
});
|
|
149
|
+
return { userId, email: input.email, fullName, activationToken };
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Reemite o convite de primeiro acesso exclusivamente para staff que ainda
|
|
153
|
+
* está pendente neste tenant. A emissão substitui (e invalida) o link anterior
|
|
154
|
+
* para que um token exposto nunca continue utilizável após o reenvio.
|
|
155
|
+
*/
|
|
156
|
+
async function reissueStaffActivation(tx, input) {
|
|
157
|
+
const tenantId = await currentTenantId(tx);
|
|
158
|
+
const rows = await tx `
|
|
159
|
+
SELECT
|
|
160
|
+
u.email,
|
|
161
|
+
u.full_name,
|
|
162
|
+
u.user_type,
|
|
163
|
+
u.status AS user_status,
|
|
164
|
+
m.status AS membership_status
|
|
165
|
+
FROM membership m
|
|
166
|
+
JOIN "user" u ON u.id = m.user_id
|
|
167
|
+
WHERE m.tenant_id = ${tenantId}
|
|
168
|
+
AND m.user_id = ${input.userId}
|
|
169
|
+
AND m.deleted_at IS NULL
|
|
170
|
+
AND u.deleted_at IS NULL
|
|
171
|
+
LIMIT 1
|
|
172
|
+
`;
|
|
173
|
+
const member = rows[0];
|
|
174
|
+
if (!member)
|
|
175
|
+
throw new shared_1.NotFoundError('Usuário não encontrado neste tenant');
|
|
176
|
+
if (member.user_type !== 'staff' ||
|
|
177
|
+
member.user_status !== 'invited' ||
|
|
178
|
+
member.membership_status !== 'invited') {
|
|
179
|
+
throw new shared_1.ConflictError('Convite não pode ser reenviado neste estado');
|
|
180
|
+
}
|
|
181
|
+
const activation = await (0, password_reset_js_1.createActivationToken)(tx, { userId: input.userId, tenantId });
|
|
182
|
+
await (0, audit_js_1.appendAudit)(tx, {
|
|
183
|
+
actorId: input.invitedBy,
|
|
184
|
+
action: 'user_invite_reissued',
|
|
185
|
+
resourceType: 'user',
|
|
186
|
+
resourceId: input.userId,
|
|
187
|
+
metadata: { email: member.email },
|
|
188
|
+
});
|
|
189
|
+
return {
|
|
190
|
+
userId: input.userId,
|
|
191
|
+
email: member.email,
|
|
192
|
+
fullName: member.full_name,
|
|
193
|
+
activationToken: activation.token,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
async function currentTenantId(tx) {
|
|
197
|
+
const rows = await tx `SELECT current_setting('app.current_tenant')::uuid AS tenant_id`;
|
|
198
|
+
return rows[0].tenant_id;
|
|
199
|
+
}
|
|
83
200
|
//# sourceMappingURL=repository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/users/repository.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/users/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,12 @@ exports.createCredential = createCredential;
|
|
|
4
4
|
exports.listCredentials = listCredentials;
|
|
5
5
|
exports.getCredentialMeta = getCredentialMeta;
|
|
6
6
|
exports.revealSecret = revealSecret;
|
|
7
|
+
exports.revealSecretByName = revealSecretByName;
|
|
7
8
|
exports.rotateSecret = rotateSecret;
|
|
8
9
|
exports.softDeleteCredential = softDeleteCredential;
|
|
9
10
|
exports.listExpiringCredentials = listExpiringCredentials;
|
|
11
|
+
exports.findCredentialExpiryByName = findCredentialExpiryByName;
|
|
12
|
+
exports.findCredentialIdByName = findCredentialIdByName;
|
|
10
13
|
const shared_1 = require("@baruk/shared");
|
|
11
14
|
const crypto_js_1 = require("./crypto.js");
|
|
12
15
|
function mapMeta(r) {
|
|
@@ -86,6 +89,38 @@ async function revealSecret(tx, keyring, tenantId, id) {
|
|
|
86
89
|
});
|
|
87
90
|
return { meta: mapMeta(r), secret };
|
|
88
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Busca e decifra uma credencial de NÍVEL DE TENANT (nunca amarrada a um
|
|
94
|
+
* `client_id`) pelo nome — o vocabulário que `channel_binding.credential_ref`
|
|
95
|
+
* usa (`vault://<name>`). Só enxerga o que a RLS permitir: um `tenantId`
|
|
96
|
+
* incorreto não lança, devolve `null` como se o nome não existisse.
|
|
97
|
+
*
|
|
98
|
+
* NUNCA lança por ausência/expiração — a diferença com `revealSecret` (por
|
|
99
|
+
* `id`), que lança `NotFoundError`, é deliberada: aquele é chamado por uma rota
|
|
100
|
+
* que já sabe que o `id` deveria existir; este é chamado por um resolvedor de
|
|
101
|
+
* canal que trata "não configurado" como estado normal.
|
|
102
|
+
*/
|
|
103
|
+
async function revealSecretByName(tx, keyring, tenantId, name) {
|
|
104
|
+
const rows = await tx `
|
|
105
|
+
SELECT ${tx.unsafe(META_COLUMNS)}, ciphertext, iv, auth_tag
|
|
106
|
+
FROM vault_credential
|
|
107
|
+
WHERE client_id IS NULL AND lower(name) = lower(${name}) AND deleted_at IS NULL
|
|
108
|
+
`;
|
|
109
|
+
const r = rows[0];
|
|
110
|
+
if (!r)
|
|
111
|
+
return null;
|
|
112
|
+
const meta = mapMeta(r);
|
|
113
|
+
if (r.expires_at && r.expires_at.getTime() <= Date.now()) {
|
|
114
|
+
return { status: 'expired', meta };
|
|
115
|
+
}
|
|
116
|
+
const secret = (0, crypto_js_1.decryptSecret)(keyring, tenantId, {
|
|
117
|
+
ciphertext: r.ciphertext,
|
|
118
|
+
iv: r.iv,
|
|
119
|
+
authTag: r.auth_tag,
|
|
120
|
+
keyVersion: r.key_version,
|
|
121
|
+
});
|
|
122
|
+
return { status: 'ok', meta, secret };
|
|
123
|
+
}
|
|
89
124
|
async function rotateSecret(tx, keyring, tenantId, id, newSecret, updatedBy) {
|
|
90
125
|
const enc = (0, crypto_js_1.encryptSecret)(keyring, tenantId, newSecret);
|
|
91
126
|
const rows = await tx `
|
|
@@ -117,4 +152,50 @@ async function listExpiringCredentials(tx, days = 30) {
|
|
|
117
152
|
`;
|
|
118
153
|
return rows.map(mapMeta);
|
|
119
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* O `id` da credencial de nível de tenant com este nome, ou `null`.
|
|
157
|
+
*
|
|
158
|
+
* Existe para o caminho de **reconexão**: o índice único
|
|
159
|
+
* `(tenant, client, lower(name))` recusa um segundo `INSERT` com o mesmo nome, e
|
|
160
|
+
* um onboarding refeito — número reconectado, token revogado e reemitido pelo
|
|
161
|
+
* cliente — precisa ROTACIONAR a credencial existente, não criar outra.
|
|
162
|
+
*
|
|
163
|
+
* Devolve só o identificador. Uma função que devolvesse o metadado inteiro
|
|
164
|
+
* convidaria quem chama a decidir com base nele; a única pergunta legítima aqui
|
|
165
|
+
* é "já existe?".
|
|
166
|
+
*/
|
|
167
|
+
/**
|
|
168
|
+
* Vencimento de uma credencial de nível de tenant, pelo NOME. Sem decifrar.
|
|
169
|
+
*
|
|
170
|
+
* Existe porque a tela precisa avisar ANTES: o token que o Embedded Signup emite
|
|
171
|
+
* na configuração canônica desta casa vive **60 dias**, e o comportamento no
|
|
172
|
+
* vencimento já é o correto — `revealSecretByName` devolve `expired`, o store
|
|
173
|
+
* audita e nega, o canal fica indisponível. O que faltava era alguém olhar.
|
|
174
|
+
*
|
|
175
|
+
* Descobrir o vencimento por uma cobrança que não saiu é o mesmo modo de falha
|
|
176
|
+
* do token colado que esta frente existe para eliminar, só que com prazo.
|
|
177
|
+
*
|
|
178
|
+
* Devolve `undefined` quando não há credencial com esse nome, e `null` no
|
|
179
|
+
* `expiresAt` quando ela não vence — os dois casos são diferentes para quem
|
|
180
|
+
* mostra a tela, e colapsá-los faria "não configurado" parecer "não vence".
|
|
181
|
+
*/
|
|
182
|
+
async function findCredentialExpiryByName(tx, name) {
|
|
183
|
+
const rows = await tx `
|
|
184
|
+
SELECT id, expires_at FROM vault_credential
|
|
185
|
+
WHERE client_id IS NULL AND lower(name) = lower(${name}) AND deleted_at IS NULL
|
|
186
|
+
LIMIT 1
|
|
187
|
+
`;
|
|
188
|
+
const r = rows[0];
|
|
189
|
+
if (!r)
|
|
190
|
+
return undefined;
|
|
191
|
+
return { id: r.id, expiresAt: r.expires_at ? r.expires_at.toISOString() : null };
|
|
192
|
+
}
|
|
193
|
+
async function findCredentialIdByName(tx, name) {
|
|
194
|
+
const rows = await tx `
|
|
195
|
+
SELECT id FROM vault_credential
|
|
196
|
+
WHERE client_id IS NULL AND lower(name) = lower(${name}) AND deleted_at IS NULL
|
|
197
|
+
LIMIT 1
|
|
198
|
+
`;
|
|
199
|
+
return rows[0]?.id ?? null;
|
|
200
|
+
}
|
|
120
201
|
//# sourceMappingURL=repository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/vault/repository.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/vault/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,13 +11,48 @@ export interface ClientRecord {
|
|
|
11
11
|
clientType: 'pf' | 'pj';
|
|
12
12
|
displayName: string;
|
|
13
13
|
documentNumber: string | null;
|
|
14
|
+
email: string | null;
|
|
15
|
+
phone: string | null;
|
|
14
16
|
status: string;
|
|
15
17
|
createdAt: string;
|
|
18
|
+
/**
|
|
19
|
+
* Por quais canais dá para falar com este cliente.
|
|
20
|
+
*
|
|
21
|
+
* Derivado, nunca armazenado: contactabilidade é consequência dos contatos
|
|
22
|
+
* cadastrados, e guardar uma cópia criaria um segundo lugar para ficar
|
|
23
|
+
* desatualizado. A régua de cobrança consulta isto ANTES de agendar, em vez de
|
|
24
|
+
* descobrir a ausência de canal só na hora de enviar.
|
|
25
|
+
*/
|
|
26
|
+
contactability: Contactability;
|
|
16
27
|
}
|
|
28
|
+
export type ContactChannelState = 'ready' | 'missing';
|
|
29
|
+
export interface Contactability {
|
|
30
|
+
email: ContactChannelState;
|
|
31
|
+
phone: ContactChannelState;
|
|
32
|
+
/** Nenhum canal utilizável — o caso que exige atualização cadastral. */
|
|
33
|
+
reachable: boolean;
|
|
34
|
+
}
|
|
35
|
+
export declare function contactabilityOf(input: {
|
|
36
|
+
email?: string | null;
|
|
37
|
+
phone?: string | null;
|
|
38
|
+
}): Contactability;
|
|
39
|
+
/**
|
|
40
|
+
* Normalização de contato.
|
|
41
|
+
*
|
|
42
|
+
* E-mail vira minúsculo e sem espaços — a coluna é `citext`, mas quem lê o dado
|
|
43
|
+
* fora do banco não herda essa insensibilidade. Telefone guarda só dígitos e um
|
|
44
|
+
* `+` inicial: máscara é apresentação, e comparar "(62) 99999-9999" com
|
|
45
|
+
* "+5562999999999" é o tipo de divergência que só aparece quando a mensagem não
|
|
46
|
+
* chega.
|
|
47
|
+
*/
|
|
48
|
+
export declare function normalizeEmail(v: string | null | undefined): string | null;
|
|
49
|
+
export declare function normalizePhone(v: string | null | undefined): string | null;
|
|
17
50
|
export interface CreateClientInput {
|
|
18
51
|
displayName: string;
|
|
19
52
|
clientType?: 'pf' | 'pj';
|
|
20
53
|
documentNumber?: string | null;
|
|
54
|
+
email?: string | null;
|
|
55
|
+
phone?: string | null;
|
|
21
56
|
createdBy?: string | null;
|
|
22
57
|
}
|
|
23
58
|
export declare function createClient(tx: Tx, input: CreateClientInput): Promise<ClientRecord>;
|
|
@@ -44,6 +79,13 @@ export interface UpdateClientInput {
|
|
|
44
79
|
email?: string | null;
|
|
45
80
|
phone?: string | null;
|
|
46
81
|
status?: string;
|
|
82
|
+
/**
|
|
83
|
+
* CPF/CNPJ. Faltava aqui: o cliente nascia com documento e nunca podia
|
|
84
|
+
* corrigi-lo — e é justamente o campo que todo gateway de pagamento exige
|
|
85
|
+
* para aceitar um pagador. Um erro de digitação no cadastro bloqueava a
|
|
86
|
+
* emissão de cobrança para sempre.
|
|
87
|
+
*/
|
|
88
|
+
documentNumber?: string | null;
|
|
47
89
|
updatedBy?: string | null;
|
|
48
90
|
}
|
|
49
91
|
export declare function updateClient(tx: Tx, id: string, input: UpdateClientInput): Promise<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/clients/repository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/clients/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,33 @@
|
|
|
1
|
-
import { NotFoundError, uuidv7 } from '@baruk/shared';
|
|
1
|
+
import { ConflictError, NotFoundError, uuidv7 } from '@baruk/shared';
|
|
2
|
+
import { toE164OrNull } from '../contacts/phone.js';
|
|
3
|
+
export function contactabilityOf(input) {
|
|
4
|
+
const email = input.email?.trim() ? 'ready' : 'missing';
|
|
5
|
+
const phone = input.phone?.trim() ? 'ready' : 'missing';
|
|
6
|
+
return { email, phone, reachable: email === 'ready' || phone === 'ready' };
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Normalização de contato.
|
|
10
|
+
*
|
|
11
|
+
* E-mail vira minúsculo e sem espaços — a coluna é `citext`, mas quem lê o dado
|
|
12
|
+
* fora do banco não herda essa insensibilidade. Telefone guarda só dígitos e um
|
|
13
|
+
* `+` inicial: máscara é apresentação, e comparar "(62) 99999-9999" com
|
|
14
|
+
* "+5562999999999" é o tipo de divergência que só aparece quando a mensagem não
|
|
15
|
+
* chega.
|
|
16
|
+
*/
|
|
17
|
+
export function normalizeEmail(v) {
|
|
18
|
+
const t = v?.trim().toLowerCase();
|
|
19
|
+
return t ? t : null;
|
|
20
|
+
}
|
|
21
|
+
export function normalizePhone(v) {
|
|
22
|
+
if (!v)
|
|
23
|
+
return null;
|
|
24
|
+
const trimmed = v.trim();
|
|
25
|
+
const plus = trimmed.startsWith('+');
|
|
26
|
+
const digits = trimmed.replace(/\D/g, '');
|
|
27
|
+
if (!digits)
|
|
28
|
+
return null;
|
|
29
|
+
return plus ? `+${digits}` : digits;
|
|
30
|
+
}
|
|
2
31
|
function mapRow(r) {
|
|
3
32
|
return {
|
|
4
33
|
id: r.id,
|
|
@@ -6,30 +35,58 @@ function mapRow(r) {
|
|
|
6
35
|
clientType: r.client_type,
|
|
7
36
|
displayName: r.display_name,
|
|
8
37
|
documentNumber: r.document_number,
|
|
38
|
+
email: r.email ?? null,
|
|
39
|
+
phone: r.phone ?? null,
|
|
9
40
|
status: r.status,
|
|
10
41
|
createdAt: r.created_at.toISOString(),
|
|
42
|
+
contactability: contactabilityOf({ email: r.email, phone: r.phone }),
|
|
11
43
|
};
|
|
12
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Traduz a violação de documento duplicado.
|
|
47
|
+
*
|
|
48
|
+
* O banco impede dois clientes com o mesmo CPF/CNPJ no tenant — regra correta,
|
|
49
|
+
* e o escritório precisa saber que foi ISSO. Sem tradução, a rota devolvia 500
|
|
50
|
+
* genérico: quem cadastrava via um "erro interno" onde havia um cadastro já
|
|
51
|
+
* existente, e não tinha como descobrir.
|
|
52
|
+
*/
|
|
53
|
+
function asDuplicateDocument(err) {
|
|
54
|
+
const e = err;
|
|
55
|
+
if (e?.code === '23505' && (e.constraint_name ?? '').includes('document')) {
|
|
56
|
+
throw new ConflictError('Já existe um cliente com este CPF/CNPJ neste escritório.');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
13
59
|
export async function createClient(tx, input) {
|
|
14
60
|
// tenant_id vem da GUC — nunca do input. A WITH CHECK da RLS recusa qualquer
|
|
15
61
|
// tentativa de gravar fora do tenant corrente.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
62
|
+
try {
|
|
63
|
+
const rows = await tx `
|
|
64
|
+
INSERT INTO client (id, tenant_id, client_type, display_name, document_number,
|
|
65
|
+
email, phone, phone_e164, created_by)
|
|
66
|
+
VALUES (
|
|
67
|
+
${uuidv7()},
|
|
68
|
+
current_setting('app.current_tenant')::uuid,
|
|
69
|
+
${input.clientType ?? 'pj'},
|
|
70
|
+
${input.displayName},
|
|
71
|
+
${input.documentNumber ?? null},
|
|
72
|
+
${normalizeEmail(input.email)},
|
|
73
|
+
${normalizePhone(input.phone)},
|
|
74
|
+
${toE164OrNull(input.phone)},
|
|
75
|
+
${input.createdBy ?? null}
|
|
76
|
+
)
|
|
77
|
+
RETURNING id, tenant_id, client_type, display_name, document_number, email, phone,
|
|
78
|
+
status, created_at
|
|
79
|
+
`;
|
|
80
|
+
return mapRow(rows[0]);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
asDuplicateDocument(err);
|
|
84
|
+
throw err;
|
|
85
|
+
}
|
|
29
86
|
}
|
|
30
87
|
export async function listClients(tx) {
|
|
31
88
|
const rows = await tx `
|
|
32
|
-
SELECT id, tenant_id, client_type, display_name, document_number, status, created_at
|
|
89
|
+
SELECT id, tenant_id, client_type, display_name, document_number, email, phone, status, created_at
|
|
33
90
|
FROM client
|
|
34
91
|
WHERE deleted_at IS NULL
|
|
35
92
|
ORDER BY created_at DESC
|
|
@@ -38,7 +95,7 @@ export async function listClients(tx) {
|
|
|
38
95
|
}
|
|
39
96
|
export async function getClient(tx, id) {
|
|
40
97
|
const rows = await tx `
|
|
41
|
-
SELECT id, tenant_id, client_type, display_name, document_number, status, created_at
|
|
98
|
+
SELECT id, tenant_id, client_type, display_name, document_number, email, phone, status, created_at
|
|
42
99
|
FROM client
|
|
43
100
|
WHERE id = ${id} AND deleted_at IS NULL
|
|
44
101
|
`;
|
|
@@ -64,7 +121,7 @@ export async function listClientsPaged(tx, filter = {}) {
|
|
|
64
121
|
const offset = filter.offset ?? 0;
|
|
65
122
|
const like = filter.search ? `%${filter.search}%` : null;
|
|
66
123
|
const rows = await tx `
|
|
67
|
-
SELECT id, tenant_id, client_type, display_name, document_number, status, created_at,
|
|
124
|
+
SELECT id, tenant_id, client_type, display_name, document_number, email, phone, status, created_at,
|
|
68
125
|
count(*) OVER() AS total
|
|
69
126
|
FROM client
|
|
70
127
|
WHERE deleted_at IS NULL
|
|
@@ -77,14 +134,25 @@ export async function listClientsPaged(tx, filter = {}) {
|
|
|
77
134
|
return { items: rows.map((r) => mapRow(r)), total };
|
|
78
135
|
}
|
|
79
136
|
export async function updateClient(tx, id, input) {
|
|
137
|
+
// Corrigir um documento para um que já existe cai na mesma violação — e o
|
|
138
|
+
// escritório precisa da mesma explicação, não de um 500.
|
|
80
139
|
// Casts explícitos: parâmetros NULL sem tipo quebram COALESCE ("could not
|
|
81
140
|
// determine data type of parameter") no PostgreSQL.
|
|
82
|
-
|
|
141
|
+
try {
|
|
142
|
+
const rows = await tx `
|
|
83
143
|
UPDATE client SET
|
|
84
144
|
display_name = COALESCE(${input.displayName ?? null}::text, display_name),
|
|
85
145
|
legal_name = COALESCE(${input.legalName ?? null}::text, legal_name),
|
|
86
|
-
|
|
87
|
-
|
|
146
|
+
document_number = COALESCE(${input.documentNumber ?? null}::text, document_number),
|
|
147
|
+
email = COALESCE(${normalizeEmail(input.email)}::citext, email),
|
|
148
|
+
phone = COALESCE(${normalizePhone(input.phone)}::text, phone),
|
|
149
|
+
-- Derivado, nunca digitado. A coluna phone guarda o que o operador
|
|
150
|
+
-- escreveu e continua sendo dele; phone_e164 e a forma que os providers
|
|
151
|
+
-- exigem. So e recalculado quando o telefone vem no corpo: ausente
|
|
152
|
+
-- preserva o valor, e um telefone que nao parseia zera o canonico em vez
|
|
153
|
+
-- de manter um E.164 velho apontando para outro numero.
|
|
154
|
+
phone_e164 = CASE WHEN ${input.phone ?? null}::text IS NULL THEN phone_e164
|
|
155
|
+
ELSE ${toE164OrNull(input.phone)}::text END,
|
|
88
156
|
status = COALESCE(${input.status ?? null}::text, status),
|
|
89
157
|
updated_by = ${input.updatedBy ?? null}::uuid,
|
|
90
158
|
updated_at = now(),
|
|
@@ -92,7 +160,12 @@ export async function updateClient(tx, id, input) {
|
|
|
92
160
|
WHERE id = ${id} AND deleted_at IS NULL
|
|
93
161
|
RETURNING id
|
|
94
162
|
`;
|
|
95
|
-
|
|
163
|
+
return rows.count;
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
asDuplicateDocument(err);
|
|
167
|
+
throw err;
|
|
168
|
+
}
|
|
96
169
|
}
|
|
97
170
|
export async function softDeleteClient(tx, id, deletedBy) {
|
|
98
171
|
const rows = await tx `
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/clients/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/clients/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAwCpD,MAAM,UAAU,gBAAgB,CAAC,KAGhC;IACC,MAAM,KAAK,GAAwB,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,MAAM,KAAK,GAAwB,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;AAC7E,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,CAA4B;IACzD,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAA4B;IACzD,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AACtC,CAAC;AAWD,SAAS,MAAM,CAAC,CAUf;IACC,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,QAAQ,EAAE,CAAC,CAAC,SAAS;QACrB,UAAU,EAAE,CAAC,CAAC,WAAW;QACzB,WAAW,EAAE,CAAC,CAAC,YAAY;QAC3B,cAAc,EAAE,CAAC,CAAC,eAAe;QACjC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;QACtB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;QACtB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE;QACrC,cAAc,EAAE,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;KACrE,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAAC,GAAY;IACvC,MAAM,CAAC,GAAG,GAAkD,CAAC;IAC7D,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,aAAa,CAAC,0DAA0D,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAM,EAAE,KAAwB;IACjE,6EAA6E;IAC7E,+CAA+C;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;;;;UAIf,MAAM,EAAE;;UAER,KAAK,CAAC,UAAU,IAAI,IAAI;UACxB,KAAK,CAAC,WAAW;UACjB,KAAK,CAAC,cAAc,IAAI,IAAI;UAC5B,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC;UAC3B,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC;UAC3B,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC;UACzB,KAAK,CAAC,SAAS,IAAI,IAAI;;;;KAI5B,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAU,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAM;IACtC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;;;;;GAKpB,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAU,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAM,EAAE,EAAU;IAChD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;;;iBAGN,EAAE;GAChB,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,wBAAwB,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAU,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAM,EAAE,EAAU,EAAE,WAAmB;IACxE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;;yBAEE,WAAW;iBACnB,EAAE;;GAEhB,CAAC;IACF,OAAO,IAAI,CAAC,KAAK,CAAC;AACpB,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAM,EACN,SAA4B,EAAE;IAE9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,MAAM,IAAI,GAAG,MAAM,EAAE,CAA2B;;;;;aAKrC,MAAM,CAAC,MAAM,IAAI,IAAI,8BAA8B,MAAM,CAAC,MAAM,IAAI,IAAI;aACxE,IAAI,wCAAwC,IAAI,6BAA6B,IAAI;;YAElF,KAAK,WAAW,MAAM;GAC/B,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAC/D,CAAC;AAkBD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAM,EAAE,EAAU,EAAE,KAAwB;IAC7E,0EAA0E;IAC1E,yDAAyD;IACzD,0EAA0E;IAC1E,oDAAoD;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;;gCAEO,KAAK,CAAC,WAAW,IAAI,IAAI;gCACzB,KAAK,CAAC,SAAS,IAAI,IAAI;mCACpB,KAAK,CAAC,cAAc,IAAI,IAAI;gCAC/B,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC;gCAC3B,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC;;;;;;iCAM1B,KAAK,CAAC,KAAK,IAAI,IAAI;iCACnB,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC;gCAC1B,KAAK,CAAC,MAAM,IAAI,IAAI;uBAC7B,KAAK,CAAC,SAAS,IAAI,IAAI;;;iBAG7B,EAAE;;GAEhB,CAAC;QACA,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAM,EACN,EAAU,EACV,SAAyB;IAEzB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;yDACkC,SAAS,IAAI,IAAI;iBACzD,EAAE;;GAEhB,CAAC;IACF,OAAO,IAAI,CAAC,KAAK,CAAC;AACpB,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,EAAM,EACN,cAAsB;IAEtB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAkB;;8BAEX,cAAc;GACzC,CAAC;IACF,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { Tx } from '../db/client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Identidade do escritório para a comunicação transacional.
|
|
4
|
+
*
|
|
5
|
+
* Mora em `tenant.settings.branding` (jsonb que já existia) — sem tabela nem
|
|
6
|
+
* migration. Nenhuma marca está no código: o que aparece no e-mail vem do tenant
|
|
7
|
+
* que está enviando, e um escritório novo entra por configuração.
|
|
8
|
+
*
|
|
9
|
+
* Os valores canônicos de cada marca vivem no **Brand OS**
|
|
10
|
+
* (`frameworks/brand-os/brands/<marca>/creative-engine/brand-kit.json`), que é a
|
|
11
|
+
* fonte de verdade da identidade. Este módulo consome; não redefine.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* O que o asset de logo É, do ponto de vista do manual de marca.
|
|
15
|
+
*
|
|
16
|
+
* A distinção não é cosmética: um **lockup** já contém o nome do escritório
|
|
17
|
+
* desenhado; um **símbolo** não. Renderizar os dois do mesmo jeito ou repete o
|
|
18
|
+
* nome duas vezes no cabeçalho, ou deixa a mensagem sem nome quando o leitor
|
|
19
|
+
* bloqueia imagens. O tenant declara qual dos dois enviou.
|
|
20
|
+
*/
|
|
21
|
+
export type LogoKind = 'symbol' | 'lockup';
|
|
22
|
+
export interface TenantBranding {
|
|
23
|
+
officeName: string;
|
|
24
|
+
/** Assinatura do rodapé; cai em `officeName` quando não definida. */
|
|
25
|
+
signatureName: string;
|
|
26
|
+
/** Frase curta da marca. Só aparece se o tenant configurar. */
|
|
27
|
+
tagline: string | null;
|
|
28
|
+
/**
|
|
29
|
+
* Logomarca para o cabeçalho — ou seja, o asset que fica sobre `primaryColor`.
|
|
30
|
+
* Um kit de marca sério tem versão clara e escura; o tenant aponta a que
|
|
31
|
+
* combina com o fundo que ele mesmo escolheu.
|
|
32
|
+
*
|
|
33
|
+
* Formato: PNG ou JPG em URL pública. **SVG não serve** — Gmail e Outlook não
|
|
34
|
+
* o renderizam em e-mail. Ausente é estado válido: o cabeçalho vira
|
|
35
|
+
* tipográfico, nunca uma marca inventada.
|
|
36
|
+
*/
|
|
37
|
+
logoUrl: string | null;
|
|
38
|
+
logoKind: LogoKind;
|
|
39
|
+
primaryColor: string;
|
|
40
|
+
/** Usada em detalhes; cai na primária quando ausente. */
|
|
41
|
+
secondaryColor: string;
|
|
42
|
+
/** Destaque pontual (valor, borda do card). */
|
|
43
|
+
accentColor: string;
|
|
44
|
+
/** Fundo da página do e-mail (fora do cartão branco). */
|
|
45
|
+
backgroundColor: string;
|
|
46
|
+
/** Cor do texto corrido. */
|
|
47
|
+
textColor: string;
|
|
48
|
+
/** Cor de apoio: rodapé, rótulos, texto secundário. */
|
|
49
|
+
mutedColor: string;
|
|
50
|
+
/**
|
|
51
|
+
* Stack de fontes do corpo. Webfont não carrega no Outlook, então a stack
|
|
52
|
+
* precisa terminar em famílias que todo cliente tem — quem configurar só o
|
|
53
|
+
* nome da fonte da marca recebe a queda automática.
|
|
54
|
+
*/
|
|
55
|
+
fontFamily: string;
|
|
56
|
+
supportEmail: string | null;
|
|
57
|
+
supportPhone: string | null;
|
|
58
|
+
/** Site do escritório. Corresponde ao `websiteUrl` do vocabulário de marca. */
|
|
59
|
+
website: string | null;
|
|
60
|
+
locale: 'pt-BR';
|
|
61
|
+
}
|
|
62
|
+
export declare function getTenantBranding(tx: Tx): Promise<TenantBranding>;
|
|
63
|
+
/**
|
|
64
|
+
* Remetente no formato `Nome <endereço>`.
|
|
65
|
+
*
|
|
66
|
+
* O endereço continua sendo o do domínio verificado no provider — trocá-lo
|
|
67
|
+
* quebraria a entrega. O que muda é o NOME exibido: as mensagens saíam como
|
|
68
|
+
* "Baruk Contábil" e assinavam "SC Organização Contábil", o que faz o cliente
|
|
69
|
+
* duvidar de quem está cobrando.
|
|
70
|
+
*/
|
|
71
|
+
export declare function senderFor(branding: TenantBranding, fallbackFrom: string): string;
|
|
72
|
+
//# sourceMappingURL=branding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branding.d.ts","sourceRoot":"","sources":["../../src/collection/branding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAE1C;;;;;;;;;;GAUG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,aAAa,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;;;;OAQG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,eAAe,EAAE,MAAM,CAAC;IACxB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,+EAA+E;IAC/E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;CACjB;AA4ED,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAmDvE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAKhF"}
|