@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,131 @@
1
+ ---
2
+ tags: [seedgrid, extension, security]
3
+ fonte: java/seedgrid-quarkus-ext-security
4
+ branch: main
5
+ commit: 450735386e
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # security — Visão geral (extension Quarkus)
10
+
11
+ Notas relacionadas: [[SeedGrid/Extensions/security/Enums|Enums do security]] · [[SeedGrid/Extensions/security/Configuracao|Configuração do security]] · [[SeedGrid/Extensions/security/Exemplos|Exemplos do security]] · [[SeedGrid/Extensions/security/Rust|Porte Rust]]
12
+
13
+ ## Objetivo e funcionalidades
14
+
15
+ Plano de segurança pronto para aplicações Quarkus da plataforma SeedGrid (Confirmado, `README.md` + código):
16
+
17
+ - **Autenticação JWT RS256** própria (Nimbus JOSE): emissão em `TokenService`, verificação em `TokenVerifier` + `JwtAuthenticationFilter`; bridge para `mp.jwt.*` para que o `SecurityIdentity` do Quarkus funcione.
18
+ - **Refresh tokens opacos** com rotação, família, detecção de reuso (revoga a família) e janela de graça para refresh concorrente.
19
+ - **RBAC**: roles → permissões resolvidas por `PermissionResolveService` (cache via lib cache, versão RBAC + nonce de boot na chave) e injetadas como `StringPermission` pelo `RbacSecurityIdentityAugmentor` → habilita `@PermissionsAllowed`. Permissões podem ter **audience** (claim `audience` setado pelo host via `JwtTokenCustomizer`); identidades de API key (`apikey.authType=API_KEY`) são ignoradas pelo augmentor.
20
+ - **Multiempresa (T1)**: token escopado por empresa (`companyId`, `companyRoot`, `allowedCompanies`, `allCompanies`), `POST /me/select-company`, `CompanyContextFilter` (claim `companyId`, fallback header `X-Company-Id`), modelo aditivo global + por conta (`UserCompany`), empresa-plataforma identificada pelo CNPJ de `default-company`.
21
+ - **2FA**: TOTP, EMAIL e WHATSAPP (estratégias plugáveis `TwoFactorStrategy`), backup codes, QR code com logo opcional.
22
+ - **Self-enter**: signup público com OTP de e-mail + aprovação, convites (com ou sem aprovação), job de limpeza agendado. Na aprovação, as roles vêm do convite/aprovação ou, na falta delas, da `default-role` (role global; obrigatória quando o self-enter está ligado, sem padrão). O e-mail de "acesso aprovado" não é enviado (o serviço só registra log).
23
+ - **Gestão**: usuários, roles, permissões, empresas, memberships, avatares (storage da lib filemanagement), gestão pela própria conta (`/me/security/*`), perfil (`/me/profile`).
24
+ - **Política de senha** (tamanho, categorias, histórico, expiração), troca obrigatória (`PasswordChangeRequiredFilter`), BCrypt.
25
+ - **Bootstrap** de empresa default e primeiro admin no startup.
26
+ - **E-mails** HTML (templates em `runtime/src/main/resources/templates/security-default/`) via mailer nomeado `security`, com alerta operacional de falha de entrega via notification.
27
+ - **Rate-limit** dos endpoints públicos (lib resilience).
28
+ - Erros RFC 7807 (`SecurityApiExceptionExtension`, integra o `ApiExceptionHandler` da commons).
29
+
30
+ ## Módulos Maven e coordenadas
31
+
32
+ | Módulo | groupId | artifactId | versão |
33
+ |---|---|---|---|
34
+ | parent (agregador) | `br.com.seedgrid` | `seedgrid-security-parent` | `2026.10.14` |
35
+ | runtime | `br.com.seedgrid` | `seedgrid-security` | `2026.10.14` |
36
+ | deployment | `br.com.seedgrid` | `seedgrid-security-deployment` | `2026.10.14` |
37
+
38
+ Parent: `br.com.seedgrid:seedgrid-parent:2026.07.02`.
39
+
40
+ Dependências SeedGrid do runtime (versões do `runtime/pom.xml`):
41
+
42
+ | Artefato | Versão | Uso |
43
+ |---|---|---|
44
+ | `seedgrid-commons` | 2026.08.16 | `CurrentUserProvider`, `BaseEntity`, `ProblemDetails`, `ApiExceptionExtension` — [[SeedGrid/Extensions/commons/Visao-geral\|commons]] |
45
+ | `seedgrid-privacy` | 2026.07.27 | Mascaramento e criptografia opcional de PII — [[SeedGrid/Extensions/privacy/Visao-geral\|privacy]] |
46
+ | `seedgrid-filemanagement` | 2026.07.08 | Storage de avatares — [[SeedGrid/Extensions/filemanagement/Visao-geral\|filemanagement]] |
47
+ | `seedgrid-cache-core` | 2026.10.13 | Cache de permissões, sessões 2FA, códigos — [[SeedGrid/Extensions/cache/Visao-geral\|cache]] |
48
+ | `seedgrid-resilience-core` | 2026.07.08 | `@SeedGridRateLimit` — [[SeedGrid/Extensions/resilience/Visao-geral\|resilience]] |
49
+ | `seedgrid-audit-core` / `seedgrid-audit-postgresql` | 2026.09.25 | Auditoria (o postgresql aparece com `scope test` no runtime) — [[SeedGrid/Extensions/audit/Visao-geral\|audit]] |
50
+ | `seedgrid-notification-api` | 2026.10.09 | Evento `platform.email-delivery-failed` — [[SeedGrid/Extensions/notification/Visao-geral\|notification]] |
51
+ | `seedgrid-whatsapp-core` (+ `-evolution`, `-whatsapp-cloud` como `optional`) | 2026.07.27 | `WhatsAppApi` para 2FA — [[SeedGrid/Extensions/whatsapp/Visao-geral\|whatsapp]] |
52
+
53
+ Quarkus: `quarkus-arc`, `quarkus-jdbc-postgresql`, `quarkus-flyway`, `quarkus-rest-jackson`, `quarkus-smallrye-jwt`, `quarkus-smallrye-jwt-build`, `quarkus-mailer`, `quarkus-scheduler`, `quarkus-cache`, `quarkus-hibernate-validator`, `quarkus-smallrye-openapi`. Terceiros: `dev.samstevens.totp:totp:1.7.1`, `com.nimbusds:nimbus-jose-jwt:9.37.3`, `org.mindrot:jbcrypt:0.4`.
54
+
55
+ ## Deployment (`SecurityProcessor`)
56
+
57
+ `java/seedgrid-quarkus-ext-security/deployment/src/main/java/br/com/seedgrid/security/deployment/SecurityProcessor.java`:
58
+ - `FeatureBuildItem("seedgrid-security")`;
59
+ - `IndexDependencyBuildItem` para `seedgrid-whatsapp-core`, `seedgrid-whatsapp-evolution`, `seedgrid-whatsapp-whatsapp-cloud`;
60
+ - `AdditionalBeanBuildItem` (unremovable) com filtros, controllers, services, repositories, configs, estratégias 2FA e implementações default das SPIs;
61
+ - `AddToOpenAPIDefinitionBuildItem(new JwtSecurityOpenApiFilter())`.
62
+ Não há configuração de build time.
63
+
64
+ ## Arquitetura e fluxo
65
+
66
+ ```mermaid
67
+ flowchart LR
68
+ C[Cliente] -->|/public/auth/login| AC[AuthController]
69
+ AC --> AS[AuthService]
70
+ AS -->|2FA ligado e usuário com 2FA| TFS[TwoFactorService] -->|tempToken| C
71
+ AS --> TS[TokenService RS256] --> RK[RsaKeyProvider]
72
+ AS --> RTS[RefreshTokenService]
73
+ C -->|Bearer| JF[JwtAuthenticationFilter] --> TV[TokenVerifier]
74
+ JF --> AUG[RbacSecurityIdentityAugmentor] --> PRS[PermissionResolveService] --> CACHE[(SeedGridCacheProvider)]
75
+ JF --> CCF[CompanyContextFilter]
76
+ PRS --> DB[(PostgreSQL)]
77
+ ```
78
+
79
+ Filtros JAX-RS: `SelfEnterDisabledFilter` (`@PreMatching`, 404 quando self-enter desligado), `JwtAuthenticationFilter` (rota pública = path contém `/public/` ou `/q/`), `CompanyContextFilter`, `PasswordChangeRequiredFilter`, `PlatformScopeFilter` (anotação `@PlatformScope`).
80
+
81
+ ## APIs públicas e pontos de integração
82
+
83
+ ### Anotações
84
+ - `@MonoCompany` — endpoint sem contexto de empresa (ignorado pelo `CompanyContextFilter`).
85
+ - `@PermitWithoutPasswordChange` — liberado mesmo com troca de senha pendente.
86
+ - `@PlatformScope(allowSelf=false)` + `@PlatformScope.Exempt` — restringe a usuários da empresa-plataforma.
87
+ - Usa as anotações Quarkus `@Authenticated`, `@RolesAllowed`, `@PermissionsAllowed`, `@PermitAll`.
88
+
89
+ ### SPIs (`br.com.seedgrid.security.spi`, todas com implementação `@DefaultBean` em `spi/impl`)
90
+ `AllowedCompaniesResolver`, `EmailServiceInterface`, `TemplateSecurityProvider`, `TwoFactorEmailTemplateProvider`, `TwoFactorStrategy`, `JwtTokenCustomizer`, `JwtTokenValidator`, `LoginScopeResolver`, `SecurityScopeResolverProvider`, `UserAdditionalFieldsValidator`, `UserQuotaValidator`, `AccountUserActivationMailer`. Assinaturas em [[SeedGrid/Extensions/security/Exemplos|Exemplos]].
91
+
92
+ ### Endpoints REST (paths de `controllers/RestControllerPath`)
93
+
94
+ | Grupo | Método e path |
95
+ |---|---|
96
+ | Auth (público) | `POST /public/auth/login`, `POST /public/auth/refresh`, `GET /public/auth/confirm-email`, `POST /public/auth/forgot-password`, `GET /public/auth/reset-password` |
97
+ | Me | `GET /me/permissions`, `GET /me/companies`, `POST /me/select-company` |
98
+ | Perfil | `GET /me/profile`, `PUT /me/profile`, `PUT /me/profile/password`, `POST /me/profile/avatar`, `DELETE /me/profile/avatar` |
99
+ | Gestão pela conta | `GET/POST /me/security/users`, `GET/PUT/DELETE /me/security/users/{id}`, `POST /me/security/users/{id}/resend-activation`; `GET/POST /me/security/roles`, `GET /me/security/roles/permissions`, `GET/PUT/DELETE /me/security/roles/{id}` |
100
+ | Usuários | `GET/POST /users`, `GET/PATCH/DELETE /users/{publicId}`, `PUT/DELETE /users/{publicId}/memberships/{companyPublicId}`, `POST/GET/DELETE /users/{publicId}/avatar`, `POST /users/avatars/defaults`, `PUT /users/change-password` |
101
+ | Escrita de usuário (app) | `POST /app/security/users`, `PATCH /app/security/users/{publicId}` |
102
+ | Roles | `GET/POST /roles`, `GET /roles/integration`, `GET/PATCH/DELETE /roles/{publicId}` |
103
+ | Permissões | `GET /permissions`, `GET /permissions/{publicId}` |
104
+ | Empresas | `GET/POST /companies`, `GET/PATCH/DELETE /companies/{publicId}`, `GET /public/companies` |
105
+ | Plataforma | `GET /admin/platform-access`, `POST /admin/platform-access` |
106
+ | 2FA | `GET /2f/status`, `POST /2f/enable`, `POST /2f/setup/confirm`, `POST /2f/totp/confirm`, `POST /2f/disable`; públicos `POST /public/2f/verify`, `POST /public/2f/resend` |
107
+ | Self-enter (admin) | `GET /self-enter/requests/to-approve`, `GET /self-enter/public-link`, `POST/GET /self-enter/invitations`, `POST /self-enter/invitations/{id}/resend`, `POST /self-enter/requests/{id}/approve`, `POST /self-enter/requests/{id}/reject` |
108
+ | Self-enter (público) | `POST /public/self-enter/requests`, `POST /public/self-enter/requests/{id}/confirm-email`, `POST /public/self-enter/requests/{id}/resend-email`, `GET /public/self-enter/invitations/{token}`, `POST /public/self-enter/invitations/{token}/complete` |
109
+
110
+ ### Beans CDI úteis ao host
111
+ `TokenService`, `RefreshTokenService`, `PermissionResolveService`, `RbacVersionService`, `UserService`, `RoleService`, `PasswordService`, `SecretEncryptionService`, `PlatformCompanyService`, `SecurityLinkBuilder`.
112
+
113
+ ### Eventos
114
+ - Notification: `platform.email-delivery-failed` (payload `recipient` mascarado, `subject`, `cause`, `accumulated`) — `services/EmailDeliveryAlertService`.
115
+ - `StartupEvent` observado por `FirstAdminBootstrapService`.
116
+ - Job `@Scheduled` `EntryRequestCleanupJob` (multi-tenant).
117
+
118
+ ## Migrations
119
+
120
+ `runtime/src/main/resources/db/migration/security`, **V200 a V235** (o README fala em V200–V234; V235 `entry_request_company_cascade` existe). Tabelas principais: `users`, `roles`, `permissions`, `role_permissions`, `user_roles`, `password_history`, `entry_requests`, `entry_request_validation_tokens`, `backup_codes`, `refresh_tokens`, `companies`, `user_companies`, `user_company_roles`, `default_user_avatars`. V204 semeia a role `ADMIN` (exigida pelo bootstrap).
121
+
122
+ ## Testes
123
+
124
+ `runtime/src/test/java/br/com/seedgrid/security/` — ~50 classes: `@QuarkusTest` com Postgres via Testcontainers (`PostgreSqlTestResourceLifecycleManager`) cobrindo auth, refresh com janela de graça, 2FA, self-enter (vários profiles: desligado, só público, só convite, auto-aprovação, sem default-role, TTL curto), bootstrap (ligado/desligado), política de senha, audience de permissões, escopo de plataforma, memberships, atributos adicionais, PII cifrada; unitários de `JsonAttributeLimits/Merger`, `EmailDeliveryAlertService`, `DefaultEmailService`, resolvers. O exemplo `java/examples/seedgrid-security-example` tem `CompanyScopedTokenT1Test` e `SecuritySchemaBootstrapTest`. **Não executados.**
125
+
126
+ ## Limitações
127
+
128
+ - Sem endpoint de logout; sessão encerrada por expiração/rotação.
129
+ - Rota só é pública se o path contém `/public/` (ou `/q/`).
130
+ - E-mail de aprovação do self-enter não é enviado (`SelfEnterService#sendApprovalEmail` só loga); `TemplateSecurityProvider#entryRequestApproved` não é chamado.
131
+ - Defaults efetivos que diferem do `@WithDefault` (2FA ligado, senha permissiva): ver [[SeedGrid/Extensions/security/Configuracao|Configuração]] §5.
@@ -0,0 +1,188 @@
1
+ ---
2
+ tags: [seedgrid, extension, subdomain-tenancy, rust, configuracao]
3
+ fonte: rust/seedgrid-rust-crate-subdomain-tenancy
4
+ branch: main
5
+ commit: be738a2d1e
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # Configuração Rust — `seedgrid-rust-crate-subdomain-tenancy`
10
+
11
+ Volta para: [[SeedGrid/Extensions/subdomain-tenancy/Rust|Porte Rust do subdomain-tenancy]] · Java: [[SeedGrid/Extensions/subdomain-tenancy/Configuracao|Configuração do subdomain-tenancy (Quarkus)]]
12
+
13
+ ## 1. Cabeçalho
14
+
15
+ | Item | Valor |
16
+ |---|---|
17
+ | Struct | `SubdomainTenancyConfig` (`src/config.rs`), `impl Default` com os defaults abaixo |
18
+ | Prefixo lógico | `seedgrid.subdomain-tenancy.*` (porte de `SubdomainTenancyConfig.java` + `SubdomainTenancyBridgeConfig.java`) |
19
+ | Mecanismo | `SubdomainTenancyConfig::from_env()` (env vars `SEEDGRID_MULTITENANCY_*` + `DOMAIN_SUFFIX`, `PRODUCT_PREFIX`), que no fim chama `apply_datasource_env(None)`. O host pode chamar de novo `apply_datasource_env(Some(master_url))` para derivar o datasource do tenant a partir da URL do master dele |
20
+ | Leitura | boot, pelo host. O crate **não** chama `from_env` sozinho: `assemble_all(Arc<SubdomainTenancyConfig>, ...)` e `TenancyPlatform::assemble` recebem a struct pronta |
21
+ | Gate global | `domain_suffix = None` → tenancy desligada (`assemble_all` não monta `TenancyPlatform`, auditoria fica single-DB) |
22
+ | Features Cargo | `default = ["postgres"]`; `postgres = ["dep:sqlx"]` (backend relacional do master: `tenants`, `tenant_migration_state`, `tenant_validation_tokens`) |
23
+ | Outras leituras de env no crate | só `AuditConfig::from_env()` em `src/orchestrator.rs` (envs do audit) e, indiretamente, `SecurityConfig::from_env()` via `SecurityPlatform::assemble` e as do backup/billing via `BackupPlatform`/`BillingPlatform` |
24
+ | Origem | caminhos relativos a `rust/seedgrid-rust-crate-subdomain-tenancy/` |
25
+
26
+ ### ⚠️ Nomes de env divergentes do módulo Java atual (Confirmado)
27
+
28
+ O `microprofile-config.properties` do Java (commit `fe62530`) e o exemplo Java usam **`SEEDGRID_SUBDOMAIN_TENANCY_*`**. O crate Rust lê **`SEEDGRID_MULTITENANCY_*`** (nome antigo, citado no próprio exemplo Java como "nome antigo"). Nenhuma env `SEEDGRID_SUBDOMAIN_TENANCY_*` é lida pelo crate (grep). Consequência: um `dev.env` do Java atual **não** configura o porte Rust.
29
+
30
+ Parsing: booleanos em geral `v != "false"` (qualquer coisa diferente de `false` literal liga) — exceções: `..._STARTUP_ALL_TENANTS` (`== "true"`). Durações via `parse_ttl_to_secs` (ISO-8601 com `W/D/H/M/S` ou sufixo `48H`/`7D`/`30M`; inválido → **48h**, inclusive para lock-lease e delay do circuit breaker). Pools via `pool_env` (mínimo 1).
31
+
32
+ ## 2. Propriedades do crate
33
+
34
+ ### 2.1 Resolução de tenant
35
+
36
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
37
+ |---|---|---|---|---|---|---|---|---|---|
38
+ | `DOMAIN_SUFFIX` · fallback `SEEDGRID_MULTITENANCY_DOMAIN_SUFFIX` → `domain_suffix` | `Option<String>` | ex. `crm.seedgrid.com.br` | `None` (tenancy OFF) | Condicional: obrigatória para ligar a tenancy | `{tenant}.{suffix}` → tenant; vazio = ausente | `src/resolver.rs`, `src/orchestrator.rs` (gate) | Java: `seedgrid.subdomain-tenancy.domain-suffix` (env Java `SEEDGRID_SUBDOMAIN_TENANCY_DOMAIN_SUFFIX` **não lida**) | boot | `src/config.rs` → `from_env` |
39
+ | `PRODUCT_PREFIX` → `product_prefix` | `Option<String>` | ex. `crm` | `None` | Não | nome do banco por tenant `<prefix>_<tenant>` | `TenantPoolProvider`, provisioning, coordinator | Java: `seedgrid.subdomain-tenancy.product-prefix`; o Java usa a env `PRODUCT_PREFIX` em `database.master.subdomain` | boot | idem |
40
+ | `default_tenant` (campo) | `String` | — | `master` | Não | tenant de fallback/escopo plataforma (bypass do gate de migração) | `gate.rs`, `pool_resolver.rs`, `provisioning_routes.rs`, `spi.rs`, `tenant_scoped.rs` | Java: `...default-tenant`; **sem env no Rust** | struct | `SubdomainTenancyConfig::default` |
41
+
42
+ ### 2.2 Datasources (master e tenant)
43
+
44
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
45
+ |---|---|---|---|---|---|---|---|---|---|
46
+ | `SEEDGRID_MULTITENANCY_MASTER_DB_URL` | URL | `jdbc:postgresql://`, `postgresql://`, `postgres://` | — (fallback: `master_url_fallback` do host) | Não | base para derivar `host:port` (e creds embutidas) do tenant | `apply_datasource_env` | Java: `...master.datasource.jdbc.url` | boot | `src/config.rs` → `apply_datasource_env` |
47
+ | `SEEDGRID_MULTITENANCY_MASTER_DB_USERNAME` | `String` | — | — | Não | fallback das creds do tenant | idem | Java: `...master.datasource.username` | boot | idem |
48
+ | 🔒 `SEEDGRID_MULTITENANCY_MASTER_DB_PASSWORD` | `String` | — | — | Não | idem | idem | Java: `...master.datasource.password` | boot | idem |
49
+ | `SEEDGRID_MULTITENANCY_TENANT_DB_URL` → `tenant_url_pattern` | URL base | URL sem `{tenant}` (anexa `/{tenant}`) ou com `{tenant}` | `jdbc:postgresql://localhost:5439/{tenant}` | Não (recomendada) | precedência: `TENANT_URL_PATTERN` > `TENANT_DB_URL` > host:port do master > default | `TenantPoolProvider`, coordinator | Java: `...tenant.datasource.jdbc.url` | boot | idem |
50
+ | `SEEDGRID_MULTITENANCY_TENANT_URL_PATTERN` → `tenant_url_pattern` | `String` | com `{tenant}` | — | Não | legado; tem a última palavra | idem | Java: `...tenant.datasource.jdbc.url-pattern` | boot | idem |
51
+ | `SEEDGRID_MULTITENANCY_TENANT_DB_USERNAME` → `tenant_username` | `String` | — | `postgres` | Não | precedência: env tenant > creds do master > default; também vira `OWNER` do `CREATE DATABASE` | provisioning, pools | Java: `...tenant.datasource.username` | boot | idem |
52
+ | 🔒 `SEEDGRID_MULTITENANCY_TENANT_DB_PASSWORD` → `tenant_password` | `String` | — | `postgres` | Não (trocar em produção) | idem | pools | Java: `...tenant.datasource.password` | boot | idem |
53
+ | `SEEDGRID_MULTITENANCY_TENANT_DB_POOL_MIN` / `_MAX` → `tenant_pool_min/max` | `u32` | ≥ 1 | `1` / `10` | Não | conexões por pool de tenant | `src/orchestrator.rs` (`with_min/max_connections`) | Java: `...tenant.datasource.jdbc.min-size/max-size` (Java: **0 / 5**) | boot | idem |
54
+ | `SEEDGRID_MULTITENANCY_TENANT_DB_MAX_ACTIVE_DATASOURCES` → `tenant_max_active_datasources` | `usize` | `0` = ilimitado | `200` | Não | teto de pools em cache; LRU fecha o menos usado | `src/orchestrator.rs` (`with_max_active`) | Java: `...tenant.datasource.max-active-datasources` | boot | `src/config.rs` |
55
+ | `SEEDGRID_MULTITENANCY_TENANT_DB_CIRCUIT_BREAKER_ENABLED` → `tenant_cb_enabled` | `bool` | `false` desliga | `true` | Não | CB em volta da abertura do pool de cada tenant | `src/orchestrator.rs` | **só no Rust** (Java não tem `enabled`) | boot | idem |
56
+ | `SEEDGRID_MULTITENANCY_TENANT_DB_CIRCUIT_BREAKER_FAILURE_RATIO` | `f64` | 0..1 | `0.5` | Não | convertido para % | idem | Java: `...circuit-breaker.failure-ratio` | boot | idem |
57
+ | `SEEDGRID_MULTITENANCY_TENANT_DB_CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD` | `i32` | inteiro | `6` | Não | mínimo de chamadas | idem | Java: `...request-volume-threshold` | boot | idem |
58
+ | `SEEDGRID_MULTITENANCY_TENANT_DB_CIRCUIT_BREAKER_DELAY` → `tenant_cb_delay_secs` | `i64` (s) | duração | `30` | Não | tempo aberto; inválido → 48h | idem | Java: `...delay` (PT30S) | boot | idem |
59
+ | `SEEDGRID_MULTITENANCY_TENANT_DB_CIRCUIT_BREAKER_SUCCESS_THRESHOLD` | `i32` | inteiro | `2` | Não | chamadas permitidas em half-open | idem | Java: `...success-threshold` | boot | idem |
60
+
61
+ ### 2.3 Signup e trial
62
+
63
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
64
+ |---|---|---|---|---|---|---|---|---|---|
65
+ | `SEEDGRID_MULTITENANCY_TRIAL_DAYS` → `trial_days` | `i64` | inteiro | `0` | Não | `> 0` → tenant ativo após validar, com `trial_ends_at`; `0` → billing exigido | `src/service.rs:255,272` | equivalente Java **não encontrado** no commit analisado | boot | `src/config.rs` |
66
+ | `SEEDGRID_MULTITENANCY_OTP_EXPIRY_MINUTES` → `otp_expiry_minutes` | `i64` | inteiro | `10` | Não | validade do OTP de validação de e-mail | `src/service.rs:184` | Java: `seedgrid.subdomain-tenancy.otp-expiry-minutes` (`@ConfigProperty`, default 10) | boot | idem |
67
+
68
+ ### 2.4 Migração por tenant
69
+
70
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
71
+ |---|---|---|---|---|---|---|---|---|---|
72
+ | `SEEDGRID_MULTITENANCY_MIGRATION_ENABLED` → `migration_enabled` | `bool` | `false` desliga | `true` | Não | liga coordinator e gate | `src/platform.rs` | Java: `...migration.enabled` | boot | `src/config.rs` |
73
+ | `SEEDGRID_MULTITENANCY_MIGRATION_TARGET_VERSION` | `String` | — | `v1` | Não | versão-alvo registrada em `tenant_migration_state` | coordinator | Java: `...migration.target-version` | boot | idem |
74
+ | `SEEDGRID_MULTITENANCY_MIGRATION_MAX_CONCURRENCY` | `usize` | inteiro | `3` | Não | migrations de tenant em paralelo | coordinator | Java: `...migration.max-concurrency` | boot | idem |
75
+ | `SEEDGRID_MULTITENANCY_MIGRATION_LOCK_LEASE` → `migration_lock_lease_secs` | `i64` (s) | duração | `600` | Não | lease do lock (heartbeat a cada lease/3) | coordinator | Java: `...migration.lock-lease` (PT10M) | boot | idem |
76
+ | `SEEDGRID_MULTITENANCY_MIGRATION_INSTANCE_ID` | `Option<String>` | — | `None` | Não | id da instância dona do lock | coordinator | Java: `...migration.instance-id` | boot | idem |
77
+ | `SEEDGRID_MULTITENANCY_MIGRATION_TRIGGER_ON_LOGIN` | `bool` | `false` desliga | `true` | Não | gate dispara/bloqueia login enquanto o tenant migra | `src/gate.rs` | Java: `...migration.trigger-on-login` | boot | idem |
78
+ | `SEEDGRID_MULTITENANCY_MIGRATION_LOGIN_PATHS` | `Vec<String>` | CSV | `/auth/login` | Não | paths gateados (`starts_with` **ou** `ends_with`) | `src/gate.rs` | Java: `...migration.login-paths` | boot | idem |
79
+ | `SEEDGRID_MULTITENANCY_MIGRATION_STARTUP_ALL_TENANTS` · fallback `SEEDGRID_MULTITENANCY_MIGRATION_STARTUP_MIGRATE_ALL_TENANTS` | `bool` | só `"true"` liga | `false` | Não | startup migra todos os tenants (senão só master + lazy no login) | `src/platform.rs` (`migrate_startup`) | Java: `...migration.startup-migrate-all-tenants` | boot | idem |
80
+
81
+ ### 2.5 Schedulers
82
+
83
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
84
+ |---|---|---|---|---|---|---|---|---|---|
85
+ | `SEEDGRID_MULTITENANCY_CLEANUP_ENABLED` → `cleanup_enabled` | `bool` | `false` desliga | `true` | Não | gate do spawn do scheduler de cleanup | `src/schedulers.rs:60` | **só no Rust** (Java: `@Scheduled` sempre ativo) | boot | `src/config.rs` |
86
+ | `SEEDGRID_MULTITENANCY_CLEANUP_NOT_VALIDATED_TTL` · fallback `SEEDGRID_MULTITENANCY_CLEAN_NOT_VALIDATED_TTL` | `i64` (s) | duração (`48H`, `PT48H`) | `172800` (48h) | Não | expira tenants não validados | `src/schedulers.rs` | Java: `...cleanup.not-validated-ttl` (48H) | boot | idem |
87
+ | `SEEDGRID_MULTITENANCY_CLEANUP_NOT_VALIDATED_CRON` · fallback `SEEDGRID_MULTITENANCY_CLEAN_NOT_VALIDATED_CRON` | `String` | cron Quartz 6 campos | `0 0 * * * ?` | Não | cron inválido → scheduler não inicia (warn) | `src/schedulers.rs` | Java: `...cleanup.not-validated-cron` | boot | idem |
88
+ | `SEEDGRID_MULTITENANCY_TRIAL_SCHEDULER_ENABLED` | `bool` | `false` desliga | `true` | Não | gate do scheduler de trial | `src/schedulers.rs:155` | só no Rust | boot | idem |
89
+ | `SEEDGRID_MULTITENANCY_TRIAL_CRON` → `trial_cron` | `String` | cron Quartz | `0 10 * * * ?` | Não | processamento de trials expirados | `src/schedulers.rs` | equivalente Java não encontrado no commit analisado | boot | idem |
90
+
91
+ ### 2.6 Seams/struct do host (sem env)
92
+
93
+ | Propriedade | Padrão | Comportamento | Origem |
94
+ |---|---|---|---|
95
+ | `PlatformOverrides.password_encoder` | `SecurityBcryptPasswordEncoder` (delegando a política ao security) | encoder do signup do tenant | `src/orchestrator.rs` |
96
+ | `.business_migrator` | `None` | migrations de negócio por tenant (`TenantBusinessSchemaMigrator`) | idem |
97
+ | `.backup_domain_provider` | `EmptyDomainDatasetProvider` | datasets do backup | idem |
98
+ | `.backup_require_opt_in` | `true` | exige o opt-in `SEEDGRID_BACKUP_ENABLED` (env lida pelo crate backup) | idem |
99
+ | `.run_security_bootstrap` | `true` | bootstrap do primeiro admin no **master** | idem |
100
+ | `.billing_event_handler` / `.user_events` | `None` / no-op | eventos | idem |
101
+ | `HostOverrides` (`TenancyPlatform::assemble`) | encoder BCrypt do security, `LoggingNotificationService`, `DefaultEmailTemplateProvider`, sem migrator, sem auditor | — | `src/platform.rs` |
102
+
103
+ ## 3. Propriedades de frameworks/bibliotecas
104
+
105
+ - O crate não lê `quarkus.*`. O pool **master** é aberto pelo host (`assemble_all(config, Some(master_pool), ...)`).
106
+ - Envs de módulos orquestrados (não pertencem a este crate): security (`SecurityConfig::from_env`, via `SecurityPlatform::assemble`), audit (`AuditConfig::from_env`), backup (`SEEDGRID_BACKUP_ENABLED` e demais), billing (credenciais Stripe). Ver as notas `Configuracao-Rust` de [[SeedGrid/Extensions/security/Configuracao-Rust|security]], [[SeedGrid/Extensions/audit/Configuracao-Rust|audit]], [[SeedGrid/Extensions/backup/Configuracao-Rust|backup]] e [[SeedGrid/Extensions/billing/Configuracao-Rust|billing]].
107
+
108
+ ## 4. Propriedades usadas só em testes e exemplos
109
+
110
+ - `rust/examples/seedgrid-subdomain-tenancy-example` (`main.rs` e `.env.example`): `DATABASE_URL`, `TENANT_URL_PATTERN` (default do exemplo `jdbc:postgresql://localhost:5432/{tenant}`), `TENANT_DB_USER`, `TENANT_DB_PASSWORD`, `EXAMPLE_TENANT`. São lidas pelo **exemplo**, não pelo crate; o exemplo monta os serviços à mão (sem `SubdomainTenancyConfig::from_env`).
111
+ - `tests/db_it.rs` (Testcontainers) e unitários de `src/config.rs` (parse de duração e datasource).
112
+
113
+ ## 5. Aliases, obsoletas, renomeações
114
+
115
+ | Primário lido | Fallback | Observação |
116
+ |---|---|---|
117
+ | `DOMAIN_SUFFIX` | `SEEDGRID_MULTITENANCY_DOMAIN_SUFFIX` | — |
118
+ | `SEEDGRID_MULTITENANCY_MIGRATION_STARTUP_ALL_TENANTS` | `..._MIGRATION_STARTUP_MIGRATE_ALL_TENANTS` | legado do crate |
119
+ | `SEEDGRID_MULTITENANCY_CLEANUP_NOT_VALIDATED_TTL` / `_CRON` | `..._CLEAN_NOT_VALIDATED_TTL` / `_CRON` | legado do crate |
120
+ | `SEEDGRID_MULTITENANCY_TENANT_URL_PATTERN` | — | legado, mas vence `TENANT_DB_URL` |
121
+
122
+ Renomeação do lado Java (não acompanhada pelo crate): `SEEDGRID_MULTITENANCY_*` → `SEEDGRID_SUBDOMAIN_TENANCY_*`.
123
+
124
+ ## 6. Configuração mínima
125
+
126
+ ```dotenv
127
+ DOMAIN_SUFFIX=app.example.com
128
+ PRODUCT_PREFIX=crm
129
+ SEEDGRID_MULTITENANCY_MASTER_DB_URL=jdbc:postgresql://db-host:5432/crm_master
130
+ SEEDGRID_MULTITENANCY_MASTER_DB_USERNAME=<usuario>
131
+ SEEDGRID_MULTITENANCY_MASTER_DB_PASSWORD=<SEGREDO:master-db-password>
132
+ # + chaves RSA do security (SecurityPlatform::assemble só habilita com elas)
133
+ ```
134
+
135
+ ## 7. Configuração completa comentada
136
+
137
+ ```dotenv
138
+ # --- Resolução ---
139
+ DOMAIN_SUFFIX=app.example.com # vazio/ausente = tenancy OFF
140
+ PRODUCT_PREFIX=crm # banco do tenant = crm_<tenant>
141
+ # --- Datasources ---
142
+ SEEDGRID_MULTITENANCY_MASTER_DB_URL=jdbc:postgresql://db-host:5432/crm_master
143
+ SEEDGRID_MULTITENANCY_MASTER_DB_USERNAME=<usuario>
144
+ SEEDGRID_MULTITENANCY_MASTER_DB_PASSWORD=<SEGREDO:master-db-password>
145
+ SEEDGRID_MULTITENANCY_TENANT_DB_URL=jdbc:postgresql://db-host:5432 # /{tenant} é anexado
146
+ SEEDGRID_MULTITENANCY_TENANT_DB_USERNAME=<usuario>
147
+ SEEDGRID_MULTITENANCY_TENANT_DB_PASSWORD=<SEGREDO:tenant-db-password>
148
+ SEEDGRID_MULTITENANCY_TENANT_DB_POOL_MIN=1
149
+ SEEDGRID_MULTITENANCY_TENANT_DB_POOL_MAX=10
150
+ SEEDGRID_MULTITENANCY_TENANT_DB_MAX_ACTIVE_DATASOURCES=200
151
+ SEEDGRID_MULTITENANCY_TENANT_DB_CIRCUIT_BREAKER_ENABLED=true
152
+ SEEDGRID_MULTITENANCY_TENANT_DB_CIRCUIT_BREAKER_FAILURE_RATIO=0.5
153
+ SEEDGRID_MULTITENANCY_TENANT_DB_CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD=6
154
+ SEEDGRID_MULTITENANCY_TENANT_DB_CIRCUIT_BREAKER_DELAY=PT30S
155
+ SEEDGRID_MULTITENANCY_TENANT_DB_CIRCUIT_BREAKER_SUCCESS_THRESHOLD=2
156
+ # --- Signup ---
157
+ SEEDGRID_MULTITENANCY_TRIAL_DAYS=0
158
+ SEEDGRID_MULTITENANCY_OTP_EXPIRY_MINUTES=10
159
+ # --- Migração ---
160
+ SEEDGRID_MULTITENANCY_MIGRATION_ENABLED=true
161
+ SEEDGRID_MULTITENANCY_MIGRATION_TARGET_VERSION=v1
162
+ SEEDGRID_MULTITENANCY_MIGRATION_MAX_CONCURRENCY=3
163
+ SEEDGRID_MULTITENANCY_MIGRATION_LOCK_LEASE=PT10M
164
+ SEEDGRID_MULTITENANCY_MIGRATION_INSTANCE_ID=
165
+ SEEDGRID_MULTITENANCY_MIGRATION_TRIGGER_ON_LOGIN=true
166
+ SEEDGRID_MULTITENANCY_MIGRATION_LOGIN_PATHS=/auth/login
167
+ SEEDGRID_MULTITENANCY_MIGRATION_STARTUP_ALL_TENANTS=false
168
+ # --- Schedulers ---
169
+ SEEDGRID_MULTITENANCY_CLEANUP_ENABLED=true
170
+ SEEDGRID_MULTITENANCY_CLEANUP_NOT_VALIDATED_TTL=48H
171
+ SEEDGRID_MULTITENANCY_CLEANUP_NOT_VALIDATED_CRON=0 0 * * * ?
172
+ SEEDGRID_MULTITENANCY_TRIAL_SCHEDULER_ENABLED=true
173
+ SEEDGRID_MULTITENANCY_TRIAL_CRON=0 10 * * * ?
174
+ ```
175
+
176
+ ## 8. Receitas
177
+
178
+ - **Reaproveitar a URL do master do host:** `let mut cfg = SubdomainTenancyConfig::from_env(); cfg.apply_datasource_env(Some(&postgres_url));` — deriva `host:port` e creds do tenant quando não há `..._TENANT_DB_*` (Confirmado no doc-comment e teste `apply_datasource_env_derives_from_master_fallback_when_no_tenant_env`).
179
+ - **Login atrás de prefixo de API** (`/api/v1/public/auth/login`): `SEEDGRID_MULTITENANCY_MIGRATION_LOGIN_PATHS=/public/auth/login` funciona por causa do `ends_with`.
180
+ - **Migrar todos os tenants no boot:** `SEEDGRID_MULTITENANCY_MIGRATION_STARTUP_ALL_TENANTS=true` (exatamente `true`).
181
+ - **Desligar schedulers numa réplica:** `SEEDGRID_MULTITENANCY_CLEANUP_ENABLED=false` e `SEEDGRID_MULTITENANCY_TRIAL_SCHEDULER_ENABLED=false`.
182
+
183
+ ## 9. Dúvidas e lacunas
184
+
185
+ - Nomes `SEEDGRID_SUBDOMAIN_TENANCY_*` do Java atual não lidos — **Confirmado**.
186
+ - Default diferente do Java: pool do tenant (1/10 × 0/5) — **Confirmado**.
187
+ - Sem equivalente no crate: `tenant.datasource.jdbc.idle-timeout/acquisition-timeout`, `tenant.datasource.cache.*`, `tenant-header`, `*.migrations.location.additional`, `openapi.master-only-paths`, `master/tenant.entity-packages`, `mailer.*`, `admin-user.*` (admin do master vem de `SEEDGRID_SECURITY_FIRST_ADMIN_USER_*`, ) — **Confirmado** por comparação com o `microprofile-config.properties` Java.
188
+ - `trial_days`/`trial_cron`: o Java analisado não tem mais configuração de trial (seção "Trial configuration" vazia) — **Confirmado**; se o trial foi movido ao billing no Java, o crate ainda o mantém — **Inferência**.