@baruk/core 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.baruk-provenance.json +4 -4
- package/CHANGELOG.md +42 -0
- package/dist/audit/repository.d.ts +33 -1
- package/dist/audit/repository.d.ts.map +1 -1
- package/dist/audit/repository.js +41 -7
- package/dist/audit/repository.js.map +1 -1
- package/dist/auth/service.d.ts +21 -0
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +46 -1
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +41 -1
- package/dist/billing/ar-repository.d.ts.map +1 -1
- package/dist/billing/ar-repository.js +82 -6
- package/dist/billing/ar-repository.js.map +1 -1
- package/dist/billing/provider-account.d.ts +38 -0
- package/dist/billing/provider-account.d.ts.map +1 -1
- package/dist/billing/provider-account.js +58 -2
- package/dist/billing/provider-account.js.map +1 -1
- package/dist/billing/repository.d.ts +44 -0
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +49 -5
- package/dist/billing/repository.js.map +1 -1
- package/dist/cjs/audit/repository.js +41 -7
- package/dist/cjs/audit/repository.js.map +1 -1
- package/dist/cjs/auth/service.js +46 -1
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +82 -6
- package/dist/cjs/billing/ar-repository.js.map +1 -1
- package/dist/cjs/billing/provider-account.js +60 -1
- package/dist/cjs/billing/provider-account.js.map +1 -1
- package/dist/cjs/billing/repository.js +51 -5
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/ibge.js +103 -0
- package/dist/cjs/clients/ibge.js.map +1 -0
- package/dist/cjs/clients/repository.js +186 -9
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +190 -0
- package/dist/cjs/collection/branding.js.map +1 -1
- package/dist/cjs/collection/clearance-store.js +74 -0
- package/dist/cjs/collection/clearance-store.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +65 -2
- package/dist/cjs/collection/communication-runtime.js.map +1 -1
- package/dist/cjs/collection/engine.js +20 -0
- package/dist/cjs/collection/engine.js.map +1 -1
- package/dist/cjs/collection/policy.js +29 -1
- package/dist/cjs/collection/policy.js.map +1 -1
- package/dist/cjs/communication/clearance.js +18 -0
- package/dist/cjs/communication/clearance.js.map +1 -0
- package/dist/cjs/communication/dry-run-scenario.js +5 -0
- package/dist/cjs/communication/dry-run-scenario.js.map +1 -1
- package/dist/cjs/communication/engine.js +12 -0
- package/dist/cjs/communication/engine.js.map +1 -1
- package/dist/cjs/communication/policy.js.map +1 -1
- package/dist/cjs/competence/business-days.js +155 -0
- package/dist/cjs/competence/business-days.js.map +1 -0
- package/dist/cjs/competence/catalog-validation.js +174 -0
- package/dist/cjs/competence/catalog-validation.js.map +1 -0
- package/dist/cjs/competence/obligation-preview.js +190 -0
- package/dist/cjs/competence/obligation-preview.js.map +1 -0
- package/dist/cjs/competence/repository.js +330 -17
- package/dist/cjs/competence/repository.js.map +1 -1
- package/dist/cjs/dashboard/pilot-panel.js +90 -0
- package/dist/cjs/dashboard/pilot-panel.js.map +1 -0
- package/dist/cjs/dashboard/repository.js +11 -1
- package/dist/cjs/dashboard/repository.js.map +1 -1
- package/dist/cjs/db/client.js +17 -11
- package/dist/cjs/db/client.js.map +1 -1
- package/dist/cjs/db/provision-e2e-identity.js +111 -0
- package/dist/cjs/db/provision-e2e-identity.js.map +1 -0
- package/dist/cjs/fiscal/applicability.js +164 -0
- package/dist/cjs/fiscal/applicability.js.map +1 -0
- package/dist/cjs/fiscal/conditions.js +198 -0
- package/dist/cjs/fiscal/conditions.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-contract.js +390 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-contract.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js +108 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js +220 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
- package/dist/cjs/fiscal/coverage/model.js +127 -0
- package/dist/cjs/fiscal/coverage/model.js.map +1 -0
- package/dist/cjs/fiscal/coverage/requests.js +99 -0
- package/dist/cjs/fiscal/coverage/requests.js.map +1 -0
- package/dist/cjs/fiscal/credentials/material.js +168 -0
- package/dist/cjs/fiscal/credentials/material.js.map +1 -0
- package/dist/cjs/fiscal/credentials/readiness.js +163 -0
- package/dist/cjs/fiscal/credentials/readiness.js.map +1 -0
- package/dist/cjs/fiscal/eligibility.js +199 -0
- package/dist/cjs/fiscal/eligibility.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js +128 -0
- package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/adn-transport.js +229 -0
- package/dist/cjs/fiscal/ingestion/adn-transport.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/direction.js +36 -0
- package/dist/cjs/fiscal/ingestion/direction.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/nfse-adn.js +228 -0
- package/dist/cjs/fiscal/ingestion/nfse-adn.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/pipeline.js +704 -0
- package/dist/cjs/fiscal/ingestion/pipeline.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/provider.js +51 -0
- package/dist/cjs/fiscal/ingestion/provider.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/repository.js +132 -0
- package/dist/cjs/fiscal/ingestion/repository.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-provider.js +103 -0
- package/dist/cjs/fiscal/ingestion/synthetic-provider.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js +13 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport.js +61 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/xml-reader.js +121 -0
- package/dist/cjs/fiscal/ingestion/xml-reader.js.map +1 -0
- package/dist/cjs/fiscal/repository.js +470 -0
- package/dist/cjs/fiscal/repository.js.map +1 -0
- package/dist/cjs/fiscal/sync/circuit.js +124 -0
- package/dist/cjs/fiscal/sync/circuit.js.map +1 -0
- package/dist/cjs/fiscal/sync/intervention.js +140 -0
- package/dist/cjs/fiscal/sync/intervention.js.map +1 -0
- package/dist/cjs/fiscal/sync/lease.js +146 -0
- package/dist/cjs/fiscal/sync/lease.js.map +1 -0
- package/dist/cjs/fiscal/sync/observability.js +244 -0
- package/dist/cjs/fiscal/sync/observability.js.map +1 -0
- package/dist/cjs/fiscal/sync/orchestrator.js +490 -0
- package/dist/cjs/fiscal/sync/orchestrator.js.map +1 -0
- package/dist/cjs/fiscal/sync/policy.js +143 -0
- package/dist/cjs/fiscal/sync/policy.js.map +1 -0
- package/dist/cjs/fiscal/sync/reprocess.js +241 -0
- package/dist/cjs/fiscal/sync/reprocess.js.map +1 -0
- package/dist/cjs/fiscal/sync/retry.js +183 -0
- package/dist/cjs/fiscal/sync/retry.js.map +1 -0
- package/dist/cjs/fiscal/sync/secret-boundary.js +123 -0
- package/dist/cjs/fiscal/sync/secret-boundary.js.map +1 -0
- package/dist/cjs/fiscal/transport/https.js +309 -0
- package/dist/cjs/fiscal/transport/https.js.map +1 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js +328 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -0
- package/dist/cjs/fiscal/transport/types.js +93 -0
- package/dist/cjs/fiscal/transport/types.js.map +1 -0
- package/dist/cjs/import/br-documents.js +85 -0
- package/dist/cjs/import/br-documents.js.map +1 -0
- package/dist/cjs/import/clients-import.js +347 -40
- package/dist/cjs/import/clients-import.js.map +1 -1
- package/dist/cjs/index.js +316 -11
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/documents.js +100 -15
- package/dist/cjs/legal/documents.js.map +1 -1
- package/dist/cjs/legal/index.js +3 -1
- package/dist/cjs/legal/index.js.map +1 -1
- package/dist/cjs/legal/types.js.map +1 -1
- package/dist/cjs/onboarding/persistence.js +4 -4
- package/dist/cjs/onboarding/persistence.js.map +1 -1
- package/dist/cjs/pilot/go-live-checklist.js +212 -0
- package/dist/cjs/pilot/go-live-checklist.js.map +1 -0
- package/dist/cjs/pilot/milestone.js +79 -0
- package/dist/cjs/pilot/milestone.js.map +1 -0
- package/dist/cjs/platform/capabilities.js +144 -0
- package/dist/cjs/platform/capabilities.js.map +1 -0
- package/dist/cjs/platform/job-contract.js +411 -0
- package/dist/cjs/platform/job-contract.js.map +1 -0
- package/dist/cjs/rbac/catalog.js +34 -0
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/subscription-billing/index.js +2 -1
- package/dist/cjs/subscription-billing/index.js.map +1 -1
- package/dist/cjs/subscription-billing/service.js +153 -77
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/tenancy/features.js +131 -0
- package/dist/cjs/tenancy/features.js.map +1 -0
- package/dist/cjs/tenancy/settings.js +224 -0
- package/dist/cjs/tenancy/settings.js.map +1 -0
- package/dist/cjs/users/repository.js +24 -1
- package/dist/cjs/users/repository.js.map +1 -1
- package/dist/clients/ibge.d.ts +17 -0
- package/dist/clients/ibge.d.ts.map +1 -0
- package/dist/clients/ibge.js +98 -0
- package/dist/clients/ibge.js.map +1 -0
- package/dist/clients/repository.d.ts +154 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +182 -9
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +65 -0
- package/dist/collection/branding.d.ts.map +1 -1
- package/dist/collection/branding.js +186 -0
- package/dist/collection/branding.js.map +1 -1
- package/dist/collection/clearance-store.d.ts +39 -0
- package/dist/collection/clearance-store.d.ts.map +1 -0
- package/dist/collection/clearance-store.js +69 -0
- package/dist/collection/clearance-store.js.map +1 -0
- package/dist/collection/communication-runtime.d.ts +37 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -1
- package/dist/collection/communication-runtime.js +63 -1
- package/dist/collection/communication-runtime.js.map +1 -1
- package/dist/collection/engine.d.ts +23 -0
- package/dist/collection/engine.d.ts.map +1 -1
- package/dist/collection/engine.js +20 -0
- package/dist/collection/engine.js.map +1 -1
- package/dist/collection/policy.d.ts +25 -0
- package/dist/collection/policy.d.ts.map +1 -1
- package/dist/collection/policy.js +27 -0
- package/dist/collection/policy.js.map +1 -1
- package/dist/communication/clearance.d.ts +53 -0
- package/dist/communication/clearance.d.ts.map +1 -0
- package/dist/communication/clearance.js +15 -0
- package/dist/communication/clearance.js.map +1 -0
- package/dist/communication/dry-run-scenario.d.ts.map +1 -1
- package/dist/communication/dry-run-scenario.js +5 -0
- package/dist/communication/dry-run-scenario.js.map +1 -1
- package/dist/communication/engine.d.ts +10 -0
- package/dist/communication/engine.d.ts.map +1 -1
- package/dist/communication/engine.js +12 -0
- package/dist/communication/engine.js.map +1 -1
- package/dist/communication/policy.d.ts +16 -0
- package/dist/communication/policy.d.ts.map +1 -1
- package/dist/communication/policy.js.map +1 -1
- package/dist/competence/business-days.d.ts +51 -0
- package/dist/competence/business-days.d.ts.map +1 -0
- package/dist/competence/business-days.js +145 -0
- package/dist/competence/business-days.js.map +1 -0
- package/dist/competence/catalog-validation.d.ts +86 -0
- package/dist/competence/catalog-validation.d.ts.map +1 -0
- package/dist/competence/catalog-validation.js +168 -0
- package/dist/competence/catalog-validation.js.map +1 -0
- package/dist/competence/obligation-preview.d.ts +103 -0
- package/dist/competence/obligation-preview.d.ts.map +1 -0
- package/dist/competence/obligation-preview.js +184 -0
- package/dist/competence/obligation-preview.js.map +1 -0
- package/dist/competence/repository.d.ts +139 -1
- package/dist/competence/repository.d.ts.map +1 -1
- package/dist/competence/repository.js +325 -17
- package/dist/competence/repository.js.map +1 -1
- package/dist/dashboard/pilot-panel.d.ts +100 -0
- package/dist/dashboard/pilot-panel.d.ts.map +1 -0
- package/dist/dashboard/pilot-panel.js +87 -0
- package/dist/dashboard/pilot-panel.js.map +1 -0
- package/dist/dashboard/repository.d.ts.map +1 -1
- package/dist/dashboard/repository.js +11 -1
- package/dist/dashboard/repository.js.map +1 -1
- package/dist/db/client.d.ts +45 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +16 -11
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrate.d.ts +36 -1
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +199 -32
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/provision-e2e-identity.d.ts +2 -0
- package/dist/db/provision-e2e-identity.d.ts.map +1 -0
- package/dist/db/provision-e2e-identity.js +109 -0
- package/dist/db/provision-e2e-identity.js.map +1 -0
- package/dist/fiscal/applicability.d.ts +73 -0
- package/dist/fiscal/applicability.d.ts.map +1 -0
- package/dist/fiscal/applicability.js +160 -0
- package/dist/fiscal/applicability.js.map +1 -0
- package/dist/fiscal/conditions.d.ts +99 -0
- package/dist/fiscal/conditions.d.ts.map +1 -0
- package/dist/fiscal/conditions.js +190 -0
- package/dist/fiscal/conditions.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-contract.d.ts +315 -0
- package/dist/fiscal/contracts/nfse-adn-contract.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-contract.js +386 -0
- package/dist/fiscal/contracts/nfse-adn-contract.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts +13 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.js +103 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.d.ts +77 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.js +215 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
- package/dist/fiscal/coverage/model.d.ts +86 -0
- package/dist/fiscal/coverage/model.d.ts.map +1 -0
- package/dist/fiscal/coverage/model.js +120 -0
- package/dist/fiscal/coverage/model.js.map +1 -0
- package/dist/fiscal/coverage/requests.d.ts +70 -0
- package/dist/fiscal/coverage/requests.d.ts.map +1 -0
- package/dist/fiscal/coverage/requests.js +95 -0
- package/dist/fiscal/coverage/requests.js.map +1 -0
- package/dist/fiscal/credentials/material.d.ts +81 -0
- package/dist/fiscal/credentials/material.d.ts.map +1 -0
- package/dist/fiscal/credentials/material.js +164 -0
- package/dist/fiscal/credentials/material.js.map +1 -0
- package/dist/fiscal/credentials/readiness.d.ts +92 -0
- package/dist/fiscal/credentials/readiness.d.ts.map +1 -0
- package/dist/fiscal/credentials/readiness.js +159 -0
- package/dist/fiscal/credentials/readiness.js.map +1 -0
- package/dist/fiscal/eligibility.d.ts +106 -0
- package/dist/fiscal/eligibility.d.ts.map +1 -0
- package/dist/fiscal/eligibility.js +194 -0
- package/dist/fiscal/eligibility.js.map +1 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts +57 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts.map +1 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.js +121 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
- package/dist/fiscal/ingestion/adn-transport.d.ts +123 -0
- package/dist/fiscal/ingestion/adn-transport.d.ts.map +1 -0
- package/dist/fiscal/ingestion/adn-transport.js +220 -0
- package/dist/fiscal/ingestion/adn-transport.js.map +1 -0
- package/dist/fiscal/ingestion/direction.d.ts +60 -0
- package/dist/fiscal/ingestion/direction.d.ts.map +1 -0
- package/dist/fiscal/ingestion/direction.js +32 -0
- package/dist/fiscal/ingestion/direction.js.map +1 -0
- package/dist/fiscal/ingestion/nfse-adn.d.ts +91 -0
- package/dist/fiscal/ingestion/nfse-adn.d.ts.map +1 -0
- package/dist/fiscal/ingestion/nfse-adn.js +222 -0
- package/dist/fiscal/ingestion/nfse-adn.js.map +1 -0
- package/dist/fiscal/ingestion/pipeline.d.ts +168 -0
- package/dist/fiscal/ingestion/pipeline.d.ts.map +1 -0
- package/dist/fiscal/ingestion/pipeline.js +699 -0
- package/dist/fiscal/ingestion/pipeline.js.map +1 -0
- package/dist/fiscal/ingestion/provider.d.ts +206 -0
- package/dist/fiscal/ingestion/provider.d.ts.map +1 -0
- package/dist/fiscal/ingestion/provider.js +47 -0
- package/dist/fiscal/ingestion/provider.js.map +1 -0
- package/dist/fiscal/ingestion/repository.d.ts +82 -0
- package/dist/fiscal/ingestion/repository.d.ts.map +1 -0
- package/dist/fiscal/ingestion/repository.js +127 -0
- package/dist/fiscal/ingestion/repository.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-provider.d.ts +92 -0
- package/dist/fiscal/ingestion/synthetic-provider.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-provider.js +99 -0
- package/dist/fiscal/ingestion/synthetic-provider.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.d.ts +19 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.js +9 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport.d.ts +55 -0
- package/dist/fiscal/ingestion/synthetic-transport.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport.js +57 -0
- package/dist/fiscal/ingestion/synthetic-transport.js.map +1 -0
- package/dist/fiscal/ingestion/xml-reader.d.ts +55 -0
- package/dist/fiscal/ingestion/xml-reader.d.ts.map +1 -0
- package/dist/fiscal/ingestion/xml-reader.js +112 -0
- package/dist/fiscal/ingestion/xml-reader.js.map +1 -0
- package/dist/fiscal/repository.d.ts +220 -0
- package/dist/fiscal/repository.d.ts.map +1 -0
- package/dist/fiscal/repository.js +449 -0
- package/dist/fiscal/repository.js.map +1 -0
- package/dist/fiscal/sync/circuit.d.ts +86 -0
- package/dist/fiscal/sync/circuit.d.ts.map +1 -0
- package/dist/fiscal/sync/circuit.js +118 -0
- package/dist/fiscal/sync/circuit.js.map +1 -0
- package/dist/fiscal/sync/intervention.d.ts +81 -0
- package/dist/fiscal/sync/intervention.d.ts.map +1 -0
- package/dist/fiscal/sync/intervention.js +135 -0
- package/dist/fiscal/sync/intervention.js.map +1 -0
- package/dist/fiscal/sync/lease.d.ts +118 -0
- package/dist/fiscal/sync/lease.d.ts.map +1 -0
- package/dist/fiscal/sync/lease.js +139 -0
- package/dist/fiscal/sync/lease.js.map +1 -0
- package/dist/fiscal/sync/observability.d.ts +148 -0
- package/dist/fiscal/sync/observability.d.ts.map +1 -0
- package/dist/fiscal/sync/observability.js +239 -0
- package/dist/fiscal/sync/observability.js.map +1 -0
- package/dist/fiscal/sync/orchestrator.d.ts +132 -0
- package/dist/fiscal/sync/orchestrator.d.ts.map +1 -0
- package/dist/fiscal/sync/orchestrator.js +487 -0
- package/dist/fiscal/sync/orchestrator.js.map +1 -0
- package/dist/fiscal/sync/policy.d.ts +87 -0
- package/dist/fiscal/sync/policy.d.ts.map +1 -0
- package/dist/fiscal/sync/policy.js +136 -0
- package/dist/fiscal/sync/policy.js.map +1 -0
- package/dist/fiscal/sync/reprocess.d.ts +76 -0
- package/dist/fiscal/sync/reprocess.d.ts.map +1 -0
- package/dist/fiscal/sync/reprocess.js +237 -0
- package/dist/fiscal/sync/reprocess.js.map +1 -0
- package/dist/fiscal/sync/retry.d.ts +82 -0
- package/dist/fiscal/sync/retry.d.ts.map +1 -0
- package/dist/fiscal/sync/retry.js +176 -0
- package/dist/fiscal/sync/retry.js.map +1 -0
- package/dist/fiscal/sync/secret-boundary.d.ts +169 -0
- package/dist/fiscal/sync/secret-boundary.d.ts.map +1 -0
- package/dist/fiscal/sync/secret-boundary.js +116 -0
- package/dist/fiscal/sync/secret-boundary.js.map +1 -0
- package/dist/fiscal/transport/https.d.ts +86 -0
- package/dist/fiscal/transport/https.d.ts.map +1 -0
- package/dist/fiscal/transport/https.js +303 -0
- package/dist/fiscal/transport/https.js.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts +80 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.js +323 -0
- package/dist/fiscal/transport/synthetic-tls.js.map +1 -0
- package/dist/fiscal/transport/types.d.ts +134 -0
- package/dist/fiscal/transport/types.d.ts.map +1 -0
- package/dist/fiscal/transport/types.js +88 -0
- package/dist/fiscal/transport/types.js.map +1 -0
- package/dist/import/br-documents.d.ts +26 -0
- package/dist/import/br-documents.d.ts.map +1 -0
- package/dist/import/br-documents.js +78 -0
- package/dist/import/br-documents.js.map +1 -0
- package/dist/import/clients-import.d.ts +122 -4
- package/dist/import/clients-import.d.ts.map +1 -1
- package/dist/import/clients-import.js +341 -41
- package/dist/import/clients-import.js.map +1 -1
- package/dist/index.d.ts +115 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +100 -7
- package/dist/index.js.map +1 -1
- package/dist/legal/documents.d.ts +12 -1
- package/dist/legal/documents.d.ts.map +1 -1
- package/dist/legal/documents.js +98 -14
- package/dist/legal/documents.js.map +1 -1
- package/dist/legal/index.d.ts +1 -1
- package/dist/legal/index.d.ts.map +1 -1
- package/dist/legal/index.js +1 -1
- package/dist/legal/index.js.map +1 -1
- package/dist/legal/types.d.ts +37 -2
- package/dist/legal/types.d.ts.map +1 -1
- package/dist/legal/types.js.map +1 -1
- package/dist/onboarding/persistence.d.ts +10 -1
- package/dist/onboarding/persistence.d.ts.map +1 -1
- package/dist/onboarding/persistence.js +4 -4
- package/dist/onboarding/persistence.js.map +1 -1
- package/dist/pilot/go-live-checklist.d.ts +41 -0
- package/dist/pilot/go-live-checklist.d.ts.map +1 -0
- package/dist/pilot/go-live-checklist.js +209 -0
- package/dist/pilot/go-live-checklist.js.map +1 -0
- package/dist/pilot/milestone.d.ts +56 -0
- package/dist/pilot/milestone.d.ts.map +1 -0
- package/dist/pilot/milestone.js +74 -0
- package/dist/pilot/milestone.js.map +1 -0
- package/dist/platform/capabilities.d.ts +88 -0
- package/dist/platform/capabilities.d.ts.map +1 -0
- package/dist/platform/capabilities.js +140 -0
- package/dist/platform/capabilities.js.map +1 -0
- package/dist/platform/job-contract.d.ts +232 -0
- package/dist/platform/job-contract.d.ts.map +1 -0
- package/dist/platform/job-contract.js +403 -0
- package/dist/platform/job-contract.js.map +1 -0
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +34 -0
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/subscription-billing/index.d.ts +6 -5
- package/dist/subscription-billing/index.d.ts.map +1 -1
- package/dist/subscription-billing/index.js +3 -3
- package/dist/subscription-billing/index.js.map +1 -1
- package/dist/subscription-billing/service.d.ts +21 -0
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +90 -15
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/tenancy/features.d.ts +69 -0
- package/dist/tenancy/features.d.ts.map +1 -0
- package/dist/tenancy/features.js +123 -0
- package/dist/tenancy/features.js.map +1 -0
- package/dist/tenancy/settings.d.ts +63 -0
- package/dist/tenancy/settings.d.ts.map +1 -0
- package/dist/tenancy/settings.js +218 -0
- package/dist/tenancy/settings.js.map +1 -0
- package/dist/users/repository.d.ts +16 -1
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +24 -1
- package/dist/users/repository.js.map +1 -1
- package/package.json +9 -2
- package/src/db/migrations/0045_role_write_scope.sql +122 -0
- package/src/db/migrations/0046_pilot_activation_model.sql +184 -0
- package/src/db/migrations/0047_recipient_clearance.sql +89 -0
- package/src/db/migrations/0048_item_type_note.sql +16 -0
- package/src/db/migrations/0049_national_fiscal_engine.sql +279 -0
- package/src/db/migrations/0050_fiscal_vocabulary_readonly.sql +29 -0
- package/src/db/migrations/0051_seed_rules_from_catalog.sql +72 -0
- package/src/db/migrations/0052_fiscal_rule_delete_scope.sql +57 -0
- package/src/db/migrations/0053_rule_validity_lower_bound.sql +44 -0
- package/src/db/migrations/0054_tenant_profile_and_rule_source.sql +89 -0
- package/src/db/migrations/0055_job_capability_contract.sql +300 -0
- package/src/db/migrations/0056_fiscal_document_ingestion.sql +337 -0
- package/src/db/migrations/0057_fiscal_pending_event_inbox.sql +228 -0
- package/src/db/migrations/0058_fiscal_operational_engine.sql +516 -0
- package/src/db/migrations/0059_fiscal_contract_version.sql +59 -0
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
export async function getCoreStats(tx) {
|
|
2
|
+
// "Clientes ativos" precisa contar clientes ATIVOS.
|
|
3
|
+
//
|
|
4
|
+
// Contava todo registro não removido, inativos inclusive — e o card se chama
|
|
5
|
+
// "Clientes ativos". Com dois clientes inativados, a mesma tela mostrava
|
|
6
|
+
// `Carteira → Clientes ativos = 0` e `Resumo geral → Clientes ativos = 2`,
|
|
7
|
+
// porque o painel de carteira filtra por `status` e este não filtrava.
|
|
8
|
+
//
|
|
9
|
+
// Duas consultas respondendo à mesma pergunta com definições diferentes é
|
|
10
|
+
// como um painel perde a confiança de quem o lê: não há como saber qual dos
|
|
11
|
+
// dois números está certo sem abrir o código.
|
|
2
12
|
const [clients] = await tx `
|
|
3
|
-
SELECT count(*)::int AS n FROM client WHERE deleted_at IS NULL
|
|
13
|
+
SELECT count(*)::int AS n FROM client WHERE deleted_at IS NULL AND status = 'active'
|
|
4
14
|
`;
|
|
5
15
|
const [users] = await tx `
|
|
6
16
|
SELECT count(*)::int AS n FROM membership WHERE status = 'active' AND deleted_at IS NULL
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/dashboard/repository.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAM;IACvC,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE,CAAiB;;GAE1C,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAiB;;GAExC,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,CAAiB;;;;GAIvC,CAAC;IACF,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE,CAAiB;;;;;;GAM1C,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAgE;;;GAGtF,CAAC;IACF,OAAO;QACL,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC;QACxB,WAAW,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC;QAC1B,YAAY,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC;QAC1B,eAAe,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC;QAChC,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,YAAY,EAAE,CAAC,CAAC,aAAa;YAC7B,UAAU,EAAE,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE;SACxC,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/dashboard/repository.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAM;IACvC,oDAAoD;IACpD,EAAE;IACF,6EAA6E;IAC7E,yEAAyE;IACzE,2EAA2E;IAC3E,uEAAuE;IACvE,EAAE;IACF,0EAA0E;IAC1E,4EAA4E;IAC5E,8CAA8C;IAC9C,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE,CAAiB;;GAE1C,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAiB;;GAExC,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,CAAiB;;;;GAIvC,CAAC;IACF,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE,CAAiB;;;;;;GAM1C,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAgE;;;GAGtF,CAAC;IACF,OAAO;QACL,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC;QACxB,WAAW,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC;QAC1B,YAAY,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC;QAC1B,eAAe,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC;QAChC,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,YAAY,EAAE,CAAC,CAAC,aAAa;YAC7B,UAAU,EAAE,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE;SACxC,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
|
package/dist/db/client.d.ts
CHANGED
|
@@ -15,5 +15,50 @@ export interface DbOptions {
|
|
|
15
15
|
* - OWNER: roda migrations/seed (cria schema).
|
|
16
16
|
* - APP (baruk_app): runtime da aplicação — NOSUPERUSER, NOBYPASSRLS, sujeito à RLS.
|
|
17
17
|
*/
|
|
18
|
+
/**
|
|
19
|
+
* Política de TLS da conexão.
|
|
20
|
+
*
|
|
21
|
+
* ## O que mudou, e por quê
|
|
22
|
+
*
|
|
23
|
+
* A versão anterior decidia por uma **allowlist de host**:
|
|
24
|
+
*
|
|
25
|
+
* ssl = /sslmode=require|render\.com|neon\.tech|supabase|amazonaws|\.cloud/
|
|
26
|
+
* ? { rejectUnauthorized: false } : undefined
|
|
27
|
+
*
|
|
28
|
+
* Dois defeitos, medidos em 2026-09-05:
|
|
29
|
+
*
|
|
30
|
+
* 1. **`rejectUnauthorized: false` desliga a validação do certificado.** A
|
|
31
|
+
* conexão fica cifrada e não autenticada — um MITM ativo entre a aplicação e
|
|
32
|
+
* o banco passa despercebido. Não havia necessidade técnica: uma sonda contra
|
|
33
|
+
* o provedor real conectou com `verify-full`, com `rejectUnauthorized: true`
|
|
34
|
+
* e com a validação padrão do Node. Era receita copiada.
|
|
35
|
+
*
|
|
36
|
+
* 2. **A allowlist decidia o lado errado do fail.** Um host gerenciado FORA da
|
|
37
|
+
* lista — Azure, GCP, um domínio próprio sem `sslmode` na string — caía em
|
|
38
|
+
* `ssl: undefined`, ou seja **sem TLS nenhum**, em silêncio. A produção de
|
|
39
|
+
* hoje não é afetada (a URL casa por dois motivos), mas trocar o host
|
|
40
|
+
* quebraria a cifra sem quebrar a conexão, que é o pior desfecho possível.
|
|
41
|
+
*
|
|
42
|
+
* ## A política agora
|
|
43
|
+
*
|
|
44
|
+
* **TLS validado é o padrão.** Fica de fora apenas o que é comprovadamente
|
|
45
|
+
* local, ou o que declara `sslmode=disable` — o mecanismo do próprio Postgres
|
|
46
|
+
* para dizer "esta conexão não usa TLS", e não uma invenção nossa. Host novo
|
|
47
|
+
* entra seguro sem ninguém precisar lembrar de adicioná-lo a uma lista.
|
|
48
|
+
*
|
|
49
|
+
* CA privada entra por `PGSSLROOTCERT`, a variável padrão do libpq — mesmo nome
|
|
50
|
+
* que `psql` e todo o ecossistema já usam, para que não exista um segundo jeito
|
|
51
|
+
* de configurar a mesma coisa.
|
|
52
|
+
*/
|
|
53
|
+
export interface TlsDecision {
|
|
54
|
+
/** O que vai para o driver. `undefined` = conexão em texto claro. */
|
|
55
|
+
ssl: {
|
|
56
|
+
rejectUnauthorized: boolean;
|
|
57
|
+
ca?: string;
|
|
58
|
+
} | undefined;
|
|
59
|
+
/** Por que — usado por diagnóstico e teste. Nunca contém a connection string. */
|
|
60
|
+
reason: 'local' | 'explicitly-disabled' | 'verified';
|
|
61
|
+
}
|
|
62
|
+
export declare function resolveTls(connectionString: string, env?: NodeJS.ProcessEnv): TlsDecision;
|
|
18
63
|
export declare function createDb(connectionString: string, opts?: DbOptions): Db;
|
|
19
64
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/db/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,MAAM,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AACrD,MAAM,MAAM,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAChE,gEAAgE;AAChE,MAAM,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,CAAC;AAEhC,MAAM,WAAW,SAAS;IACxB,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,IAAI,GAAE,SAAc,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,MAAM,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AACrD,MAAM,MAAM,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAChE,gEAAgE;AAChE,MAAM,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,CAAC;AAEhC,MAAM,WAAW,SAAS;IACxB,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;CACxB;AAED;;;;;GAKG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,GAAG,EAAE;QAAE,kBAAkB,EAAE,OAAO,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAC9D,iFAAiF;IACjF,MAAM,EAAE,OAAO,GAAG,qBAAqB,GAAG,UAAU,CAAC;CACtD;AAKD,wBAAgB,UAAU,CACxB,gBAAgB,EAAE,MAAM,EACxB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,WAAW,CAUb;AAED,wBAAgB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,IAAI,GAAE,SAAc,GAAG,EAAE,CAU3E"}
|
package/dist/db/client.js
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
import postgres from 'postgres';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
const LOCAL_HOST = /@(localhost|127\.0\.0\.1|host\.docker\.internal|\[?::1\]?)[:/]/;
|
|
3
|
+
const SSL_DISABLED = /[?&]sslmode=disable(&|$)/;
|
|
4
|
+
export function resolveTls(connectionString, env = process.env) {
|
|
5
|
+
if (LOCAL_HOST.test(connectionString))
|
|
6
|
+
return { ssl: undefined, reason: 'local' };
|
|
7
|
+
if (SSL_DISABLED.test(connectionString)) {
|
|
8
|
+
return { ssl: undefined, reason: 'explicitly-disabled' };
|
|
9
|
+
}
|
|
10
|
+
const ca = env['PGSSLROOTCERT_PEM']?.trim();
|
|
11
|
+
return {
|
|
12
|
+
ssl: ca ? { rejectUnauthorized: true, ca } : { rejectUnauthorized: true },
|
|
13
|
+
reason: 'verified',
|
|
14
|
+
};
|
|
15
|
+
}
|
|
8
16
|
export function createDb(connectionString, opts = {}) {
|
|
9
|
-
|
|
10
|
-
// Postgres local. Detecta pelo host/flag da URL.
|
|
11
|
-
const isLocal = /@(localhost|127\.0\.0\.1|host\.docker\.internal|\[?::1\]?)[:/]/.test(connectionString);
|
|
12
|
-
const wantsSsl = !isLocal && /sslmode=require|render\.com|neon\.tech|supabase|amazonaws|\.cloud/.test(connectionString);
|
|
17
|
+
const { ssl } = resolveTls(connectionString);
|
|
13
18
|
return postgres(connectionString, {
|
|
14
19
|
max: opts.max ?? 10,
|
|
15
20
|
// UUIDs são gerados na aplicação (uuidv7); datas em UTC.
|
|
16
21
|
prepare: true,
|
|
17
|
-
ssl
|
|
22
|
+
ssl,
|
|
18
23
|
onnotice: () => { }, // silencia NOTICEs verbosos de DO-blocks/IF EXISTS
|
|
19
24
|
});
|
|
20
25
|
}
|
package/dist/db/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AA8DhC,MAAM,UAAU,GAAG,gEAAgE,CAAC;AACpF,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAEhD,MAAM,UAAU,UAAU,CACxB,gBAAwB,EACxB,MAAyB,OAAO,CAAC,GAAG;IAEpC,IAAI,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAClF,IAAI,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAC3D,CAAC;IACD,MAAM,EAAE,GAAG,GAAG,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,CAAC;IAC5C,OAAO;QACL,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE;QACzE,MAAM,EAAE,UAAU;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,gBAAwB,EAAE,OAAkB,EAAE;IACrE,MAAM,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAE7C,OAAO,QAAQ,CAAC,gBAAgB,EAAE;QAChC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE;QACnB,yDAAyD;QACzD,OAAO,EAAE,IAAI;QACb,GAAG;QACH,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,mDAAmD;KACxE,CAAC,CAAC;AACL,CAAC"}
|
package/dist/db/migrate.d.ts
CHANGED
|
@@ -1,2 +1,37 @@
|
|
|
1
|
-
|
|
1
|
+
import { type Db } from './client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Extrai os nomes de tabela criados pelas migrations do Office.
|
|
4
|
+
*
|
|
5
|
+
* Esta é a ALLOWLIST de privilégio do runtime. Ela nasce da mesma fonte que cria
|
|
6
|
+
* as tabelas — o próprio SQL das migrations — e não de um manifesto paralelo, que
|
|
7
|
+
* alguém esqueceria de atualizar ao criar a tabela seguinte.
|
|
8
|
+
*
|
|
9
|
+
* Por que existe: até 0044 o runner concedia `ON ALL TABLES IN SCHEMA public`.
|
|
10
|
+
* Em um banco onde o schema do Office coabita com o de outro produto — o caso do
|
|
11
|
+
* `neondb` em produção, que carrega 187 tabelas de um schema Prisma anterior —
|
|
12
|
+
* "ALL TABLES" entrega ao papel de runtime do Office SELECT/INSERT/UPDATE/DELETE
|
|
13
|
+
* sobre dados que não são dele. O escopo do GRANT tem de ser o schema que este
|
|
14
|
+
* repositório cria, não o schema que este banco por acaso contém.
|
|
15
|
+
*/
|
|
16
|
+
export declare function officeTablesFromSql(sqls: readonly string[]): string[];
|
|
17
|
+
export interface LeastPrivilegeResult {
|
|
18
|
+
/** Tabelas fora do Office das quais o privilégio de `baruk_app` foi revogado. */
|
|
19
|
+
revoked: string[];
|
|
20
|
+
/** Papéis cujo DEFAULT PRIVILEGES para `baruk_app` foi removido. */
|
|
21
|
+
defaultsCleared: string[];
|
|
22
|
+
/** Papéis cujo DEFAULT PRIVILEGES não pôde ser removido com o papel atual. */
|
|
23
|
+
defaultsResidual: string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Aplica least privilege ao papel de runtime.
|
|
27
|
+
*
|
|
28
|
+
* Concede DML nas tabelas do Office, revoga em tudo o que não é do Office, e
|
|
29
|
+
* remove o DEFAULT PRIVILEGES que faria a próxima tabela criada no schema nascer
|
|
30
|
+
* alcançável. Idempotente: em banco limpo não há estrangeiras e a função é um
|
|
31
|
+
* no-op além do GRANT.
|
|
32
|
+
*
|
|
33
|
+
* Recebe a allowlist em vez de descobri-la para que o teste possa exercitar a
|
|
34
|
+
* contenção sem depender do conteúdo real das migrations.
|
|
35
|
+
*/
|
|
36
|
+
export declare function enforceRuntimeLeastPrivilege(sql: Db, officeTables: readonly string[]): Promise<LeastPrivilegeResult>;
|
|
2
37
|
//# sourceMappingURL=migrate.d.ts.map
|
package/dist/db/migrate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAY,KAAK,EAAE,EAAE,MAAM,aAAa,CAAC;AAmDhD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAwCrE;AAOD,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oEAAoE;IACpE,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,8EAA8E;IAC9E,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,4BAA4B,CAChD,GAAG,EAAE,EAAE,EACP,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAoG/B"}
|
package/dist/db/migrate.js
CHANGED
|
@@ -5,14 +5,15 @@
|
|
|
5
5
|
* um em `_migration` com checksum. Roda com o papel OWNER (DATABASE_URL). Antes
|
|
6
6
|
* das migrations, cria o papel de aplicação `baruk_app` quando ausente
|
|
7
7
|
* (NOSUPERUSER, NOBYPASSRLS), sem reconfigurar uma credencial de runtime já
|
|
8
|
-
* existente; ao final,
|
|
8
|
+
* existente; ao final, aplica least privilege (allowlist do Office + contenção
|
|
9
|
+
* do que não é do Office). Ver docs/architecture/18-database-grant-policy.md.
|
|
9
10
|
*
|
|
10
11
|
* Uso: `pnpm db:migrate` (ou `tsx src/db/migrate.ts`)
|
|
11
12
|
*/
|
|
12
13
|
import { createHash } from 'node:crypto';
|
|
13
14
|
import { readdirSync, readFileSync, existsSync } from 'node:fs';
|
|
14
15
|
import { dirname, join, resolve } from 'node:path';
|
|
15
|
-
import { fileURLToPath } from 'node:url';
|
|
16
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
16
17
|
import { createDb } from './client.js';
|
|
17
18
|
import { loadEnv } from './load-env.js';
|
|
18
19
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
@@ -53,6 +54,177 @@ function collectMigrations() {
|
|
|
53
54
|
// Ordena por nome (prefixos numéricos zero-padded garantem ordem correta).
|
|
54
55
|
return all.sort((a, b) => a.name.localeCompare(b.name, 'en'));
|
|
55
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Extrai os nomes de tabela criados pelas migrations do Office.
|
|
59
|
+
*
|
|
60
|
+
* Esta é a ALLOWLIST de privilégio do runtime. Ela nasce da mesma fonte que cria
|
|
61
|
+
* as tabelas — o próprio SQL das migrations — e não de um manifesto paralelo, que
|
|
62
|
+
* alguém esqueceria de atualizar ao criar a tabela seguinte.
|
|
63
|
+
*
|
|
64
|
+
* Por que existe: até 0044 o runner concedia `ON ALL TABLES IN SCHEMA public`.
|
|
65
|
+
* Em um banco onde o schema do Office coabita com o de outro produto — o caso do
|
|
66
|
+
* `neondb` em produção, que carrega 187 tabelas de um schema Prisma anterior —
|
|
67
|
+
* "ALL TABLES" entrega ao papel de runtime do Office SELECT/INSERT/UPDATE/DELETE
|
|
68
|
+
* sobre dados que não são dele. O escopo do GRANT tem de ser o schema que este
|
|
69
|
+
* repositório cria, não o schema que este banco por acaso contém.
|
|
70
|
+
*/
|
|
71
|
+
export function officeTablesFromSql(sqls) {
|
|
72
|
+
const found = new Set();
|
|
73
|
+
// `CREATE TABLE [IF NOT EXISTS] [public.]["]nome["]` — cobre as duas formas em
|
|
74
|
+
// uso (`CREATE TABLE client`, `CREATE TABLE IF NOT EXISTS channel_route`) e a
|
|
75
|
+
// única com aspas (`CREATE TABLE "user"`).
|
|
76
|
+
const create = /CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?(?:public\s*\.\s*)?"?([A-Za-z_][A-Za-z0-9_]*)"?/gi;
|
|
77
|
+
// `DROP TABLE [IF EXISTS] [public.]["]nome["]`.
|
|
78
|
+
//
|
|
79
|
+
// Faltava, e a ausência era um defeito de mão única: a allowlist só CRESCIA.
|
|
80
|
+
// Uma migration que removesse uma tabela deixava o nome aqui para sempre, e o
|
|
81
|
+
// `GRANT ... ON <lista>` seguinte falhava com "relation does not exist" —
|
|
82
|
+
// quebrando todo `pnpm db:migrate` posterior, inclusive em produção, por uma
|
|
83
|
+
// tabela que ninguém mais tem. Descoberto ao remover `client_fiscal_credential`
|
|
84
|
+
// na 0056.
|
|
85
|
+
//
|
|
86
|
+
// A ordem das migrations é a ordem do array, então processar create e drop na
|
|
87
|
+
// sequência reproduz o estado final: criar, remover e recriar termina criada.
|
|
88
|
+
const drop = /DROP\s+TABLE\s+(?:IF\s+EXISTS\s+)?(?:public\s*\.\s*)?"?([A-Za-z_][A-Za-z0-9_]*)"?/gi;
|
|
89
|
+
for (const sql of sqls) {
|
|
90
|
+
// Um único varrimento por arquivo, respeitando a posição de cada comando:
|
|
91
|
+
// dentro do MESMO arquivo, um DROP antes de um CREATE não pode apagar a
|
|
92
|
+
// criação que vem depois.
|
|
93
|
+
const events = [];
|
|
94
|
+
for (const m of sql.matchAll(create)) {
|
|
95
|
+
if (m[1])
|
|
96
|
+
events.push({ at: m.index ?? 0, name: m[1].toLowerCase(), kind: 'create' });
|
|
97
|
+
}
|
|
98
|
+
for (const m of sql.matchAll(drop)) {
|
|
99
|
+
if (m[1])
|
|
100
|
+
events.push({ at: m.index ?? 0, name: m[1].toLowerCase(), kind: 'drop' });
|
|
101
|
+
}
|
|
102
|
+
events.sort((a, b) => a.at - b.at);
|
|
103
|
+
for (const e of events) {
|
|
104
|
+
if (e.kind === 'create')
|
|
105
|
+
found.add(e.name);
|
|
106
|
+
else
|
|
107
|
+
found.delete(e.name);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// `_migration` é do runner, não de um arquivo de migration.
|
|
111
|
+
found.add('_migration');
|
|
112
|
+
return [...found].sort();
|
|
113
|
+
}
|
|
114
|
+
/** Aspas duplas em identificador SQL (nomes vêm de arquivo versionado, nunca de input). */
|
|
115
|
+
function quoteIdent(name) {
|
|
116
|
+
return `"${name.replace(/"/g, '""')}"`;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Aplica least privilege ao papel de runtime.
|
|
120
|
+
*
|
|
121
|
+
* Concede DML nas tabelas do Office, revoga em tudo o que não é do Office, e
|
|
122
|
+
* remove o DEFAULT PRIVILEGES que faria a próxima tabela criada no schema nascer
|
|
123
|
+
* alcançável. Idempotente: em banco limpo não há estrangeiras e a função é um
|
|
124
|
+
* no-op além do GRANT.
|
|
125
|
+
*
|
|
126
|
+
* Recebe a allowlist em vez de descobri-la para que o teste possa exercitar a
|
|
127
|
+
* contenção sem depender do conteúdo real das migrations.
|
|
128
|
+
*/
|
|
129
|
+
export async function enforceRuntimeLeastPrivilege(sql, officeTables) {
|
|
130
|
+
const officeList = officeTables.map(quoteIdent).join(', ');
|
|
131
|
+
await sql.unsafe(`
|
|
132
|
+
GRANT USAGE ON SCHEMA public TO baruk_app;
|
|
133
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON ${officeList} TO baruk_app;
|
|
134
|
+
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO baruk_app;
|
|
135
|
+
`);
|
|
136
|
+
// O GRANT acima é amplo por desenho — ele cobre toda tabela do Office. O
|
|
137
|
+
// hardening por tabela tem de vir NA MESMA função, senão qualquer chamador
|
|
138
|
+
// que aplique só o GRANT devolve ao runtime privilégios que migrations
|
|
139
|
+
// anteriores revogaram de propósito. Estado final aqui, não em duas etapas.
|
|
140
|
+
await sql.unsafe(`
|
|
141
|
+
-- Append-only: app não pode alterar/apagar auditoria.
|
|
142
|
+
REVOKE UPDATE, DELETE ON audit_log FROM baruk_app;
|
|
143
|
+
-- Segredos de auth: app pode CRIAR credencial (signup self-service, BILL-01),
|
|
144
|
+
-- mas nunca sobrescrever/apagar uma existente (anti account-takeover).
|
|
145
|
+
REVOKE UPDATE, DELETE ON user_credential FROM baruk_app;
|
|
146
|
+
GRANT INSERT ON user_credential TO baruk_app;
|
|
147
|
+
-- Catálogo comercial: app só lê (seed/owner escreve) — evita reprecificação
|
|
148
|
+
-- por qualquer falha no papel de aplicação.
|
|
149
|
+
REVOKE INSERT, UPDATE, DELETE ON saas_plan FROM baruk_app;
|
|
150
|
+
-- Autorização de workload não-humano: o app só LÊ. Quem concede é o
|
|
151
|
+
-- owner (provisionamento com a credencial de migração), FORA do processo
|
|
152
|
+
-- que consome. Autoridade escrita pelo controlado não é autoridade — e
|
|
153
|
+
-- este REVOKE é o que torna "o chamador não autoemite o próprio grant"
|
|
154
|
+
-- uma propriedade do banco, não uma promessa do TypeScript.
|
|
155
|
+
REVOKE INSERT, UPDATE, DELETE ON service_principal FROM baruk_app;
|
|
156
|
+
REVOKE INSERT, UPDATE, DELETE ON service_principal_grant FROM baruk_app;
|
|
157
|
+
-- Catálogo de papéis: o runtime LE a cada autenticacao e nunca escreve.
|
|
158
|
+
-- O unico escritor do produto e ensureRbacCatalog, que roda com o owner.
|
|
159
|
+
-- Sem este REVOKE, o ramo IS NULL do WITH CHECK antigo deixava um tenant
|
|
160
|
+
-- forjar papel de sistema -- e anexar permissao a um papel que TODOS os
|
|
161
|
+
-- escritorios usam (P0-A, migration 0045).
|
|
162
|
+
REVOKE INSERT, UPDATE, DELETE ON role FROM baruk_app;
|
|
163
|
+
REVOKE INSERT, UPDATE, DELETE ON role_permission FROM baruk_app;
|
|
164
|
+
-- Vocabulário do perfil fiscal: catálogo GLOBAL sem tenant, logo sem RLS
|
|
165
|
+
-- que o proteja. O runtime lê a cada avaliação e nunca escreve.
|
|
166
|
+
REVOKE INSERT, UPDATE, DELETE ON fiscal_attribute_definition FROM baruk_app;
|
|
167
|
+
-- Registro de capacidades do schema (0055): catálogo GLOBAL sem tenant,
|
|
168
|
+
-- logo sem RLS que o proteja. O worker LÊ para decidir se pode executar, e
|
|
169
|
+
-- nunca escreve — um processo que pudesse declarar a própria capacidade
|
|
170
|
+
-- teria um portão com a chave do lado de dentro. Quem escreve é a migration,
|
|
171
|
+
-- com o papel owner, FORA do processo que consome.
|
|
172
|
+
REVOKE INSERT, UPDATE, DELETE ON platform_capability FROM baruk_app;
|
|
173
|
+
-- Cobertura fiscal (0058): catálogo GLOBAL sem tenant, logo sem RLS. A
|
|
174
|
+
-- adesão de um município ao ADN é o mesmo fato para todos os escritórios, e
|
|
175
|
+
-- a restrição que exige fonte e data para afirmar cobertura só vale se o
|
|
176
|
+
-- runtime não puder contorná-la escrevendo a própria linha. Quem escreve é
|
|
177
|
+
-- a migration, com o owner, FORA do processo que consome.
|
|
178
|
+
REVOKE INSERT, UPDATE, DELETE ON fiscal_coverage FROM baruk_app;
|
|
179
|
+
-- Controle de migrations é privado do owner.
|
|
180
|
+
REVOKE ALL ON _migration FROM baruk_app;
|
|
181
|
+
`);
|
|
182
|
+
// Tudo o que o runtime alcança e não é do Office.
|
|
183
|
+
const foreign = await sql `
|
|
184
|
+
SELECT c.relname
|
|
185
|
+
FROM pg_class c
|
|
186
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
187
|
+
WHERE n.nspname = 'public'
|
|
188
|
+
AND c.relkind IN ('r', 'p', 'v', 'm', 'f')
|
|
189
|
+
AND NOT (c.relname = ANY (${officeTables}))
|
|
190
|
+
AND (
|
|
191
|
+
has_table_privilege('baruk_app', c.oid, 'SELECT') OR
|
|
192
|
+
has_table_privilege('baruk_app', c.oid, 'INSERT') OR
|
|
193
|
+
has_table_privilege('baruk_app', c.oid, 'UPDATE') OR
|
|
194
|
+
has_table_privilege('baruk_app', c.oid, 'DELETE')
|
|
195
|
+
)
|
|
196
|
+
ORDER BY c.relname
|
|
197
|
+
`;
|
|
198
|
+
const revoked = foreign.map((r) => r.relname);
|
|
199
|
+
if (revoked.length > 0) {
|
|
200
|
+
await sql.unsafe(`REVOKE ALL ON ${revoked.map(quoteIdent).join(', ')} FROM baruk_app;`);
|
|
201
|
+
}
|
|
202
|
+
// Tabela futura não nasce alcançável.
|
|
203
|
+
const owners = await sql `
|
|
204
|
+
SELECT DISTINCT pg_get_userbyid(d.defaclrole) AS rolname
|
|
205
|
+
FROM pg_default_acl d
|
|
206
|
+
LEFT JOIN pg_namespace n ON n.oid = d.defaclnamespace
|
|
207
|
+
WHERE n.nspname = 'public'
|
|
208
|
+
AND d.defaclobjtype = 'r'
|
|
209
|
+
AND array_to_string(d.defaclacl, ',') LIKE '%baruk_app=%'
|
|
210
|
+
`;
|
|
211
|
+
const defaultsCleared = [];
|
|
212
|
+
const defaultsResidual = [];
|
|
213
|
+
for (const { rolname } of owners) {
|
|
214
|
+
try {
|
|
215
|
+
await sql.unsafe(`
|
|
216
|
+
ALTER DEFAULT PRIVILEGES FOR ROLE ${quoteIdent(rolname)} IN SCHEMA public
|
|
217
|
+
REVOKE SELECT, INSERT, UPDATE, DELETE ON TABLES FROM baruk_app;
|
|
218
|
+
`);
|
|
219
|
+
defaultsCleared.push(rolname);
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// Só é possível para papéis dos quais o papel corrente é membro.
|
|
223
|
+
defaultsResidual.push(rolname);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return { revoked, defaultsCleared, defaultsResidual };
|
|
227
|
+
}
|
|
56
228
|
/** Valida a senha do papel de app para poder embutir com segurança no DDL. */
|
|
57
229
|
function safePassword(pw) {
|
|
58
230
|
if (!/^[A-Za-z0-9!@#%^*_\-+=.]{8,}$/.test(pw)) {
|
|
@@ -109,32 +281,21 @@ async function main() {
|
|
|
109
281
|
console.log('ok');
|
|
110
282
|
count++;
|
|
111
283
|
}
|
|
112
|
-
// 3) Grants ao papel de app
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
REVOKE INSERT, UPDATE, DELETE ON saas_plan FROM baruk_app;
|
|
128
|
-
-- Autorização de workload não-humano: o app só LÊ. Quem concede é o
|
|
129
|
-
-- owner (provisionamento com a credencial de migração), FORA do processo
|
|
130
|
-
-- que consome. Autoridade escrita pelo controlado não é autoridade — e
|
|
131
|
-
-- este REVOKE é o que torna "o chamador não autoemite o próprio grant"
|
|
132
|
-
-- uma propriedade do banco, não uma promessa do TypeScript.
|
|
133
|
-
REVOKE INSERT, UPDATE, DELETE ON service_principal FROM baruk_app;
|
|
134
|
-
REVOKE INSERT, UPDATE, DELETE ON service_principal_grant FROM baruk_app;
|
|
135
|
-
-- Controle de migrations é privado do owner.
|
|
136
|
-
REVOKE ALL ON _migration FROM baruk_app;
|
|
137
|
-
`);
|
|
284
|
+
// 3) Grants ao papel de app — ALLOWLIST, não "todas as tabelas do schema".
|
|
285
|
+
// A lista sai do SQL que acabou de ser lido: o que este repositório cria,
|
|
286
|
+
// o runtime alcança; o que ele não cria, o runtime não alcança. Idempotente,
|
|
287
|
+
// e cobre as verticais porque `collectMigrations` já as inclui.
|
|
288
|
+
const officeTables = officeTablesFromSql(migrations.map((m) => m.sql));
|
|
289
|
+
const lp = await enforceRuntimeLeastPrivilege(sql, officeTables);
|
|
290
|
+
if (lp.revoked.length > 0) {
|
|
291
|
+
console.log(`→ contenção: privilégio de baruk_app revogado em ${lp.revoked.length} tabela(s) fora do Office.`);
|
|
292
|
+
}
|
|
293
|
+
for (const r of lp.defaultsCleared) {
|
|
294
|
+
console.log(`→ default privileges de ${r} para baruk_app removidos.`);
|
|
295
|
+
}
|
|
296
|
+
for (const r of lp.defaultsResidual) {
|
|
297
|
+
console.warn(` ⚠ default privileges de ${r} não removíveis com este papel (resíduo).`);
|
|
298
|
+
}
|
|
138
299
|
console.log(count === 0
|
|
139
300
|
? '✓ Nenhuma migration pendente. Schema já atualizado.'
|
|
140
301
|
: `✓ ${count} migration(s) aplicada(s). Papel baruk_app garantido e privilegiado.`);
|
|
@@ -143,8 +304,14 @@ async function main() {
|
|
|
143
304
|
await sql.end({ timeout: 5 });
|
|
144
305
|
}
|
|
145
306
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
307
|
+
// Só migra quando ESTE arquivo é o entrypoint. Sem a guarda, qualquer `import`
|
|
308
|
+
// do módulo — por exemplo o teste que exercita a allowlist — dispararia a
|
|
309
|
+
// migração como efeito colateral do import.
|
|
310
|
+
const isEntrypoint = process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href;
|
|
311
|
+
if (isEntrypoint) {
|
|
312
|
+
main().catch((err) => {
|
|
313
|
+
console.error('✗ Falha na migração:', err instanceof Error ? err.message : err);
|
|
314
|
+
process.exit(1);
|
|
315
|
+
});
|
|
316
|
+
}
|
|
150
317
|
//# sourceMappingURL=migrate.js.map
|
package/dist/db/migrate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision-e2e-identity.d.ts","sourceRoot":"","sources":["../../src/db/provision-e2e-identity.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provisiona a identidade de automação E2E de um escritório.
|
|
3
|
+
*
|
|
4
|
+
* ## Por que é um script, e não uma rota
|
|
5
|
+
*
|
|
6
|
+
* Criar a identidade que valida o produto é ato de PROVISIONAMENTO, não de
|
|
7
|
+
* operação. Expor isso como rota daria a alguém dentro do produto o poder de
|
|
8
|
+
* fabricar uma conta de automação — e o valor de uma identidade de privilégio
|
|
9
|
+
* mínimo desaparece se qualquer administrador puder criar outra.
|
|
10
|
+
*
|
|
11
|
+
* ## O que ele garante
|
|
12
|
+
*
|
|
13
|
+
* - `user_type = 'service'` — reconhecível como não-humana em toda consulta;
|
|
14
|
+
* - papel `e2e_automation` e nada além: quatro permissões, tenant único;
|
|
15
|
+
* - idempotente: rodar de novo não duplica nem escala privilégio;
|
|
16
|
+
* - a senha vem do ambiente e **nunca** é impressa, ecoada ou gravada em log.
|
|
17
|
+
*
|
|
18
|
+
* ## Uso
|
|
19
|
+
*
|
|
20
|
+
* OFFICE_MIGRATION_DATABASE_URL=… \
|
|
21
|
+
* E2E_IDENTITY_EMAIL=… E2E_IDENTITY_PASSWORD=… \
|
|
22
|
+
* pnpm --filter @baruk/core provision:e2e --tenant sc
|
|
23
|
+
*
|
|
24
|
+
* Revogar é o caminho inverso e existe na interface: Administração → Usuários →
|
|
25
|
+
* situação "revogado". Rotacionar é rodar de novo com `--rotate` e uma senha
|
|
26
|
+
* nova.
|
|
27
|
+
*/
|
|
28
|
+
import { createDb } from './client.js';
|
|
29
|
+
import { withContext } from './context.js';
|
|
30
|
+
import { assignSystemRole, ensureMembership } from '../tenancy/provisioning.js';
|
|
31
|
+
import { upsertUserWithPassword } from '../auth/service.js';
|
|
32
|
+
const ROLE = 'e2e_automation';
|
|
33
|
+
function arg(nome, padrao) {
|
|
34
|
+
const i = process.argv.indexOf(`--${nome}`);
|
|
35
|
+
return i >= 0 ? (process.argv[i + 1] ?? padrao) : padrao;
|
|
36
|
+
}
|
|
37
|
+
async function main() {
|
|
38
|
+
const url = process.env.OFFICE_MIGRATION_DATABASE_URL ?? process.env.DATABASE_URL;
|
|
39
|
+
const email = process.env.E2E_IDENTITY_EMAIL;
|
|
40
|
+
const senha = process.env.E2E_IDENTITY_PASSWORD;
|
|
41
|
+
const tenantCode = arg('tenant', 'sc');
|
|
42
|
+
const rotate = process.argv.includes('--rotate');
|
|
43
|
+
if (!url)
|
|
44
|
+
throw new Error('OFFICE_MIGRATION_DATABASE_URL ausente.');
|
|
45
|
+
if (!email)
|
|
46
|
+
throw new Error('E2E_IDENTITY_EMAIL ausente.');
|
|
47
|
+
if (!senha || senha.length < 24) {
|
|
48
|
+
throw new Error('E2E_IDENTITY_PASSWORD ausente ou curta demais (mínimo 24 caracteres).');
|
|
49
|
+
}
|
|
50
|
+
const db = createDb(url, { role: 'owner', max: 2 });
|
|
51
|
+
try {
|
|
52
|
+
const [tenant] = await db `
|
|
53
|
+
SELECT id FROM tenant WHERE code = ${tenantCode} AND deleted_at IS NULL
|
|
54
|
+
`;
|
|
55
|
+
if (!tenant)
|
|
56
|
+
throw new Error(`Organização "${tenantCode}" não encontrada.`);
|
|
57
|
+
// `user_type: 'service'` é o que separa esta conta de uma pessoa. O tipo já
|
|
58
|
+
// existe no domínio e na constraint do banco desde a identidade do Core —
|
|
59
|
+
// não é campo inventado para este caso.
|
|
60
|
+
const user = await upsertUserWithPassword(db, {
|
|
61
|
+
email,
|
|
62
|
+
fullName: 'Automação de teste (E2E)',
|
|
63
|
+
password: senha,
|
|
64
|
+
userType: 'service',
|
|
65
|
+
overwritePassword: rotate,
|
|
66
|
+
});
|
|
67
|
+
await ensureMembership(db, tenant.id, user.id);
|
|
68
|
+
await assignSystemRole(db, tenant.id, user.id, ROLE);
|
|
69
|
+
// Conferência de saída: o que foi concedido é exatamente o esperado.
|
|
70
|
+
const permissoes = await withContext(db, { tenantId: tenant.id, userId: user.id }, async (tx) => {
|
|
71
|
+
const rows = await tx `
|
|
72
|
+
SELECT p.key
|
|
73
|
+
FROM user_role ur
|
|
74
|
+
JOIN role r ON r.id = ur.role_id
|
|
75
|
+
JOIN role_permission rp ON rp.role_id = r.id
|
|
76
|
+
JOIN permission p ON p.id = rp.permission_id
|
|
77
|
+
WHERE ur.user_id = ${user.id} AND ur.deleted_at IS NULL
|
|
78
|
+
ORDER BY p.key
|
|
79
|
+
`;
|
|
80
|
+
return rows.map((r) => r.key);
|
|
81
|
+
});
|
|
82
|
+
// Nada de e-mail, id ou senha na saída: só o que se precisa conferir.
|
|
83
|
+
console.log(`✓ identidade E2E provisionada em "${tenantCode}"`);
|
|
84
|
+
console.log(` tipo: service`);
|
|
85
|
+
console.log(` papel: ${ROLE}`);
|
|
86
|
+
console.log(` permissões (${permissoes.length}): ${permissoes.join(', ')}`);
|
|
87
|
+
console.log(` senha definida nesta execução: ${user.passwordWasSet ? 'sim' : 'não (já existia)'}`);
|
|
88
|
+
if (permissoes.length !== 4) {
|
|
89
|
+
throw new Error(`Esperava 4 permissões e encontrei ${permissoes.length}. Abortando: uma identidade de automação com privilégio a mais não deve ficar de pé.`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
await db.end({ timeout: 5 });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Erro de driver de banco costuma trazer a connection string inteira dentro da
|
|
98
|
+
* mensagem. Quem redige tem de ser a ferramenta: confiar em quem chama é
|
|
99
|
+
* confiar que ninguém vai esquecer o filtro uma vez.
|
|
100
|
+
*/
|
|
101
|
+
function semSegredo(err) {
|
|
102
|
+
const bruto = err instanceof Error ? err.message : String(err);
|
|
103
|
+
return bruto.replace(/postgres(?:ql)?:\/\/\S+/gi, '[connection string redigida]');
|
|
104
|
+
}
|
|
105
|
+
main().catch((err) => {
|
|
106
|
+
console.error('✗ provisionamento falhou:', semSegredo(err));
|
|
107
|
+
process.exit(1);
|
|
108
|
+
});
|
|
109
|
+
//# sourceMappingURL=provision-e2e-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision-e2e-identity.js","sourceRoot":"","sources":["../../src/db/provision-e2e-identity.ts"],"names":[],"mappings":"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"}
|