@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.
Files changed (225) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +151 -2
  3. package/dist/adapters/claude.js +114 -0
  4. package/dist/adapters/codex.js +108 -0
  5. package/dist/adapters/index.js +17 -0
  6. package/dist/adapters/shared.js +142 -0
  7. package/dist/adapters/types.js +1 -0
  8. package/dist/cli.js +203 -0
  9. package/dist/commands/common.js +98 -0
  10. package/dist/commands/doctor.js +290 -0
  11. package/dist/commands/init.js +9 -0
  12. package/dist/commands/install.js +107 -0
  13. package/dist/commands/remove.js +54 -0
  14. package/dist/commands/review.js +127 -0
  15. package/dist/commands/status.js +73 -0
  16. package/dist/commands/update.js +8 -0
  17. package/dist/commands/validate.js +27 -0
  18. package/dist/core/apply.js +181 -0
  19. package/dist/core/blocks.js +64 -0
  20. package/dist/core/content.js +528 -0
  21. package/dist/core/env.js +40 -0
  22. package/dist/core/frontmatter.js +29 -0
  23. package/dist/core/hash.js +14 -0
  24. package/dist/core/inspect.js +51 -0
  25. package/dist/core/lock.js +124 -0
  26. package/dist/core/paths.js +65 -0
  27. package/dist/core/plan.js +242 -0
  28. package/dist/core/tools.js +62 -0
  29. package/dist/core/types.js +11 -0
  30. package/dist/core/updates.js +121 -0
  31. package/docs/arquitetura.md +80 -0
  32. package/docs/compatibilidade.md +50 -0
  33. package/docs/formato.md +155 -0
  34. package/docs/instalacao.md +105 -0
  35. package/docs/manutencao.md +115 -0
  36. package/package.json +43 -4
  37. package/seedgridKB/SeedGrid/Extensions/Catalogo-de-enums.md +161 -0
  38. package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +971 -0
  39. package/seedgridKB/SeedGrid/Extensions/Indice.md +63 -0
  40. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +124 -0
  41. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Enums.md +40 -0
  42. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +97 -0
  43. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +114 -0
  44. package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao-Rust.md +69 -0
  45. package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao.md +88 -0
  46. package/seedgridKB/SeedGrid/Extensions/apikeys/Enums.md +33 -0
  47. package/seedgridKB/SeedGrid/Extensions/apikeys/Exemplos.md +121 -0
  48. package/seedgridKB/SeedGrid/Extensions/apikeys/Rust.md +126 -0
  49. package/seedgridKB/SeedGrid/Extensions/apikeys/Visao-geral.md +111 -0
  50. package/seedgridKB/SeedGrid/Extensions/audit/Configuracao-Rust.md +93 -0
  51. package/seedgridKB/SeedGrid/Extensions/audit/Configuracao.md +127 -0
  52. package/seedgridKB/SeedGrid/Extensions/audit/Enums.md +66 -0
  53. package/seedgridKB/SeedGrid/Extensions/audit/Exemplos.md +151 -0
  54. package/seedgridKB/SeedGrid/Extensions/audit/Rust.md +120 -0
  55. package/seedgridKB/SeedGrid/Extensions/audit/Visao-geral.md +114 -0
  56. package/seedgridKB/SeedGrid/Extensions/backup/Configuracao-Rust.md +136 -0
  57. package/seedgridKB/SeedGrid/Extensions/backup/Configuracao.md +319 -0
  58. package/seedgridKB/SeedGrid/Extensions/backup/Enums.md +131 -0
  59. package/seedgridKB/SeedGrid/Extensions/backup/Exemplos.md +210 -0
  60. package/seedgridKB/SeedGrid/Extensions/backup/Rust.md +135 -0
  61. package/seedgridKB/SeedGrid/Extensions/backup/Visao-geral.md +150 -0
  62. package/seedgridKB/SeedGrid/Extensions/billing/Configuracao-Rust.md +86 -0
  63. package/seedgridKB/SeedGrid/Extensions/billing/Configuracao.md +243 -0
  64. package/seedgridKB/SeedGrid/Extensions/billing/Enums.md +165 -0
  65. package/seedgridKB/SeedGrid/Extensions/billing/Exemplos.md +205 -0
  66. package/seedgridKB/SeedGrid/Extensions/billing/Rust.md +109 -0
  67. package/seedgridKB/SeedGrid/Extensions/billing/Visao-geral.md +181 -0
  68. package/seedgridKB/SeedGrid/Extensions/broker/Configuracao-Rust.md +40 -0
  69. package/seedgridKB/SeedGrid/Extensions/broker/Visao-geral.md +114 -0
  70. package/seedgridKB/SeedGrid/Extensions/cache/Configuracao-Rust.md +73 -0
  71. package/seedgridKB/SeedGrid/Extensions/cache/Configuracao.md +112 -0
  72. package/seedgridKB/SeedGrid/Extensions/cache/Enums.md +36 -0
  73. package/seedgridKB/SeedGrid/Extensions/cache/Exemplos.md +149 -0
  74. package/seedgridKB/SeedGrid/Extensions/cache/Rust.md +81 -0
  75. package/seedgridKB/SeedGrid/Extensions/cache/Visao-geral.md +90 -0
  76. package/seedgridKB/SeedGrid/Extensions/commons/Configuracao.md +107 -0
  77. package/seedgridKB/SeedGrid/Extensions/commons/Enums.md +105 -0
  78. package/seedgridKB/SeedGrid/Extensions/commons/Exemplos.md +141 -0
  79. package/seedgridKB/SeedGrid/Extensions/commons/Visao-geral.md +99 -0
  80. package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +122 -0
  81. package/seedgridKB/SeedGrid/Extensions/exchange/Enums.md +29 -0
  82. package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +82 -0
  83. package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +118 -0
  84. package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao-Rust.md +110 -0
  85. package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao.md +157 -0
  86. package/seedgridKB/SeedGrid/Extensions/filemanagement/Exemplos.md +157 -0
  87. package/seedgridKB/SeedGrid/Extensions/filemanagement/Rust.md +70 -0
  88. package/seedgridKB/SeedGrid/Extensions/filemanagement/Visao-geral.md +88 -0
  89. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao-Rust.md +124 -0
  90. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +195 -0
  91. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Enums.md +71 -0
  92. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Exemplos.md +149 -0
  93. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Rust.md +139 -0
  94. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +130 -0
  95. package/seedgridKB/SeedGrid/Extensions/notification/Configuracao.md +141 -0
  96. package/seedgridKB/SeedGrid/Extensions/notification/Enums.md +52 -0
  97. package/seedgridKB/SeedGrid/Extensions/notification/Exemplos.md +141 -0
  98. package/seedgridKB/SeedGrid/Extensions/notification/Visao-geral.md +113 -0
  99. package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao-Rust.md +67 -0
  100. package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao.md +94 -0
  101. package/seedgridKB/SeedGrid/Extensions/privacy/Enums.md +79 -0
  102. package/seedgridKB/SeedGrid/Extensions/privacy/Exemplos.md +172 -0
  103. package/seedgridKB/SeedGrid/Extensions/privacy/Rust.md +107 -0
  104. package/seedgridKB/SeedGrid/Extensions/privacy/Visao-geral.md +90 -0
  105. package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao-Rust.md +72 -0
  106. package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao.md +104 -0
  107. package/seedgridKB/SeedGrid/Extensions/realtime/Exemplos.md +104 -0
  108. package/seedgridKB/SeedGrid/Extensions/realtime/Rust.md +69 -0
  109. package/seedgridKB/SeedGrid/Extensions/realtime/Visao-geral.md +105 -0
  110. package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao-Rust.md +68 -0
  111. package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao.md +186 -0
  112. package/seedgridKB/SeedGrid/Extensions/resilience/Enums.md +96 -0
  113. package/seedgridKB/SeedGrid/Extensions/resilience/Exemplos.md +229 -0
  114. package/seedgridKB/SeedGrid/Extensions/resilience/Rust.md +80 -0
  115. package/seedgridKB/SeedGrid/Extensions/resilience/Visao-geral.md +112 -0
  116. package/seedgridKB/SeedGrid/Extensions/runtime/Configuracao-Rust.md +90 -0
  117. package/seedgridKB/SeedGrid/Extensions/runtime/Visao-geral.md +114 -0
  118. package/seedgridKB/SeedGrid/Extensions/security/Configuracao-Rust.md +327 -0
  119. package/seedgridKB/SeedGrid/Extensions/security/Configuracao.md +510 -0
  120. package/seedgridKB/SeedGrid/Extensions/security/Enums.md +95 -0
  121. package/seedgridKB/SeedGrid/Extensions/security/Exemplos.md +218 -0
  122. package/seedgridKB/SeedGrid/Extensions/security/Rust.md +203 -0
  123. package/seedgridKB/SeedGrid/Extensions/security/Visao-geral.md +131 -0
  124. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao-Rust.md +188 -0
  125. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +345 -0
  126. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Enums.md +117 -0
  127. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Exemplos.md +205 -0
  128. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Rust.md +161 -0
  129. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +142 -0
  130. package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao-Rust.md +75 -0
  131. package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao.md +152 -0
  132. package/seedgridKB/SeedGrid/Extensions/whatsapp/Enums.md +198 -0
  133. package/seedgridKB/SeedGrid/Extensions/whatsapp/Exemplos.md +173 -0
  134. package/seedgridKB/SeedGrid/Extensions/whatsapp/Rust.md +83 -0
  135. package/seedgridKB/SeedGrid/Extensions/whatsapp/Visao-geral.md +99 -0
  136. package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +112 -0
  137. package/seedgridKB/SeedGrid/SeedGrid-components/Indice.md +323 -0
  138. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/API.md +257 -0
  139. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Exemplos.md +307 -0
  140. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Visao-geral.md +51 -0
  141. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/API.md +174 -0
  142. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Exemplos.md +236 -0
  143. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Visao-geral.md +76 -0
  144. package/seedgridKB/SeedGrid/SeedGrid-components/digits/API.md +339 -0
  145. package/seedgridKB/SeedGrid/SeedGrid-components/digits/Exemplos.md +311 -0
  146. package/seedgridKB/SeedGrid/SeedGrid-components/digits/Visao-geral.md +57 -0
  147. package/seedgridKB/SeedGrid/SeedGrid-components/editor/API.md +125 -0
  148. package/seedgridKB/SeedGrid/SeedGrid-components/editor/Exemplos.md +116 -0
  149. package/seedgridKB/SeedGrid/SeedGrid-components/editor/Visao-geral.md +86 -0
  150. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/API.md +490 -0
  151. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Exemplos.md +544 -0
  152. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Visao-geral.md +69 -0
  153. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/API.md +113 -0
  154. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Exemplos.md +159 -0
  155. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Visao-geral.md +92 -0
  156. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/API.md +516 -0
  157. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Exemplos.md +629 -0
  158. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Visao-geral.md +80 -0
  159. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/API.md +615 -0
  160. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Exemplos.md +384 -0
  161. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral.md +111 -0
  162. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/API.md +661 -0
  163. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Exemplos.md +312 -0
  164. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Visao-geral.md +123 -0
  165. package/seedgridKB/SeedGrid/SeedGrid-components/layout/API.md +1090 -0
  166. package/seedgridKB/SeedGrid/SeedGrid-components/layout/Exemplos.md +1172 -0
  167. package/seedgridKB/SeedGrid/SeedGrid-components/layout/Visao-geral.md +98 -0
  168. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/Visao-geral.md +98 -0
  169. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-apikeys.md +118 -0
  170. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-audit.md +88 -0
  171. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-backup.md +131 -0
  172. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-platform.md +132 -0
  173. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-user.md +120 -0
  174. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-login-tenancy.md +119 -0
  175. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-security.md +427 -0
  176. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-self-enter.md +104 -0
  177. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-subdomain-tenancy.md +110 -0
  178. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/API.md +490 -0
  179. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Exemplos.md +561 -0
  180. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Visao-geral.md +82 -0
  181. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/Visao-geral.md +68 -0
  182. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-commons.md +61 -0
  183. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-core.md +140 -0
  184. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-playground.md +112 -0
  185. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-theme.md +97 -0
  186. package/seedgridKB/SeedGrid/SeedGrid-components/providers/API.md +177 -0
  187. package/seedgridKB/SeedGrid/SeedGrid-components/providers/Exemplos.md +332 -0
  188. package/seedgridKB/SeedGrid/SeedGrid-components/providers/Visao-geral.md +106 -0
  189. package/seedgridKB/SeedGrid/SeedGrid-components/showcase.md +70 -0
  190. package/seedgridKB/SeedGrid/Toolkit/agents/arquiteto.md +53 -0
  191. package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +45 -0
  192. package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +43 -0
  193. package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +41 -0
  194. package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +44 -0
  195. package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +40 -0
  196. package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +78 -0
  197. package/seedgridKB/SeedGrid/Toolkit/references/glossario.md +15 -0
  198. package/seedgridKB/SeedGrid/Toolkit/references/modos-shared-native.md +27 -0
  199. package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +54 -0
  200. package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +39 -0
  201. package/seedgridKB/SeedGrid/Toolkit/rules/formato-entrega.md +29 -0
  202. package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +47 -0
  203. package/seedgridKB/SeedGrid/Toolkit/rules/personalizacao-local.md +22 -0
  204. package/seedgridKB/SeedGrid/Toolkit/skills/planejar-mudanca/SKILL.md +38 -0
  205. package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/SKILL.md +33 -0
  206. package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/references/checklist.md +25 -0
  207. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-backend-crud/SKILL.md +29 -0
  208. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-bump/SKILL.md +26 -0
  209. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/SKILL.md +221 -0
  210. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/agents/openai.yaml +4 -0
  211. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/checklist.md +31 -0
  212. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/patterns.md +185 -0
  213. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/routing.md +66 -0
  214. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/SKILL.md +56 -0
  215. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +4 -0
  216. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/checklist.md +32 -0
  217. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/steps.md +114 -0
  218. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-review/SKILL.md +61 -0
  219. package/seedgridKB/SeedGrid/Toolkit/skills/validar-mudanca/SKILL.md +29 -0
  220. package/seedgridKB/SeedGrid/Toolkit/templates/decisao-arquitetura.md +29 -0
  221. package/seedgridKB/SeedGrid/Toolkit/templates/especificacao-tarefa.md +32 -0
  222. package/seedgridKB/SeedGrid/Toolkit/templates/relatorio-validacao.md +30 -0
  223. package/seedgridKB/SeedGrid/Versoes.md +64 -0
  224. package/seedgridKB/SeedGrid/Visao-geral.md +35 -0
  225. 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
+ ```