@seedgrid/ai-toolkit 0.0.0-stage → 0.3.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/LICENSE +21 -0
- package/README.md +151 -2
- package/dist/adapters/claude.js +114 -0
- package/dist/adapters/codex.js +108 -0
- package/dist/adapters/index.js +17 -0
- package/dist/adapters/shared.js +142 -0
- package/dist/adapters/types.js +1 -0
- package/dist/cli.js +203 -0
- package/dist/commands/common.js +98 -0
- package/dist/commands/doctor.js +290 -0
- package/dist/commands/init.js +9 -0
- package/dist/commands/install.js +107 -0
- package/dist/commands/remove.js +54 -0
- package/dist/commands/review.js +127 -0
- package/dist/commands/status.js +73 -0
- package/dist/commands/update.js +8 -0
- package/dist/commands/validate.js +27 -0
- package/dist/core/apply.js +181 -0
- package/dist/core/blocks.js +64 -0
- package/dist/core/content.js +528 -0
- package/dist/core/env.js +40 -0
- package/dist/core/frontmatter.js +29 -0
- package/dist/core/hash.js +14 -0
- package/dist/core/inspect.js +51 -0
- package/dist/core/lock.js +124 -0
- package/dist/core/paths.js +65 -0
- package/dist/core/plan.js +242 -0
- package/dist/core/tools.js +62 -0
- package/dist/core/types.js +11 -0
- package/dist/core/updates.js +121 -0
- package/docs/arquitetura.md +80 -0
- package/docs/compatibilidade.md +50 -0
- package/docs/formato.md +155 -0
- package/docs/instalacao.md +105 -0
- package/docs/manutencao.md +115 -0
- package/package.json +43 -4
- package/seedgridKB/SeedGrid/Extensions/Catalogo-de-enums.md +161 -0
- package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +971 -0
- package/seedgridKB/SeedGrid/Extensions/Indice.md +63 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +124 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Enums.md +40 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +97 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao-Rust.md +69 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao.md +88 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Enums.md +33 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Exemplos.md +121 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Rust.md +126 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Visao-geral.md +111 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Configuracao-Rust.md +93 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Configuracao.md +127 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Enums.md +66 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Exemplos.md +151 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Rust.md +120 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Configuracao-Rust.md +136 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Configuracao.md +319 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Enums.md +131 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Exemplos.md +210 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Rust.md +135 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Visao-geral.md +150 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Configuracao-Rust.md +86 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Configuracao.md +243 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Enums.md +165 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Exemplos.md +205 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Rust.md +109 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Visao-geral.md +181 -0
- package/seedgridKB/SeedGrid/Extensions/broker/Configuracao-Rust.md +40 -0
- package/seedgridKB/SeedGrid/Extensions/broker/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Configuracao-Rust.md +73 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Configuracao.md +112 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Enums.md +36 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Exemplos.md +149 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Rust.md +81 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Visao-geral.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Configuracao.md +107 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Enums.md +105 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Exemplos.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Visao-geral.md +99 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +122 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Enums.md +29 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +82 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +118 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao-Rust.md +110 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao.md +157 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Exemplos.md +157 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Rust.md +70 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Visao-geral.md +88 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao-Rust.md +124 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +195 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Enums.md +71 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Exemplos.md +149 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Rust.md +139 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +130 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Configuracao.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Enums.md +52 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Exemplos.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Visao-geral.md +113 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao-Rust.md +67 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao.md +94 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Enums.md +79 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Exemplos.md +172 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Rust.md +107 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Visao-geral.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao-Rust.md +72 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao.md +104 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Exemplos.md +104 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Rust.md +69 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Visao-geral.md +105 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao-Rust.md +68 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao.md +186 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Enums.md +96 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Exemplos.md +229 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Rust.md +80 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Visao-geral.md +112 -0
- package/seedgridKB/SeedGrid/Extensions/runtime/Configuracao-Rust.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/runtime/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/security/Configuracao-Rust.md +327 -0
- package/seedgridKB/SeedGrid/Extensions/security/Configuracao.md +510 -0
- package/seedgridKB/SeedGrid/Extensions/security/Enums.md +95 -0
- package/seedgridKB/SeedGrid/Extensions/security/Exemplos.md +218 -0
- package/seedgridKB/SeedGrid/Extensions/security/Rust.md +203 -0
- package/seedgridKB/SeedGrid/Extensions/security/Visao-geral.md +131 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao-Rust.md +188 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +345 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Enums.md +117 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Exemplos.md +205 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Rust.md +161 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +142 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao-Rust.md +75 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao.md +152 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Enums.md +198 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Exemplos.md +173 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Rust.md +83 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Visao-geral.md +99 -0
- package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +112 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/Indice.md +323 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/API.md +257 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Exemplos.md +307 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Visao-geral.md +51 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/API.md +174 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Exemplos.md +236 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Visao-geral.md +76 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/API.md +339 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/Exemplos.md +311 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/Visao-geral.md +57 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/API.md +125 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/Exemplos.md +116 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/Visao-geral.md +86 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/API.md +490 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Exemplos.md +544 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Visao-geral.md +69 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/API.md +113 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Exemplos.md +159 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Visao-geral.md +92 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/API.md +516 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Exemplos.md +629 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Visao-geral.md +80 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/API.md +615 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Exemplos.md +384 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral.md +111 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/API.md +661 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Exemplos.md +312 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Visao-geral.md +123 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/API.md +1090 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/Exemplos.md +1172 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/Visao-geral.md +98 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/Visao-geral.md +98 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-apikeys.md +118 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-audit.md +88 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-backup.md +131 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-platform.md +132 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-user.md +120 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-login-tenancy.md +119 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-security.md +427 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-self-enter.md +104 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-subdomain-tenancy.md +110 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/API.md +490 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Exemplos.md +561 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Visao-geral.md +82 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/Visao-geral.md +68 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-commons.md +61 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-core.md +140 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-playground.md +112 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-theme.md +97 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/API.md +177 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/Exemplos.md +332 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/Visao-geral.md +106 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/showcase.md +70 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/arquiteto.md +53 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +45 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +43 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +41 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +44 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +40 -0
- package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +78 -0
- package/seedgridKB/SeedGrid/Toolkit/references/glossario.md +15 -0
- package/seedgridKB/SeedGrid/Toolkit/references/modos-shared-native.md +27 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +54 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +39 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/formato-entrega.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +47 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/personalizacao-local.md +22 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/planejar-mudanca/SKILL.md +38 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/SKILL.md +33 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/references/checklist.md +25 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-backend-crud/SKILL.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-bump/SKILL.md +26 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/SKILL.md +221 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/checklist.md +31 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/patterns.md +185 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/routing.md +66 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/SKILL.md +56 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/checklist.md +32 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/steps.md +114 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-review/SKILL.md +61 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/validar-mudanca/SKILL.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/decisao-arquitetura.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/especificacao-tarefa.md +32 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/relatorio-validacao.md +30 -0
- package/seedgridKB/SeedGrid/Versoes.md +64 -0
- package/seedgridKB/SeedGrid/Visao-geral.md +35 -0
- package/seedgridKB/manifest.json +142 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, login-tenancy, rust, configuracao]
|
|
3
|
+
fonte: rust/seedgrid-rust-crate-login-tenancy
|
|
4
|
+
branch: main
|
|
5
|
+
commit: be738a2d1e
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Configuração Rust — `seedgrid-rust-crate-login-tenancy`
|
|
10
|
+
|
|
11
|
+
Volta para: [[SeedGrid/Extensions/login-tenancy/Rust|Porte Rust do login-tenancy]] · Java: [[SeedGrid/Extensions/login-tenancy/Configuracao|Configuração do login-tenancy (Quarkus)]]
|
|
12
|
+
|
|
13
|
+
## 1. Cabeçalho
|
|
14
|
+
|
|
15
|
+
| Item | Valor |
|
|
16
|
+
|---|---|
|
|
17
|
+
| Struct | `LoginTenancyConfig` (`app`, `foundation`, `bootstrap`, `modules`), todas com `Default`; fachada `LoginTenancyFoundationConfig`; registry `ModuleRegistry` — `src/config.rs` |
|
|
18
|
+
| Prefixo lógico | `seedgrid.login-tenancy` (porte de `@ConfigMapping(prefix = "seedgrid.login-tenancy")`, `LoginTenancyConfig.java`) |
|
|
19
|
+
| Mecanismo | `LoginTenancyConfig::from_env()` com `std::env::var("SEEDGRID_LOGIN_TENANCY_*")`; booleans via closure `flag`: `true` (sem caixa) → `true`, **qualquer outro valor → `false`**, ausente → default |
|
|
20
|
+
| Leitura | boot — o host chama `from_env()` e passa a `LoginTenancyState::builder(pool, LoginTenancyFoundationConfig::new(cfg))`; ou `orchestrator::assemble_all` faz isso |
|
|
21
|
+
| Leituras fora do `from_env` | `src/error.rs` lê `SEEDGRID_SHOW_DEV_MESSAGE` **a cada resposta de erro**; `src/orchestrator.rs` (`assemble_all`) lê `SEEDGRID_SECURITY_DEFAULT_COMPANY_CNPJ`, `SEEDGRID_SECURITY_FIRST_ADMIN_USER_EMAIL` e testa a existência de `SEEDGRID_SECURITY_ACCOUNT_ASSIGNABLE_PERMISSION_AUDIENCES`; chama também `SecurityConfig::from_env()` e `AuditConfig::from_env()` |
|
|
22
|
+
| Regra fechada | não existe `seedgrid.login-tenancy.enabled`; a dependência presente ativa o baseline (comentário de `src/config.rs`) |
|
|
23
|
+
| Features Cargo | nenhuma (depende de `seedgrid-billing` com `default-features = false`) |
|
|
24
|
+
| Origem | caminhos relativos a `rust/seedgrid-rust-crate-login-tenancy/` |
|
|
25
|
+
|
|
26
|
+
## 2. Propriedades do crate
|
|
27
|
+
|
|
28
|
+
### 2.1 Aplicação
|
|
29
|
+
|
|
30
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
31
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
32
|
+
| `SEEDGRID_LOGIN_TENANCY_APP_CODE` → `app.code` | `String` | qualquer (sem trim) | `seedgrid-app` | Não | código da aplicação | `GET /public/login-tenancy/status` (`app.code`) | Java: `seedgrid.login-tenancy.app.code` | boot | `src/config.rs` → `from_env`; consumo `src/routes.rs` → `status_handler` |
|
|
33
|
+
| `SEEDGRID_LOGIN_TENANCY_APP_NAME` → `app.name` | `String` | qualquer | `SeedGrid Application` | Não | nome de exibição | status endpoint; e-mail de confirmação do signup (`appName`) | Java: `...app.name` | boot | idem; `src/signup.rs:445` |
|
|
34
|
+
|
|
35
|
+
### 2.2 Superfície técnica e bootstrap
|
|
36
|
+
|
|
37
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
38
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
39
|
+
| `SEEDGRID_LOGIN_TENANCY_FOUNDATION_STATUS_ENABLED` → `foundation.status_enabled` | `bool` | `true`/outro | `true` | Não | `false` → `GET /public/login-tenancy/status` responde 404 | `src/routes.rs` → `status_handler` | Java: `...foundation.status.enabled` | boot | `src/config.rs` |
|
|
40
|
+
| `SEEDGRID_LOGIN_TENANCY_BOOTSTRAP_ENABLED` → `bootstrap.enabled` | `bool` | idem | `true` | Não | só reportado no status (`bootstrap.enabled`); **não** controla o bootstrap do security (que é `LoginTenancyPlatformOverrides.run_security_bootstrap`) | status endpoint | Java: `...bootstrap.enabled` | boot | idem |
|
|
41
|
+
| `SEEDGRID_LOGIN_TENANCY_BOOTSTRAP_ADMIN_ENABLED` → `bootstrap.admin_enabled` | `bool` | idem | `true` | Não | `admin_bootstrap_enabled()` = `bootstrap.enabled && admin_enabled`; só reportado no status | status endpoint | Java: `...bootstrap.admin.enabled` | boot | idem |
|
|
42
|
+
|
|
43
|
+
### 2.3 Módulos de foundation
|
|
44
|
+
|
|
45
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
46
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
47
|
+
| `SEEDGRID_LOGIN_TENANCY_MODULES_BILLING_ENABLED` | `bool` | `true`/outro | `true` | Não | ativação lógica; aparece em `activeModules` do status | `ModuleRegistry::active_modules` → status | Java: `...modules.billing.enabled` | boot | `src/config.rs` |
|
|
48
|
+
| `SEEDGRID_LOGIN_TENANCY_MODULES_APIKEYS_ENABLED` | `bool` | idem | `true` | Não | idem | idem | Java: `...modules.apikeys.enabled` | boot | idem |
|
|
49
|
+
| `SEEDGRID_LOGIN_TENANCY_MODULES_BACKUP_ENABLED` | `bool` | idem | `true` | Não | idem | idem | Java: `...modules.backup.enabled` | boot | idem |
|
|
50
|
+
| `SEEDGRID_LOGIN_TENANCY_MODULES_FILEMANAGEMENT_ENABLED` | `bool` | idem | `true` | Não | idem | idem | Java: `...modules.filemanagement.enabled` | boot | idem |
|
|
51
|
+
|
|
52
|
+
As flags de módulo **não** ligam/desligam nada além do relatório: `assemble_all` não monta billing/apikeys/backup/filemanagement (Confirmado em `src/orchestrator.rs`).
|
|
53
|
+
|
|
54
|
+
### 2.4 Erros e leituras cruzadas
|
|
55
|
+
|
|
56
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
57
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
58
|
+
| `SEEDGRID_SHOW_DEV_MESSAGE` | `bool` | `true` (sem caixa) liga | `false` | Não | inclui `devMessage` (mensagem da exceção) no corpo RFC 7807 | `src/error.rs` → `show_dev_message_enabled` / `ProblemJson` | Java: `seedgrid.show-dev-message` (env por regra MicroProfile; Confirmado no comentário) | por request | `src/error.rs` |
|
|
59
|
+
| `SEEDGRID_SECURITY_DEFAULT_COMPANY_CNPJ` (lida aqui) | `String` | CNPJ (só dígitos são mantidos) | — | Condicional: sem ela o `assemble_all` não registra `LoginTenancyAllowedCompaniesResolver` nem `LoginTenancyJwtTokenCustomizer` (audiência `platform`/`client`) e loga warn | super-leitura + audiência JWT | `src/orchestrator.rs` → `assemble_all` | propriedade do security: [[SeedGrid/Extensions/security/Configuracao-Rust\|config Rust do security]] | boot (`assemble_all`) | `src/orchestrator.rs` |
|
|
60
|
+
| `SEEDGRID_SECURITY_FIRST_ADMIN_USER_EMAIL` (lida aqui) | `String` | e-mail | — | Não | alimenta `firstAdminConfigured` do status | `LoginTenancyStateBuilder::first_admin_email` | idem (security) | boot (`assemble_all`) | `src/orchestrator.rs` |
|
|
61
|
+
| `SEEDGRID_SECURITY_ACCOUNT_ASSIGNABLE_PERMISSION_AUDIENCES` (existência testada) | — | — | se **ausente**, `assemble_all` força `["client"]` | Não | default do login-tenancy para audiences atribuíveis pela conta | `src/orchestrator.rs` (`std::env::var_os(...).is_none()`) | propriedade do security | boot | `src/orchestrator.rs` |
|
|
62
|
+
|
|
63
|
+
### 2.5 Seams/struct do host (sem env)
|
|
64
|
+
|
|
65
|
+
| Propriedade | Tipo | Padrão | Comportamento | Origem |
|
|
66
|
+
|---|---|---|---|---|
|
|
67
|
+
| `LoginTenancyPlatformOverrides.email` | `Option<Arc<dyn EmailService>>` | `LoggingEmailService` do security (só loga) | transporte do e-mail de signup | `src/orchestrator.rs` |
|
|
68
|
+
| `.template` | `Option<Arc<dyn LoginTenancyTemplateProvider>>` | `DefaultLoginTenancyTemplateProvider` | template do e-mail | idem |
|
|
69
|
+
| `.signup_confirmed` | `Option<Arc<dyn SignupConfirmedHandler>>` | `None` | pós-processamento de domínio | idem |
|
|
70
|
+
| `.password_policy` | `Option<PasswordPolicy>` | `PasswordPolicy::default()` = `min_length 8`, `require_upper/lower/special = false` | política de senha do signup — **independente** da política do security (`SECURITY_PASSWORD_*` não se aplica aqui) | `src/state.rs` |
|
|
71
|
+
| `.run_security_bootstrap` | `bool` | `true` | roda `seedgrid_security::bootstrap` | `src/orchestrator.rs` |
|
|
72
|
+
|
|
73
|
+
## 3. Propriedades de frameworks/bibliotecas
|
|
74
|
+
|
|
75
|
+
- O `assemble_all` delega ao security (`SecurityConfig::from_env()`, chaves RSA obrigatórias para habilitar) e ao audit (`AuditConfig::from_env()`; auditoria só com `enabled` + estratégia JPA). Ver [[SeedGrid/Extensions/security/Configuracao-Rust|security]] e [[SeedGrid/Extensions/audit/Configuracao-Rust|audit]].
|
|
76
|
+
- Rate limits do signup: `config_key` `signup` (10/min), `signup-email-exists` (10/min), `signup-confirm-email` (10/min), `signup-resend-email` (5/h) (`src/ratelimit.rs`). As fábricas existem, mas o `router` do crate **não** aplica a camada — fica com o host (comentário de `src/routes.rs`). O kill-switch citado `seedgrid.ratelimit.<config_key>.enabled` depende do `ConfigSource` que o host der ao `RateLimitService` (crate resilience).
|
|
77
|
+
|
|
78
|
+
## 4. Propriedades usadas só em testes e exemplos
|
|
79
|
+
|
|
80
|
+
- `rust/examples/seedgrid-login-tenancy-example`: `DATABASE_URL`, `BIND_ADDR` (lidas no `main.rs`) e, no `.env.example`, envs do security (`SECURITY_JWT_ISSUER`, `SECURITY_JWT_TTL_SECONDS`, `SECURITY_ENCRYPTION_KEY`, `SECURITY_FRONTEND_BASE_URL`, `SEEDGRID_SECURITY_DEFAULT_COMPANY_CNPJ`, `SEEDGRID_SECURITY_FIRST_ADMIN_USER_EMAIL`).
|
|
81
|
+
- `tests/foundation_it.rs` (Testcontainers) e testes unitários de `src/error.rs` que alteram `SEEDGRID_SHOW_DEV_MESSAGE`.
|
|
82
|
+
|
|
83
|
+
## 5. Aliases, obsoletas, renomeações
|
|
84
|
+
|
|
85
|
+
Sem aliases. Nomes `SEEDGRID_LOGIN_TENANCY_*` = regra MicroProfile das propriedades Java. O status endpoint legado `/public/accounttenancy/status` foi removido.
|
|
86
|
+
|
|
87
|
+
## 6. Configuração mínima
|
|
88
|
+
|
|
89
|
+
Nenhuma env do próprio crate é obrigatória. Para a foundation funcionar via `assemble_all`: chaves RSA do security e, recomendado, `SEEDGRID_SECURITY_DEFAULT_COMPANY_CNPJ` (+ corporate/trade name).
|
|
90
|
+
|
|
91
|
+
```dotenv
|
|
92
|
+
SEEDGRID_SECURITY_JWT_PRIVATE_KEY_LOCATION=./keys/private.pem
|
|
93
|
+
SEEDGRID_SECURITY_JWT_PUBLIC_KEY_LOCATION=./keys/public.pem
|
|
94
|
+
SEEDGRID_SECURITY_DEFAULT_COMPANY_CNPJ=<cnpj-da-plataforma>
|
|
95
|
+
SEEDGRID_SECURITY_DEFAULT_COMPANY_CORPORATE_NAME=<razao-social>
|
|
96
|
+
SEEDGRID_SECURITY_DEFAULT_COMPANY_TRADE_NAME=<nome-fantasia>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 7. Configuração completa comentada
|
|
100
|
+
|
|
101
|
+
```dotenv
|
|
102
|
+
SEEDGRID_LOGIN_TENANCY_APP_CODE=seedgrid-app
|
|
103
|
+
SEEDGRID_LOGIN_TENANCY_APP_NAME=SeedGrid Application # aparece no e-mail de confirmação
|
|
104
|
+
SEEDGRID_LOGIN_TENANCY_FOUNDATION_STATUS_ENABLED=true # false -> status 404
|
|
105
|
+
SEEDGRID_LOGIN_TENANCY_BOOTSTRAP_ENABLED=true # só reportado no status
|
|
106
|
+
SEEDGRID_LOGIN_TENANCY_BOOTSTRAP_ADMIN_ENABLED=true # só reportado no status
|
|
107
|
+
SEEDGRID_LOGIN_TENANCY_MODULES_BILLING_ENABLED=true
|
|
108
|
+
SEEDGRID_LOGIN_TENANCY_MODULES_APIKEYS_ENABLED=true
|
|
109
|
+
SEEDGRID_LOGIN_TENANCY_MODULES_BACKUP_ENABLED=true
|
|
110
|
+
SEEDGRID_LOGIN_TENANCY_MODULES_FILEMANAGEMENT_ENABLED=true
|
|
111
|
+
SEEDGRID_SHOW_DEV_MESSAGE=false # true só em dev
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## 8. Receitas
|
|
115
|
+
|
|
116
|
+
- **Esconder o status:** `SEEDGRID_LOGIN_TENANCY_FOUNDATION_STATUS_ENABLED=false`.
|
|
117
|
+
- **Audiência `platform`/`client` no JWT:** defina `SEEDGRID_SECURITY_DEFAULT_COMPANY_CNPJ` antes de chamar `assemble_all`.
|
|
118
|
+
- **Política de senha do signup igual à do security:** passe `LoginTenancyPlatformOverrides { password_policy: Some(PasswordPolicy { .. }), .. }` — não é derivada das envs `SECURITY_PASSWORD_*`.
|
|
119
|
+
|
|
120
|
+
## 9. Dúvidas e lacunas
|
|
121
|
+
|
|
122
|
+
- `bootstrap.*` e `modules.*` só afetam o corpo do status endpoint — **Confirmado** por grep.
|
|
123
|
+
- Flags booleanas aceitam só `true` (case-insensitive); `1`/`yes` viram `false` — **Confirmado**.
|
|
124
|
+
- A `PasswordPolicy` do signup não aplica `prohibit_repeated_sequence` nem histórico (o Java usa `passwordService.validate`) — **Inferência** a partir de `PasswordPolicy` (4 campos) em `src/state.rs`.
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, login-tenancy, configuracao]
|
|
3
|
+
fonte: java/seedgrid-quarkus-ext-login-tenancy
|
|
4
|
+
branch: main
|
|
5
|
+
commit: c67581bda9
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Login-tenancy (Quarkus) — configuração
|
|
10
|
+
|
|
11
|
+
Voltar: [[SeedGrid/Extensions/login-tenancy/Visao-geral|Visão geral do login-tenancy]] · [[SeedGrid/Extensions/login-tenancy/Exemplos|Exemplos]] · [[SeedGrid/Extensions/login-tenancy/Rust|Porte Rust]]
|
|
12
|
+
|
|
13
|
+
## 1. Cabeçalho
|
|
14
|
+
|
|
15
|
+
| Item | Valor |
|
|
16
|
+
|---|---|
|
|
17
|
+
| Prefixo próprio | `seedgrid.login-tenancy` (não existe `seedgrid.login-tenancy.enabled`) |
|
|
18
|
+
| Classe de config | `java/seedgrid-quarkus-ext-login-tenancy/runtime/src/main/java/br/com/seedgrid/logintenancy/configs/LoginTenancyConfig.java` → `LoginTenancyConfig` (grupos `App`, `Database`, `Foundation.Status`, `Foundation.Health`, `Bootstrap`, `Bootstrap.Admin`, `Modules.Billing/Apikeys/Backup/Filemanagement`) |
|
|
19
|
+
| Fachada | `LoginTenancyFoundationConfig` (bean CDI que os demais componentes consomem) |
|
|
20
|
+
| Mecanismo | SmallRye `@ConfigMapping(prefix = "seedgrid.login-tenancy")` (registrado automaticamente; sem `ConfigMappingBuildItem`). Também: `@ConfigProperty` em `LoginTenancyMongoAuditDatabaseProducer`, `LoginTenancyMigrationService`, `LoginTenancyBootstrapService`, `LoginTenancySecurityBridge`, `LoginTenancyApiExceptionExtension`; `@SeedGridRateLimit(configKey=...)` no `LoginTenancySignupController`; defaults em `runtime/src/main/resources/META-INF/microprofile-config.properties` e `RunTimeConfigurationDefaultBuildItem` em `LoginTenancyProcessor`. |
|
|
21
|
+
| Fase | Runtime (todas as propriedades `seedgrid.login-tenancy.*`). Os defaults `quarkus.*` do `microprofile-config.properties` incluem chaves build-time do Quarkus. |
|
|
22
|
+
|
|
23
|
+
Variáveis de ambiente: regra MicroProfile, ex.: `seedgrid.login-tenancy.app.code` → `SEEDGRID_LOGIN_TENANCY_APP_CODE` (o hífen vira `_`; o SmallRye resolve para a propriedade conhecida do mapping). O código não lê env diretamente.
|
|
24
|
+
|
|
25
|
+
## 2. Propriedades da extension (`seedgrid.login-tenancy.*`)
|
|
26
|
+
|
|
27
|
+
### Identidade da aplicação
|
|
28
|
+
|
|
29
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
|
|
30
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
31
|
+
| `seedgrid.login-tenancy.app.code` | `String` | texto | `seedgrid-app` | Não | Código curto da aplicação; exibido no status e no log do bootstrap; base do nome do banco Mongo de auditoria (`<code>_audit_db`) quando não há `seedgrid.audit.mongodb.database`. | Identificar o produto | Lido também por `@ConfigProperty` (Optional) no producer Mongo: se vier vazio lá, o banco vira `audit_db`; se o `@WithDefault("seedgrid-app")` do mapping é visível para esse `@ConfigProperty` é Não confirmado (ver §9) | Runtime | Decl.: `LoginTenancyConfig.App#code()`; `LoginTenancyMongoAuditDatabaseProducer#appCode`. Consumo: `LoginTenancyFoundationConfig#appCode()` → `LoginTenancyStatusController`, `LoginTenancyBootstrapService`; `LoginTenancyMongoAuditDatabaseProducer#resolveDatabaseName` |
|
|
32
|
+
| `seedgrid.login-tenancy.app.name` | `String` | texto | `SeedGrid Application` | Não | Nome de exibição: usado nos e-mails (assunto e template `{appName}`) de confirmação, boas-vindas e ativação de usuário, e no status. | Branding dos e-mails | — | Runtime | Decl.: `LoginTenancyConfig.App#name()`. Consumo: `LoginTenancySignupController#sendConfirmationEmail`/`#sendWelcomeEmail`, `LoginTenancyAccountUserActivationMailer#deliver`, `LoginTenancyStatusController` |
|
|
33
|
+
|
|
34
|
+
### Banco / migrations
|
|
35
|
+
|
|
36
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
|
|
37
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
38
|
+
| `seedgrid.login-tenancy.database.migrate-at-start` | `boolean` | `true`/`false` | `true` | Não | `false`: pula **todas** as migrations orquestradas (foundation + app). | Controlar migração no boot | O Flyway nativo fica desligado (`quarkus.flyway.enabled=false`), então com `false` ninguém migra | Runtime | Decl.: `LoginTenancyConfig.Database#migrateAtStart()`. Consumo: `LoginTenancyMigrationService#onStart` |
|
|
39
|
+
| `seedgrid.login-tenancy.database.baseline-on-migrate` | `boolean` | `true`/`false` | `true` | Não | Passado ao `Flyway.configure().baselineOnMigrate(...)` de cada módulo. | Bancos pré-existentes | — | Runtime | Decl.: `LoginTenancyConfig.Database#baselineOnMigrate()`. Consumo: `LoginTenancyMigrations#migrateModule` |
|
|
40
|
+
| `seedgrid.login-tenancy.database.locations` | `String` | location Flyway (ex.: `classpath:db/migration/app`) | `classpath:db/migration/app` | Não | Location das migrations da **aplicação**, executadas por último com a tabela `flyway_schema_history`. | Migrations do host | Não use `classpath:db/migration` (scan recursivo pegaria as subpastas de foundation — javadoc). Um único valor `String` (não lista). | Runtime | Decl.: `LoginTenancyConfig.Database#locations()`. Consumo: `LoginTenancyMigrationService#onStart` via `applicationMigrationsLocation()` |
|
|
41
|
+
|
|
42
|
+
### Superfície técnica
|
|
43
|
+
|
|
44
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
|
|
45
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
46
|
+
| `seedgrid.login-tenancy.foundation.status.enabled` | `boolean` | `true`/`false` | `true` | Não | `false`: `GET /public/login-tenancy/status` responde 404. | Expor status técnico | — | Runtime | Decl.: `LoginTenancyConfig.Foundation.Status#enabled()`. Consumo: `LoginTenancyStatusController#status` |
|
|
47
|
+
| `seedgrid.login-tenancy.foundation.health.enabled` | `boolean` | `true`/`false` | `true` | Não | `false`: o readiness `login-tenancy-foundation` reporta UP sem tocar o banco. | Readiness do datasource | — | Runtime | Decl.: `LoginTenancyConfig.Foundation.Health#enabled()`. Consumo: `LoginTenancyReadinessCheck#call` |
|
|
48
|
+
|
|
49
|
+
### Bootstrap
|
|
50
|
+
|
|
51
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
|
|
52
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
53
|
+
| `seedgrid.login-tenancy.bootstrap.enabled` | `boolean` | `true`/`false` | `true` | Não | `false`: o `LoginTenancyBootstrapService` só loga que está desligado. Não impede o bootstrap do security nem as migrations. Também aparece no status. | Coordenação/log do bootstrap | `bootstrap.admin.enabled` só vale se este for `true` | Runtime | Decl.: `LoginTenancyConfig.Bootstrap#enabled()`. Consumo: `LoginTenancyBootstrapService#onStart`, `LoginTenancyFoundationConfig#adminBootstrapEnabled`, status |
|
|
54
|
+
| `seedgrid.login-tenancy.bootstrap.admin.enabled` | `boolean` | `true`/`false` | `true` | Não | Intenção de criar o primeiro admin. É **só coordenação**: quem cria é o security, a partir de `seedgrid.security.first-admin-user.email`. Se `false` e o e-mail estiver preenchido, emite WARN e o admin é criado mesmo assim. | Sinalização/status | Efetivo = `bootstrap.enabled && bootstrap.admin.enabled` | Runtime | Decl.: `LoginTenancyConfig.Bootstrap.Admin#enabled()`. Consumo: `LoginTenancyBootstrapService#coordinateAdminBootstrap`, status |
|
|
55
|
+
|
|
56
|
+
### Ativação lógica dos módulos
|
|
57
|
+
|
|
58
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
|
|
59
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
60
|
+
| `seedgrid.login-tenancy.modules.billing.enabled` | `boolean` (um por constante de [[SeedGrid/Extensions/login-tenancy/Enums#FoundationModule|FoundationModule]]) | `true`/`false` | `true` | Não | `false`: não roda as migrations de billing, não provisiona conta/trial no signup confirmado e (via default do `microprofile-config.properties`) desliga `seedgrid.billing.api.enabled`. | Desligar billing | Default de `seedgrid.billing.api.enabled=${seedgrid.login-tenancy.modules.billing.enabled:true}` | Runtime | Decl.: `LoginTenancyConfig.Modules.Billing#enabled()`. Consumo: `LoginTenancyModuleRegistry` → `LoginTenancyMigrationService`, `LoginTenancyBillingProvisioner`, status; `META-INF/microprofile-config.properties` |
|
|
61
|
+
| `seedgrid.login-tenancy.modules.apikeys.enabled` | `boolean` | `true`/`false` | `true` | Não | `false`: não roda as migrations de apikeys; some de `activeModules`. Beans/endpoints do apikeys continuam presentes. | Desligar migrations de apikeys | — | Runtime | Decl.: `LoginTenancyConfig.Modules.Apikeys#enabled()`. Consumo: `LoginTenancyMigrationService`, status |
|
|
62
|
+
| `seedgrid.login-tenancy.modules.backup.enabled` | `boolean` | `true`/`false` | `true` | Não | `false`: não roda as migrations de backup; some de `activeModules`. Beans do backup continuam. | Desligar migrations de backup | — | Runtime | Decl.: `LoginTenancyConfig.Modules.Backup#enabled()`. Consumo: `LoginTenancyMigrationService`, status |
|
|
63
|
+
| `seedgrid.login-tenancy.modules.filemanagement.enabled` | `boolean` | `true`/`false` | `true` | Não | Só afeta `activeModules` (status/log); filemanagement não tem migrations no baseline. | Informativo | — | Runtime | Decl.: `LoginTenancyConfig.Modules.Filemanagement#enabled()`. Consumo: `LoginTenancyModuleRegistry#activeModules` (status e log do bootstrap) |
|
|
64
|
+
|
|
65
|
+
Total `seedgrid.login-tenancy.*`: **13 propriedades**.
|
|
66
|
+
|
|
67
|
+
### Propriedades de outros prefixos `seedgrid.*` **lidas** pela login-tenancy
|
|
68
|
+
|
|
69
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
|
|
70
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
71
|
+
| `seedgrid.audit.mongodb.database` | `Optional<String>` | nome de banco Mongo | — (deriva `<app.code>_audit_db`, ou `audit_db`) | Não | Override do banco Mongo de auditoria produzido pela foundation (banco único). | Audit MongoDB | Só existe bean se o Mongo estiver no classpath; conexão via `seedgrid.audit.mongodb.connection-string` (módulo audit — ver [[SeedGrid/Extensions/audit/Configuracao|audit]]) | Runtime | `LoginTenancyMongoAuditDatabaseProducer#auditDatabase` |
|
|
72
|
+
| `seedgrid.audit.persistence.strategy` | `Optional<String>` | `jpa` (case-insensitive) habilita | — | Condicional (sem `jpa`, a migration de audit é pulada) | Decide se as migrations `db/migration/audit` rodam. | Orquestração | Chave do módulo audit | Runtime | `LoginTenancyMigrationService#isAuditJpa` |
|
|
73
|
+
| `seedgrid.ai-pricing.migration.enabled` | `boolean` | `true`/`false` | `false` | Não | Roda `classpath:db/migration/ai-pricing` com `flyway_schema_history_ai_pricing`. | Hosts com ai-pricing | Mesma chave lida pelo `MigrationService` do subdomain-tenancy | Runtime | `LoginTenancyMigrationService#aiPricingMigrationsEnabled` |
|
|
74
|
+
| `seedgrid.exchange.migration.enabled` | `boolean` | `true`/`false` | `false` | Não | Roda `classpath:db/migration/exchange` com `flyway_schema_history_exchange`. | Hosts com exchange | Idem | Runtime | `LoginTenancyMigrationService#exchangeMigrationsEnabled` |
|
|
75
|
+
| `seedgrid.security.first-admin-user.email` | `Optional<String>` | e-mail | — | Não | Só lida para decidir logs/WARN e `firstAdminConfigured` no status. | Coordenação | Ver [[SeedGrid/Extensions/security/Configuracao|security]] | Runtime | `LoginTenancyBootstrapService`, `LoginTenancySecurityBridge` |
|
|
76
|
+
| `seedgrid.security.jwt.issuer` | `Optional<String>` | URL/issuer | — | Não | Exibido em `security.jwtIssuer` no status. | Informativo | security | Runtime | `LoginTenancySecurityBridge` |
|
|
77
|
+
| `seedgrid.show-dev-message` | `boolean` | `true`/`false` | `false` | Não | Inclui `devMessage` nos problem+json das exceções da login-tenancy. | Depuração | Mesma chave usada por security e billing | Runtime | `LoginTenancyApiExceptionExtension` (construtor) |
|
|
78
|
+
|
|
79
|
+
### Rate limit dos endpoints de signup (`seedgrid.ratelimit.<configKey>.*`, lido pelo `seedgrid-resilience`)
|
|
80
|
+
|
|
81
|
+
A login-tenancy define os `configKey`; o mecanismo (`RateLimitService`) lê `enabled` (padrão `true`), `permits` e `window` (padrão = valores da anotação) e também `min-spacing`, `burst-capacity`, `algorithm` (ver [[SeedGrid/Extensions/resilience/Configuracao|resilience]]). O README afirma que o limite é por IP (Não confirmado aqui).
|
|
82
|
+
|
|
83
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
|
|
84
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
85
|
+
| `seedgrid.ratelimit.signup.enabled` | `boolean` | `true`/`false` | `true` | Não | `false` desliga o limite do `POST /public/signup` | Anti-flood | — | Runtime | `@SeedGridRateLimit(configKey="signup")` em `LoginTenancySignupController#signup`; leitura em `RateLimitService#isEnabled` |
|
|
86
|
+
| `seedgrid.ratelimit.signup.permits` | `long` | ≥ 1 | `10` | Não | Pedidos por janela | Anti-flood | com `window` | Runtime | idem (`#resolvePermits`) |
|
|
87
|
+
| `seedgrid.ratelimit.signup.window` | `Duration` | ISO-8601 | `PT1M` | Não | Janela | Anti-flood | com `permits` | Runtime | idem (`#resolveWindowMs`) |
|
|
88
|
+
| `seedgrid.ratelimit.signup-email-exists.enabled` | `boolean` | `true`/`false` | `true` | Não | Limite de `GET /public/signup/email-exists` | Anti-enumeração | — | Runtime | `LoginTenancySignupController#emailExists` |
|
|
89
|
+
| `seedgrid.ratelimit.signup-email-exists.permits` | `long` | ≥ 1 | `10` | Não | idem | — | — | Runtime | idem |
|
|
90
|
+
| `seedgrid.ratelimit.signup-email-exists.window` | `Duration` | ISO-8601 | `PT1M` | Não | idem | — | — | Runtime | idem |
|
|
91
|
+
| `seedgrid.ratelimit.signup-cnpj-status.enabled` | `boolean` | `true`/`false` | `true` | Não | Limite de `GET /public/signup/cnpj-status` | Anti-enumeração | — | Runtime | `LoginTenancySignupController#cnpjStatus` |
|
|
92
|
+
| `seedgrid.ratelimit.signup-cnpj-status.permits` | `long` | ≥ 1 | `10` | Não | idem | — | — | Runtime | idem |
|
|
93
|
+
| `seedgrid.ratelimit.signup-cnpj-status.window` | `Duration` | ISO-8601 | `PT1M` | Não | idem | — | — | Runtime | idem |
|
|
94
|
+
| `seedgrid.ratelimit.signup-confirm-email.enabled` | `boolean` | `true`/`false` | `true` | Não | Limite de `POST /public/signup/confirm-email` | Anti brute-force do código | — | Runtime | `LoginTenancySignupController#confirmEmail` |
|
|
95
|
+
| `seedgrid.ratelimit.signup-confirm-email.permits` | `long` | ≥ 1 | `10` | Não | idem | — | — | Runtime | idem |
|
|
96
|
+
| `seedgrid.ratelimit.signup-confirm-email.window` | `Duration` | ISO-8601 | `PT1M` | Não | idem | — | — | Runtime | idem |
|
|
97
|
+
| `seedgrid.ratelimit.signup-resend-email.enabled` | `boolean` | `true`/`false` | `true` | Não | Limite de `POST /public/signup/resend-email` | Anti-spam | — | Runtime | `LoginTenancySignupController#resendEmail` |
|
|
98
|
+
| `seedgrid.ratelimit.signup-resend-email.permits` | `long` | ≥ 1 | `5` | Não | idem | — | — | Runtime | idem |
|
|
99
|
+
| `seedgrid.ratelimit.signup-resend-email.window` | `Duration` | ISO-8601 | `PT1H` | Não | idem | — | — | Runtime | idem |
|
|
100
|
+
|
|
101
|
+
### Defaults que a extension define para outros módulos SeedGrid (sobrescrevíveis)
|
|
102
|
+
|
|
103
|
+
| Propriedade | Valor default | Onde | Efeito |
|
|
104
|
+
|---|---|---|---|
|
|
105
|
+
| `seedgrid.billing.api.enabled` | `${seedgrid.login-tenancy.modules.billing.enabled:true}` | `microprofile-config.properties` | Endpoints do billing somem com o módulo desligado |
|
|
106
|
+
| `seedgrid.security.account.assignable-permission-audiences` | `client` | `microprofile-config.properties` | Perfis de conta-cliente recebem permissões de audience `client` (e sem audience) |
|
|
107
|
+
| `seedgrid.filemanagement.filesystem.base-path` | `./data/files` | `LoginTenancyProcessor#registerOptionalModuleDefaults` | Storage local padrão |
|
|
108
|
+
|
|
109
|
+
### Obrigatórias de outros contratos (segundo javadoc de `LoginTenancyConfig` e `docs/configuration.md`)
|
|
110
|
+
|
|
111
|
+
`quarkus.datasource.jdbc.url`, `quarkus.datasource.username`, 🔒 `quarkus.datasource.password`, `seedgrid.security.jwt.private-key-location`, `seedgrid.security.jwt.public-key-location`; mínimos de `seedgrid.billing.*`/`seedgrid.filemanagement.*` se ativos. Além disso o host precisa de um `BillingProvider`.
|
|
112
|
+
|
|
113
|
+
## 3. Propriedades de frameworks definidas pela extension
|
|
114
|
+
|
|
115
|
+
| Propriedade | Valor | Onde | Fase Quarkus |
|
|
116
|
+
|---|---|---|---|
|
|
117
|
+
| `quarkus.flyway.enabled` | `false` (crítico: migrations são do `LoginTenancyMigrationService`) | `microprofile-config.properties` | build time |
|
|
118
|
+
| `quarkus.datasource.db-kind` | `postgresql` | `microprofile-config.properties` | build time |
|
|
119
|
+
| `quarkus.hibernate-orm.schema-management.strategy` | `none` | `microprofile-config.properties` | — |
|
|
120
|
+
| `quarkus.hibernate-orm.physical-naming-strategy` | `org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy` | `microprofile-config.properties` | build time |
|
|
121
|
+
|
|
122
|
+
## 4. Propriedades usadas só em testes
|
|
123
|
+
|
|
124
|
+
`runtime/src/test/resources/application.properties` (valores sensíveis não copiados):
|
|
125
|
+
|
|
126
|
+
| Grupo | Propriedades |
|
|
127
|
+
|---|---|
|
|
128
|
+
| Quarkus | `quarkus.datasource.db-kind`, `quarkus.hibernate-orm.schema-management.strategy`, `quarkus.hibernate-orm.sql-load-script=no-file`, `quarkus.index-dependency.seedgrid-filemanagement.group-id/artifact-id`, `quarkus.arc.exclude-types` (storages de nuvem do filemanagement), `quarkus.mailer.mock`, `quarkus.mailer."security".mock`, `quarkus.http.test-port=0` |
|
|
129
|
+
| JWT | `seedgrid.security.jwt.issuer`, `.kid`, `.private-key-location`, `.public-key-location`; `mp.jwt.verify.publickey.location`, `mp.jwt.verify.issuer`, `smallrye.jwt.sign.key.location`, `smallrye.jwt.new-token.issuer`, `smallrye.jwt.new-token.lifespan` (chaves PEM de teste) |
|
|
130
|
+
| Security | 🔒 `seedgrid.security.encryption.key` (`<SEGREDO:security-encryption-key>`), `seedgrid.security.mailer.from`, `seedgrid.security.frontend.*` (base-url e paths), `seedgrid.security.default-company.*`, `seedgrid.security.first-admin-user.*` (🔒 `initial-password`), `seedgrid.security.password.*` |
|
|
131
|
+
| Audit | `seedgrid.audit.persistence.strategy=JPA`, `seedgrid.audit.jpa.db-kind=postgresql` |
|
|
132
|
+
| Login-tenancy | `seedgrid.login-tenancy.app.code=login-tenancy-it`, `seedgrid.login-tenancy.app.name=LoginTenancy IT` |
|
|
133
|
+
| Rate limit | `seedgrid.ratelimit.signup.enabled`, `signup-email-exists.enabled`, `signup-confirm-email.enabled`, `signup-resend-email.enabled`, `user-activation-resend.enabled` = `false` (o último é `configKey` de outro módulo) |
|
|
134
|
+
|
|
135
|
+
## 5. Aliases, obsoletas, renomeações
|
|
136
|
+
|
|
137
|
+
- Não existe `seedgrid.login-tenancy.enabled` (regra fechada).
|
|
138
|
+
|
|
139
|
+
## 6. Configuração mínima
|
|
140
|
+
|
|
141
|
+
```properties
|
|
142
|
+
quarkus.datasource.jdbc.url=jdbc:postgresql://<HOST>:5432/<BANCO>
|
|
143
|
+
quarkus.datasource.username=<USUARIO>
|
|
144
|
+
quarkus.datasource.password=<SEGREDO:db-password>
|
|
145
|
+
seedgrid.security.jwt.private-key-location=<CAMINHO-CHAVE-PRIVADA>
|
|
146
|
+
seedgrid.security.jwt.public-key-location=<CAMINHO-CHAVE-PUBLICA>
|
|
147
|
+
seedgrid.login-tenancy.app.code=<codigo-do-produto>
|
|
148
|
+
seedgrid.login-tenancy.app.name=<Nome do Produto>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Mais as configurações obrigatórias do [[SeedGrid/Extensions/security/Configuracao|security]] (company default, e-mail etc.) e um `BillingProvider` no classpath.
|
|
152
|
+
|
|
153
|
+
## 7. Configuração completa comentada
|
|
154
|
+
|
|
155
|
+
```properties
|
|
156
|
+
# Identidade
|
|
157
|
+
seedgrid.login-tenancy.app.code=seedgrid-app
|
|
158
|
+
seedgrid.login-tenancy.app.name=SeedGrid Application
|
|
159
|
+
# Migrations orquestradas (Flyway nativo fica desligado)
|
|
160
|
+
seedgrid.login-tenancy.database.migrate-at-start=true
|
|
161
|
+
seedgrid.login-tenancy.database.baseline-on-migrate=true
|
|
162
|
+
seedgrid.login-tenancy.database.locations=classpath:db/migration/app
|
|
163
|
+
# Superfície técnica
|
|
164
|
+
seedgrid.login-tenancy.foundation.status.enabled=true
|
|
165
|
+
seedgrid.login-tenancy.foundation.health.enabled=true
|
|
166
|
+
# Bootstrap (coordenação; o admin é criado pelo security)
|
|
167
|
+
seedgrid.login-tenancy.bootstrap.enabled=true
|
|
168
|
+
seedgrid.login-tenancy.bootstrap.admin.enabled=true
|
|
169
|
+
# Módulos (ativação lógica)
|
|
170
|
+
seedgrid.login-tenancy.modules.billing.enabled=true
|
|
171
|
+
seedgrid.login-tenancy.modules.apikeys.enabled=true
|
|
172
|
+
seedgrid.login-tenancy.modules.backup.enabled=true
|
|
173
|
+
seedgrid.login-tenancy.modules.filemanagement.enabled=true
|
|
174
|
+
# Migrations opcionais de produto
|
|
175
|
+
seedgrid.ai-pricing.migration.enabled=false
|
|
176
|
+
seedgrid.exchange.migration.enabled=false
|
|
177
|
+
# Auditoria
|
|
178
|
+
seedgrid.audit.persistence.strategy=jpa
|
|
179
|
+
#seedgrid.audit.mongodb.database=<banco-de-auditoria>
|
|
180
|
+
# Rate limit do signup (exemplo: apertar o confirm-email)
|
|
181
|
+
seedgrid.ratelimit.signup-confirm-email.permits=5
|
|
182
|
+
seedgrid.ratelimit.signup-confirm-email.window=PT5M
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## 8. Receitas
|
|
186
|
+
|
|
187
|
+
- **Produto sem cobrança**: `seedgrid.login-tenancy.modules.billing.enabled=false` (sem migrations de billing, sem trial no signup e `seedgrid.billing.api.enabled=false` por default). O `BillingProvider` ainda é exigido pelo `billing-core` (README) — Não confirmado se continua obrigatório com o módulo desligado.
|
|
188
|
+
- **Migrations aplicadas por pipeline externo**: `seedgrid.login-tenancy.database.migrate-at-start=false`.
|
|
189
|
+
- **Não criar admin**: deixe `seedgrid.security.first-admin-user.email` vazio (o flag `bootstrap.admin.enabled` sozinho não basta).
|
|
190
|
+
- **Auditoria em MongoDB**: dependência `seedgrid-audit-mongodb`, `seedgrid.audit.persistence.strategy=MONGODB`; o banco vira `<app.code>_audit_db` ou `seedgrid.audit.mongodb.database`.
|
|
191
|
+
- **Testes de integração**: desligue os rate limits (`seedgrid.ratelimit.<configKey>.enabled=false`), como faz o `application.properties` de teste.
|
|
192
|
+
|
|
193
|
+
## 9. Dúvidas e lacunas
|
|
194
|
+
|
|
195
|
+
- Se o `@ConfigProperty(name="seedgrid.login-tenancy.app.code") Optional<String>` do producer Mongo enxerga o `@WithDefault` do mapping: o SmallRye normalmente registra os defaults de mappings como valores default da config, o que daria `seedgrid-app_audit_db` sem `app.code` explícito; caso contrário, `audit_db`. Não confirmado/não testado.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, login-tenancy, enum]
|
|
3
|
+
fonte: java/seedgrid-quarkus-ext-login-tenancy
|
|
4
|
+
branch: main
|
|
5
|
+
commit: c67581bda9
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Login-tenancy (Quarkus) — enums
|
|
10
|
+
|
|
11
|
+
Voltar: [[SeedGrid/Extensions/login-tenancy/Visao-geral|Visão geral do login-tenancy]] · [[SeedGrid/Extensions/login-tenancy/Configuracao|Configuração]]
|
|
12
|
+
|
|
13
|
+
## Índice
|
|
14
|
+
|
|
15
|
+
| Enum | Pacote/arquivo | Usado em | Público? |
|
|
16
|
+
|---|---|---|---|
|
|
17
|
+
| [[#SignupRequestStatus]] | `br.com.seedgrid.logintenancy.enums` — `runtime/src/main/java/br/com/seedgrid/logintenancy/enums/SignupRequestStatus.java` | coluna `signup_request.status`; respostas de `POST /public/signup`, `/resend-email`, `/confirm-email` | Sim |
|
|
18
|
+
| [[#CnpjSignupStatus]] | `br.com.seedgrid.logintenancy.enums` — `.../enums/CnpjSignupStatus.java` | resposta de `GET /public/signup/cnpj-status` | Sim |
|
|
19
|
+
| [[#FoundationModule]] | `br.com.seedgrid.logintenancy.configs` — `.../configs/FoundationModule.java` | `LoginTenancyModuleRegistry` (bean público), `activeModules` do status | Sim |
|
|
20
|
+
|
|
21
|
+
## SignupRequestStatus
|
|
22
|
+
|
|
23
|
+
FQN: `br.com.seedgrid.logintenancy.enums.SignupRequestStatus` — "Estado de uma solicitação de cadastro institucional pendente" (javadoc).
|
|
24
|
+
|
|
25
|
+
| Valor | Significado | Efeito / onde é tratado | Observações |
|
|
26
|
+
|---|---|---|---|
|
|
27
|
+
| `PENDING_EMAIL_VERIFICATION` | Solicitação criada, aguardando o código enviado por e-mail | Valor inicial (`SignupRequestEntity` `@PrePersist`, quando nulo); reatribuído no `resend-email`; filtro de `SignupRequestRepository#findPendingByCnpj` (reaproveitamento da solicitação e `cnpj-status = PENDING_CONFIRMATION`); índices únicos parciais da `V703` | Confirmado |
|
|
28
|
+
| `CONFIRMED` | Código confirmado: `Company` e usuário root criados | Atribuído em `LoginTenancySignupController#confirmEmail`; a linha sai dos índices parciais da V703 e vira histórico | Confirmado |
|
|
29
|
+
|
|
30
|
+
- **Persistência**: `@Enumerated(EnumType.STRING)`, coluna `status varchar(64) not null` (V700). Não há CHECK constraint; a V703 só referencia `'PENDING_EMAIL_VERIFICATION'` nos índices parciais (coerente com o enum).
|
|
31
|
+
- **JSON**: nome da constante (`SignupResponse.status`, `ConfirmSignupResponse.status`), serialização padrão do Jackson.
|
|
32
|
+
- **Observação (Confirmado)**: `SignupRequestRepository#findByEmail` não filtra por status; logo `resend-email` numa solicitação já `CONFIRMED` gera novo código e a devolve a `PENDING_EMAIL_VERIFICATION`.
|
|
33
|
+
|
|
34
|
+
```mermaid
|
|
35
|
+
stateDiagram-v2
|
|
36
|
+
[*] --> PENDING_EMAIL_VERIFICATION: POST /public/signup
|
|
37
|
+
PENDING_EMAIL_VERIFICATION --> PENDING_EMAIL_VERIFICATION: POST /resend-email (novo código)
|
|
38
|
+
PENDING_EMAIL_VERIFICATION --> CONFIRMED: POST /confirm-email
|
|
39
|
+
CONFIRMED --> PENDING_EMAIL_VERIFICATION: POST /resend-email (sem filtro de status)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## CnpjSignupStatus
|
|
43
|
+
|
|
44
|
+
FQN: `br.com.seedgrid.logintenancy.enums.CnpjSignupStatus` — situação de um CNPJ na tela de cadastro, consultada antes do submit.
|
|
45
|
+
|
|
46
|
+
| Valor | Significado | Efeito / onde é tratado | Observações |
|
|
47
|
+
|---|---|---|---|
|
|
48
|
+
| `AVAILABLE` | Sem company e sem solicitação pendente: pode cadastrar | `CnpjStatusResponse.available()` — também devolvido para CNPJ vazio | Confirmado |
|
|
49
|
+
| `REGISTERED` | Já existe `Company` com o CNPJ: o caminho é o login | `CnpjStatusResponse.registered()` | Confirmado |
|
|
50
|
+
| `PENDING_CONFIRMATION` | Há solicitação `PENDING_EMAIL_VERIFICATION`: o caminho é o reenvio | `CnpjStatusResponse.pending(maskedEmail)` — único caso com `pendingEmailMasked` preenchido | Confirmado |
|
|
51
|
+
|
|
52
|
+
- **JSON**: campo `status` de `CnpjStatusResponse` com o nome da constante. Não é persistido.
|
|
53
|
+
|
|
54
|
+
## FoundationModule
|
|
55
|
+
|
|
56
|
+
FQN: `br.com.seedgrid.logintenancy.configs.FoundationModule` — módulos de foundation da v1 (contrato interno de ativação; "não representa conceito de tenant").
|
|
57
|
+
|
|
58
|
+
| Valor | Significado | Efeito / onde é tratado | Observações |
|
|
59
|
+
|---|---|---|---|
|
|
60
|
+
| `BILLING` | Módulo billing | `seedgrid.login-tenancy.modules.billing.enabled`: migrations de billing (`LoginTenancyMigrationService`) e conta+trial no signup (`LoginTenancyBillingProvisioner`) | Confirmado |
|
|
61
|
+
| `APIKEYS` | Módulo apikeys | `modules.apikeys.enabled`: migrations de apikeys | Confirmado |
|
|
62
|
+
| `BACKUP` | Módulo backup | `modules.backup.enabled`: migrations de backup | Confirmado |
|
|
63
|
+
| `FILEMANAGEMENT` | Módulo filemanagement | `modules.filemanagement.enabled`: só entra em `activeModules` (status/log) | Confirmado |
|
|
64
|
+
|
|
65
|
+
- Não é tipo de propriedade: cada constante tem sua propriedade booleana (ver [[SeedGrid/Extensions/login-tenancy/Configuracao|Configuração]]); o mapeamento é o `switch` de `LoginTenancyFoundationConfig#moduleEnabled`.
|
|
66
|
+
- **JSON**: em `GET /public/login-tenancy/status`, `activeModules` lista os nomes em minúsculas (`billing`, `apikeys`, `backup`, `filemanagement`), na ordem do enum.
|
|
67
|
+
- API: `LoginTenancyModuleRegistry#isActive(FoundationModule)`, `#activeModules()`.
|
|
68
|
+
|
|
69
|
+
## Internos
|
|
70
|
+
|
|
71
|
+
Nenhum.
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, login-tenancy, exemplos]
|
|
3
|
+
fonte: java/seedgrid-quarkus-ext-login-tenancy
|
|
4
|
+
branch: main
|
|
5
|
+
commit: c67581bda9
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Login-tenancy (Quarkus) — exemplos
|
|
10
|
+
|
|
11
|
+
Voltar: [[SeedGrid/Extensions/login-tenancy/Visao-geral|Visão geral do login-tenancy]] · [[SeedGrid/Extensions/login-tenancy/Configuracao|Configuração]]
|
|
12
|
+
|
|
13
|
+
## 1. Dependências do host
|
|
14
|
+
|
|
15
|
+
Fonte: `README.md`, `docs/example-consumo.md` e `pom.xml`.
|
|
16
|
+
|
|
17
|
+
```xml
|
|
18
|
+
<dependency>
|
|
19
|
+
<groupId>br.com.seedgrid</groupId>
|
|
20
|
+
<artifactId>seedgrid-login-tenancy</artifactId>
|
|
21
|
+
<version>2026.10.14-1</version>
|
|
22
|
+
</dependency>
|
|
23
|
+
<!-- Provider concreto de billing: o login-tenancy só traz o billing-core -->
|
|
24
|
+
<dependency>
|
|
25
|
+
<groupId>br.com.seedgrid</groupId>
|
|
26
|
+
<artifactId>seedgrid-billing-stripe</artifactId>
|
|
27
|
+
<version>2026.10.14-1</version>
|
|
28
|
+
</dependency>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 2. `application.properties` mínimo
|
|
32
|
+
|
|
33
|
+
Fonte: `docs/example-consumo.md` (placeholders no lugar de valores).
|
|
34
|
+
|
|
35
|
+
```properties
|
|
36
|
+
quarkus.datasource.jdbc.url=${SEEDGRID_DB_URL}
|
|
37
|
+
quarkus.datasource.username=${SEEDGRID_DB_USERNAME}
|
|
38
|
+
quarkus.datasource.password=${SEEDGRID_DB_PASSWORD}
|
|
39
|
+
|
|
40
|
+
seedgrid.security.jwt.private-key-location=<CAMINHO-CHAVE-PRIVADA>
|
|
41
|
+
seedgrid.security.jwt.public-key-location=<CAMINHO-CHAVE-PUBLICA>
|
|
42
|
+
seedgrid.security.jwt.issuer=<ISSUER>
|
|
43
|
+
|
|
44
|
+
# Bootstrap inicial (opcional — executado pelo seedgrid-security)
|
|
45
|
+
seedgrid.security.first-admin-user.email=${FIRST_ADMIN_EMAIL:}
|
|
46
|
+
seedgrid.security.first-admin-user.initial-password=<SEGREDO:first-admin-password>
|
|
47
|
+
seedgrid.security.default-company.cnpj=<CNPJ-DA-EMPRESA-DONA-DO-PRODUTO>
|
|
48
|
+
|
|
49
|
+
seedgrid.login-tenancy.app.code=minha-app
|
|
50
|
+
seedgrid.login-tenancy.app.name=Minha App
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Migrations do domínio em `src/main/resources/db/migration/app/`.
|
|
54
|
+
|
|
55
|
+
## 3. Pós-processar o cadastro confirmado
|
|
56
|
+
|
|
57
|
+
Fonte: `SignupConfirmedEvent` (record com `cnpj`, `companyPublicId`, `corporateName`, `tradeName`, `rootEmail`, `representativeName`) e o padrão usado por `LoginTenancyBillingProvisioner`.
|
|
58
|
+
|
|
59
|
+
```java
|
|
60
|
+
import br.com.seedgrid.logintenancy.dtos.SignupConfirmedEvent;
|
|
61
|
+
import jakarta.enterprise.context.ApplicationScoped;
|
|
62
|
+
import jakarta.enterprise.event.Observes;
|
|
63
|
+
import jakarta.enterprise.event.TransactionPhase;
|
|
64
|
+
import jakarta.transaction.Transactional;
|
|
65
|
+
|
|
66
|
+
@ApplicationScoped
|
|
67
|
+
public class MeuOnboarding {
|
|
68
|
+
|
|
69
|
+
@Transactional(Transactional.TxType.REQUIRES_NEW)
|
|
70
|
+
void onSignupConfirmed(@Observes(during = TransactionPhase.AFTER_SUCCESS) SignupConfirmedEvent event) {
|
|
71
|
+
// ex.: criar dados iniciais do domínio para event.companyPublicId()
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
A conta de billing com trial já é criada pela própria extension quando `seedgrid.login-tenancy.modules.billing.enabled=true`.
|
|
77
|
+
|
|
78
|
+
## 4. Sobrescrever os templates de e-mail
|
|
79
|
+
|
|
80
|
+
Fonte: `LoginTenancyTemplateProvider`, `DefaultLoginTenancyTemplateProvider`.
|
|
81
|
+
|
|
82
|
+
**Por arquivo** — coloque no host (placeholders `{name}`, `{token}`, `{appName}`, `{companyName}`, `{email}`, `{link}`, `{password}`):
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
src/main/resources/templates/logintenancy/signup-confirmation.html
|
|
86
|
+
src/main/resources/templates/logintenancy/signup-welcome.html
|
|
87
|
+
src/main/resources/templates/logintenancy/user-activation.html
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Por bean** — o default é `@DefaultBean`, então um bean do host vence:
|
|
91
|
+
|
|
92
|
+
```java
|
|
93
|
+
import br.com.seedgrid.logintenancy.spis.LoginTenancyTemplateProvider;
|
|
94
|
+
|
|
95
|
+
@ApplicationScoped
|
|
96
|
+
public class MeusTemplates implements LoginTenancyTemplateProvider {
|
|
97
|
+
@Override public String signupConfirmation(String recipientName, String confirmationToken, String appName) { ... }
|
|
98
|
+
@Override public String signupWelcome(String recipientName, String companyName, String appName) { ... }
|
|
99
|
+
@Override public String userActivation(String recipientName, String email, String confirmationUrl,
|
|
100
|
+
String initialPassword, String appName) { ... }
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 5. Fluxo de signup (HTTP)
|
|
105
|
+
|
|
106
|
+
Fonte: `LoginTenancySignupController`, `InstitutionalSignupRequest`.
|
|
107
|
+
|
|
108
|
+
```http
|
|
109
|
+
GET /public/signup/cnpj-status?cnpj=12345678000199
|
|
110
|
+
→ { "status": "AVAILABLE", "pendingEmailMasked": null }
|
|
111
|
+
|
|
112
|
+
POST /public/signup
|
|
113
|
+
{
|
|
114
|
+
"cnpj": "12345678000199",
|
|
115
|
+
"corporateName": "Acme Tecnologia LTDA",
|
|
116
|
+
"tradeName": "Acme Labs",
|
|
117
|
+
"address": { "street": "...", "number": "1000", "complement": "...", "postalCode": "01310100",
|
|
118
|
+
"city": "São Paulo", "state": "SP", "district": "...", "phone": "1133334444" },
|
|
119
|
+
"legalRepresentative": { "firstName": "Maria", "lastName": "Silva", "cpf": "<CPF>",
|
|
120
|
+
"birthDate": "1990-05-20", "phone": "...", "whatsapp": "..." },
|
|
121
|
+
"rootEmail": "maria@acme.com",
|
|
122
|
+
"plainRootPassword": "<SEGREDO:senha>"
|
|
123
|
+
}
|
|
124
|
+
→ 202 { "status": "PENDING_EMAIL_VERIFICATION", "signupRequestId": "<publicId>", "emailDelivered": true }
|
|
125
|
+
|
|
126
|
+
POST /public/signup/confirm-email
|
|
127
|
+
{ "token": "123-456" }
|
|
128
|
+
→ 200 { "status": "CONFIRMED", "companyId": "<companyPublicId>", "signupRequestId": "<publicId>" }
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## 6. Status técnico
|
|
132
|
+
|
|
133
|
+
```http
|
|
134
|
+
GET /public/login-tenancy/status
|
|
135
|
+
→ { "app": {"code": "...", "name": "..."}, "activeModules": ["billing","apikeys","backup","filemanagement"],
|
|
136
|
+
"bootstrap": {"enabled": true, "admin": true},
|
|
137
|
+
"security": {"jwtIssuer": "...", "firstAdminConfigured": true} }
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## 7. Desligar rate limit em testes
|
|
141
|
+
|
|
142
|
+
Fonte: `runtime/src/test/resources/application.properties`.
|
|
143
|
+
|
|
144
|
+
```properties
|
|
145
|
+
seedgrid.ratelimit.signup.enabled=false
|
|
146
|
+
seedgrid.ratelimit.signup-email-exists.enabled=false
|
|
147
|
+
seedgrid.ratelimit.signup-confirm-email.enabled=false
|
|
148
|
+
seedgrid.ratelimit.signup-resend-email.enabled=false
|
|
149
|
+
```
|