@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,121 @@
1
+ ---
2
+ tags: [seedgrid, extension, apikeys, exemplos]
3
+ fonte: java/seedgrid-quarkus-ext-apikeys
4
+ branch: main
5
+ commit: bfc9c25877
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # API Keys (Quarkus) — exemplos
10
+
11
+ Voltar: [[SeedGrid/Extensions/apikeys/Visao-geral|Visão geral do apikeys]] · [[SeedGrid/Extensions/apikeys/Configuracao|Configuração]]
12
+
13
+ ## 1. Dependência
14
+
15
+ Fonte: `runtime/pom.xml` e `README.md`.
16
+
17
+ ```xml
18
+ <dependency>
19
+ <groupId>br.com.seedgrid</groupId>
20
+ <artifactId>seedgrid-apikeys</artifactId>
21
+ <version>2026.10.14</version>
22
+ </dependency>
23
+ ```
24
+
25
+ ## 2. Proteger um endpoint
26
+
27
+ Fonte: `ApiKeyIdentityProvider` adiciona cada permissão da role como `StringPermission`, então o `@PermissionsAllowed` nativo do Quarkus funciona; é o que o `README.md` usa.
28
+
29
+ ```java
30
+ import io.quarkus.security.PermissionsAllowed;
31
+
32
+ @GET
33
+ @Path("/financas/recebiveis")
34
+ @PermissionsAllowed("FINANCAS_LISTAR_RECEBIVEIS")
35
+ public Response listRecebiveis() {
36
+ ...
37
+ }
38
+ ```
39
+
40
+ ## 3. Criar, usar, revogar (HTTP)
41
+
42
+ Fonte: `ApiKeyManagementController`, `README.md`.
43
+
44
+ ```bash
45
+ # Criar (JWT do usuário, permissão APIKEY_CREATE); a role precisa ser de integração
46
+ curl -X POST "http://localhost:8080/apikeys/role/ROTAS_INTEGRACAO" \
47
+ -H "Authorization: Bearer <JWT_DO_USUARIO>" -H "Content-Type: application/json" \
48
+ -d '{"name": "Integracao ERP", "expiresDays": 90}'
49
+ # → 201 { publicId, name, prefix, masked, apiKey: "sgkey_...", expiresAt, createdAt }
50
+
51
+ # Usar (prefira x-api-key)
52
+ curl "http://localhost:8080/financas/recebiveis" -H "x-api-key: <SEGREDO:api-key>"
53
+
54
+ # Roles elegíveis para o combo da tela
55
+ curl "http://localhost:8080/apikeys/roles" -H "Authorization: Bearer <JWT_DO_USUARIO>"
56
+
57
+ # Revogar
58
+ curl -X POST "http://localhost:8080/apikeys/<publicId>/revoke" -H "Authorization: Bearer <JWT_DO_USUARIO>"
59
+ ```
60
+
61
+ `name` é obrigatório (máx. 120); `expiresDays` ≥ 1 ou ausente (sem expiração) — `ApiKeyCreateRequest`.
62
+
63
+ ## 4. Introspecção por serviço externo
64
+
65
+ Fonte: `ApiKeyIntrospectionController`, `README.md` §1.5.
66
+
67
+ ```bash
68
+ curl "https://<tenant>.<sufixo>/apikeys/me" -H "x-api-key: <SEGREDO:api-key>"
69
+ ```
70
+
71
+ ```json
72
+ {
73
+ "publicId": "apk_123", "name": "chave-do-gateway", "prefix": "A1B2C3D4",
74
+ "roleName": "ROTAS_INTEGRACAO", "ownerPublicId": "usr_456",
75
+ "permissions": ["ROTAS_CALCULAR"], "expiresAt": "2026-12-31T23:59:59Z"
76
+ }
77
+ ```
78
+
79
+ `200` = chave válida agora. Quem cacheia deve usar o hash da chave como chave de cache e cachear também negativos (recomendação do README).
80
+
81
+ ## 5. Ler a identidade da API key no código
82
+
83
+ Fonte: `ApiKeyIdentityProvider` (atributos) e `ApiKeyPrincipal`.
84
+
85
+ ```java
86
+ import br.com.seedgrid.apikeys.utils.ApiKeyPrincipal;
87
+ import io.quarkus.security.identity.SecurityIdentity;
88
+
89
+ @Inject SecurityIdentity identity;
90
+
91
+ if (identity.getPrincipal() instanceof ApiKeyPrincipal key) {
92
+ String keyPublicId = key.getApiKeyPublicId();
93
+ String ownerPublicId = key.getOwnerPublicId();
94
+ Long companyId = key.getCompanyId(); // null = chave sem escopo
95
+ }
96
+ String authType = identity.getAttribute("apikey.authType");
97
+ ```
98
+
99
+ ## 6. Desligar a gestão de chaves (SPI)
100
+
101
+ Fonte: `ApiKeyActivationPolicy` / `DefaultApiKeyActivationPolicy` (`@DefaultBean`). Um bean do host substitui o padrão.
102
+
103
+ ```java
104
+ import br.com.seedgrid.apikeys.spis.ApiKeyActivationPolicy;
105
+ import jakarta.enterprise.context.ApplicationScoped;
106
+
107
+ @ApplicationScoped
108
+ public class MinhaPoliticaApiKey implements ApiKeyActivationPolicy {
109
+ @Override public boolean isApiKeyAuthEnabled() { return true; }
110
+ @Override public boolean isApiKeyManagementEnabled() { return false; } // gestão → ApiKeyManagementDisabledException
111
+ }
112
+ ```
113
+
114
+ ## 7. Configuração
115
+
116
+ ```properties
117
+ seedgrid.apikeys.prefix-length=8
118
+ seedgrid.apikeys.key-bytes=32
119
+ ```
120
+
121
+ Detalhes em [[SeedGrid/Extensions/apikeys/Configuracao|Configuração]].
@@ -0,0 +1,126 @@
1
+ ---
2
+ tags: [seedgrid, extension, apikeys, rust]
3
+ fonte: rust/seedgrid-rust-crate-apikeys
4
+ branch: main
5
+ commit: be738a2d1e
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # `seedgrid-rust-crate-apikeys` — porte Rust
10
+
11
+ Lado Java: [[SeedGrid/Extensions/apikeys/Visao-geral|Visão geral do apikeys (Quarkus)]] · [[SeedGrid/Extensions/apikeys/Configuracao|Configuração Java]]
12
+ Configuração deste crate: [[SeedGrid/Extensions/apikeys/Configuracao-Rust|Configuração Rust do apikeys]]
13
+
14
+ ## Objetivo
15
+
16
+ Porte da extensão `seedgrid-quarkus-ext-apikeys`: geração, autenticação e gestão de **API keys** `sgkey_...`, com permissões derivadas da role (habilitada para integração). Crate biblioteca: o host constrói um `ApiKeyState`, monta o `router` e instala o middleware `extract::api_key_auth`. A paridade com o Java é essencialmente 1:1.
17
+
18
+ ## Coordenadas
19
+
20
+ | Item | Valor |
21
+ |---|---|
22
+ | Diretório / pacote / lib | `rust/seedgrid-rust-crate-apikeys` / `seedgrid-rust-crate-apikeys` / `seedgrid_apikeys` |
23
+ | Versão | `version.workspace = true` → `2026.10.14` |
24
+ | Edição / MSRV / licença | 2021 / 1.82 / `LicenseRef-Commercial` |
25
+ | Features | nenhuma |
26
+ | Dependência SeedGrid | `seedgrid-security` (bcrypt `hash_secret`/`verify_secret`, models e schema) |
27
+
28
+ ## Formato da chave (Confirmado em `src/generator.rs` e README)
29
+
30
+ ```
31
+ raw_api_key = "sgkey_" + randomPart
32
+ randomPart = Base64 URL-safe sem padding de key_bytes bytes (OsRng)
33
+ prefix = primeiros prefix_length chars de randomPart (sem "sgkey_")
34
+ key_hash = bcrypt(raw_api_key) # cobre a chave inteira, inclusive "sgkey_"
35
+ masked = prefix + "..."
36
+ ```
37
+
38
+ A chave crua só é devolvida na criação. Geração tenta 5 vezes contra colisão de prefixo.
39
+
40
+ ## API pública
41
+
42
+ | Símbolo | Papel |
43
+ |---|---|
44
+ | `ApiKeysConfig` (+ `from_env`) | ver [[SeedGrid/Extensions/apikeys/Configuracao-Rust\|Configuração Rust]] |
45
+ | `ApiKeyState::builder(pool, config)` → `.policy(...)`, `.security(SecurityState)`, `.build()`; também `from_parts`, `from_parts_with_security` | estado do módulo |
46
+ | `router(ApiKeyState)` | rotas REST |
47
+ | `extract::api_key_auth` | middleware: lê `x-api-key` (trim) ou `Authorization: Bearer sgkey_...`; IP por `X-Forwarded-For` → `X-Real-IP`; injeta `ApiKeyIdentity` e registra uso (best-effort) |
48
+ | `ApiKeyAuthService`, `ApiKeyManagementService`, `ApiKeyIntrospectionService`, `ApiKeyUsageService` | serviços |
49
+ | `ApiKeyGenerator`, `ApiKeyIdentity`/`HumanIdentity`/`ManagementIdentity`/`to_identity` | geração e identidade |
50
+ | `ApiKeyActivationPolicy` / `DefaultApiKeyActivationPolicy` | SPI de ativação (auth/gestão) |
51
+ | `migrate(&PgPool)` / `MIGRATOR` | migrations `0600..0603`, histórico próprio `_sqlx_migrations_apikeys` |
52
+ | `openapi()` | spec utoipa |
53
+
54
+ Ordem de decisão da autenticação: prefixo inválido / não encontrado / hash errado → silencioso (`Ok(None)`); revogada → 401; expirada → 401; sucesso → principal com permissões da role.
55
+
56
+ ## Endpoints (Confirmado em `src/routes.rs`)
57
+
58
+ | Método | Path | Permissão |
59
+ |---|---|---|
60
+ | POST | `/apikeys/role/{roleName}` | `APIKEY_CREATE` (201, única resposta com a chave crua) |
61
+ | GET | `/apikeys/role/{roleName}` | `APIKEY_READ` |
62
+ | GET | `/apikeys?page&size` | `APIKEY_READ` (lista simples ou paginada) |
63
+ | POST | `/apikeys/{publicId}/revoke` | `APIKEY_REVOKE` |
64
+ | GET | `/apikeys/me` | só autenticação por API key (introspecção; sem permissão, fora do toggle de gestão, não devolve e-mail do dono) |
65
+
66
+ ## Exemplo (Confirmado em `src/lib.rs` e README)
67
+
68
+ ```rust
69
+ use seedgrid_apikeys::{router, ApiKeysConfig, ApiKeyState};
70
+ use seedgrid_apikeys::extract::api_key_auth;
71
+
72
+ async fn boot(pool: sqlx::PgPool) -> Result<(), Box<dyn std::error::Error>> {
73
+ seedgrid_security::migrate(&pool).await?; // primeiro (dependência de dados)
74
+ seedgrid_apikeys::migrate(&pool).await?;
75
+ let state = ApiKeyState::builder(pool, ApiKeysConfig::from_env()).build();
76
+ let app = axum::Router::new()
77
+ .merge(router(state.clone()))
78
+ .layer(axum::middleware::from_fn_with_state(state, api_key_auth));
79
+ let _ = app;
80
+ Ok(())
81
+ }
82
+ ```
83
+
84
+ Exemplo executável: `rust/examples/seedgrid-security-apikeys-example`.
85
+
86
+ ## Migrations
87
+
88
+ `0600_create_apikeys_table.sql`, `0601_add_user_snapshot_fields.sql`, `0602_add_permissions.sql` (semeia `APIKEY_CREATE/READ/REVOKE` e vincula à role `ADMIN`, com `ON CONFLICT` extra em relação ao Java), `0603_add_active_to_api_keys_table.sql`. Rodar **depois** de `seedgrid_security::migrate`.
89
+
90
+ > O código usa tabela de histórico própria `_sqlx_migrations_apikeys` (`src/migrations.rs`, `HISTORY_TABLE`). A ordem continua necessária pela dependência de dados.
91
+
92
+ ## Testes
93
+
94
+ `tests/auth_ordering.rs`, `tests/human_auth_management.rs`, `tests/introspection.rs` (sem banco) e `tests/db_flow.rs` (`#[ignore]`, Testcontainers). **Não executados** nesta análise.
95
+
96
+ ## Notas de comportamento
97
+
98
+ - Datas serializadas como `NaiveDateTime` (sem `Z`), não `Instant` como no Java.
99
+ - O registro de uso da chave é best-effort (não bloqueia a requisição).
100
+ - `@ApiKeyAllowed` e `ApiKeySecurityContext` (JAX-RS) não existem; use `ApiKeyIdentity`.
101
+
102
+ ## Enums
103
+
104
+ Equivalentes Java em [[SeedGrid/Extensions/apikeys/Enums|Enums (Quarkus)]].
105
+
106
+ | Enum | Arquivo | Usado em | Equivalente Java |
107
+ |---|---|---|---|
108
+ | `ApiKeyAuthType` | `src/models.rs` | `ApiKeyPrincipal`; atributo `apikey.authType` da identity | [[SeedGrid/Extensions/apikeys/Enums#ApiKeyAuthType\|ApiKeyAuthType]] |
109
+ | `ApiKeyError` | `src/error.rs` | erro de serviços/handlers, resposta RFC 7807 | exceções `ApiKey*Exception` (sem enum) |
110
+ | `ManagementIdentity` | `src/identity.rs` | credencial aceita pelas rotas de gestão | sem equivalente (específico do Rust) |
111
+
112
+ ### ApiKeyAuthType
113
+
114
+ | Variante | `name()` | Observação |
115
+ |---|---|---|
116
+ | `ApiKey` | `API_KEY` | única variante; é o valor do atributo `apikey.authType` da `ApiKeyIdentity`. Não é persistido nem serializado em JSON |
117
+
118
+ Java: `API_KEY`, idêntico (também com um único valor).
119
+
120
+ ### ApiKeyError
121
+
122
+ Mapeamento HTTP (Confirmado em `src/error.rs`): `Unauthorized`, `AuthenticationFailed`, `Expired`, `Revoked` → 401; `NotFound`, `RoleNotFound`, `OwnerNotFound`, `ManagementDisabled` → 404; `RoleNotAllowed`, `Forbidden` → 403; `BadRequest` → 400; `Generation`, `Database`, `Internal` → 500. Mensagens iguais às do Java.
123
+
124
+ ### ManagementIdentity
125
+
126
+ Enum com dados: `ApiKey(ApiKeyIdentity)` ou `Human(HumanIdentity)`. Permite que as rotas `/apikeys*` aceitem API key **ou** JWT humano; expõe `check_permission` e `principal_name`. No Java o `SecurityContext` abstrai a credencial, então não há enum equivalente.
@@ -0,0 +1,111 @@
1
+ ---
2
+ tags: [seedgrid, extension, apikeys]
3
+ fonte: java/seedgrid-quarkus-ext-apikeys
4
+ branch: main
5
+ commit: bfc9c25877
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # API Keys (Quarkus) — visão geral
10
+
11
+ Autenticação por **API key** para integrações máquina-a-máquina. A chave é atrelada a uma **role de integração** (`for_integration`) e herda as permissões dela pelo mesmo RBAC do login JWT; o banco guarda só **hash + prefixo**, com expiração e revogação por chave. A extension também emite, lista e revoga chaves e oferece introspecção (`GET /apikeys/me`).
12
+
13
+ - Configuração: [[SeedGrid/Extensions/apikeys/Configuracao|Configuração do apikeys]]
14
+ - Exemplos: [[SeedGrid/Extensions/apikeys/Exemplos|Exemplos do apikeys]]
15
+ - Enums: [[SeedGrid/Extensions/apikeys/Enums|Enums do apikeys]]
16
+ - Porte Rust (crate `seedgrid-rust-crate-apikeys`): [[SeedGrid/Extensions/apikeys/Rust|Porte Rust]]
17
+
18
+ ## Módulos Maven e coordenadas (Confirmado — `pom.xml`)
19
+
20
+ | Módulo | groupId | artifactId | Versão |
21
+ |---|---|---|---|
22
+ | parent | `br.com.seedgrid` | `seedgrid-apikeys-parent` | `2026.10.14` |
23
+ | runtime | `br.com.seedgrid` | `seedgrid-apikeys` | `2026.10.14` |
24
+ | deployment | `br.com.seedgrid` | `seedgrid-apikeys-deployment` | `2026.10.14` |
25
+ | integration-tests (não publicado) | `br.com.seedgrid` | `seedgrid-apikeys-integration-tests` | `2026.10.14` |
26
+
27
+ Parent: `br.com.seedgrid:seedgrid-parent:2026.07.02`. Status: `preview`.
28
+
29
+ Observações de empacotamento (Confirmado, impacto Não confirmado):
30
+ - O YAML está nomeado `quarkus-extesion.yaml` (grafia incorreta).
31
+
32
+ ## Dependências SeedGrid
33
+
34
+ | Dependência | Versão (runtime) | Uso |
35
+ |---|---|---|
36
+ | `seedgrid-commons` | `2026.08.16` | `CurrentUserProvider`, paginação (`PageReq`/`PageResult`) |
37
+ | `seedgrid-security` | `2026.10.14` | `PasswordService` (hash), `User`/`Role`/`Permission`, `UserRepository`/`RoleRepository`, `CompanyRequestContext`, `PlatformCompanyService` |
38
+ | `seedgrid-security-deployment` (deployment) | `2026.09.25` | — |
39
+
40
+ O README declara: "Requer o `seedgrid-security` no host".
41
+
42
+ ## Arquitetura e fluxo (Confirmado)
43
+
44
+ ```mermaid
45
+ flowchart TB
46
+ REQ["Request com x-api-key<br/>(ou Authorization: Bearer sgkey_...)"] --> MECH[ApiKeyAuthenticationMechanism]
47
+ MECH -->|"ApiKeyActivationPolicy.isApiKeyAuthEnabled()"| AREQ[ApiKeyAuthenticationRequest]
48
+ AREQ --> IDP[ApiKeyIdentityProvider]
49
+ IDP --> AUTH["ApiKeyAuthService.authenticate<br/>prefixo → hash → revogada/expirada → role de integração ativa → membro ativo da empresa"]
50
+ AUTH --> SI["SecurityIdentity<br/>role da key + StringPermission por permissão"]
51
+ SI --> F1["ApiKeyUsageFilter (registra uso/IP)"]
52
+ SI --> F2["ApiKeyCompanyContextFilter (empresa da chave vira a corrente)"]
53
+ F2 --> EP["Endpoint (@PermissionsAllowed)"]
54
+ ```
55
+
56
+ Pontos relevantes:
57
+ - Formato da chave: `sgkey_` + Base64 URL-safe sem padding de `seedgrid.apikeys.key-bytes` bytes aleatórios. O prefixo armazenado são os primeiros `seedgrid.apikeys.prefix-length` caracteres da parte aleatória; a chave crua é hasheada com `PasswordService.encode` e só aparece na resposta de criação. (`ApiKeyGeneratorService`)
58
+ - Header: `x-api-key` é **fixo** (`ApiKeyConstants.APIKEY_HEADER`), não configurável. `Authorization: Bearer` só é aceito se o token começar com `sgkey_`. O README recomenda `x-api-key`, porque com `smallrye-jwt` na classpath os dois mecanismos disputam o `Authorization`.
59
+ - `OPTIONS` não autentica. IP do cliente vem de `X-Forwarded-For` (primeiro valor) ou `X-Real-IP`.
60
+ - Chave revogada → `ApiKeyRevokedException`; expirada → `ApiKeyExpiredException`; role deixou de ser de integração ou foi desativada, ou dono saiu da empresa da chave → falha de autenticação (fail closed).
61
+ - Escopo por empresa (V607): a chave guarda a empresa corrente de quem a criou; ao autenticar, `ApiKeyCompanyContextFilter` (`Priorities.AUTHORIZATION - 9`) fixa essa empresa como única permitida e corrente. Chave sem escopo não toca o contexto.
62
+ - Fora da empresa-plataforma, roles com qualquer permissão de audience `platform` não são elegíveis (`ApiKeyManagementService#listEligibleRoles`).
63
+
64
+ ## API pública
65
+
66
+ ### Endpoints REST (Confirmado — `ApiKeyManagementController`, `ApiKeyIntrospectionController`)
67
+
68
+ | Método | Path | Permissão | Descrição |
69
+ |---|---|---|---|
70
+ | `POST` | `/apikeys/role/{roleName}` | `APIKEY_CREATE` | Cria chave (`{name, expiresDays}`) → `201` com a chave crua |
71
+ | `GET` | `/apikeys/roles` | `APIKEY_CREATE` | Roles de integração elegíveis na empresa corrente |
72
+ | `GET` | `/apikeys/role/{roleName}` | `APIKEY_READ` | Lista chaves do usuário para a role |
73
+ | `GET` | `/apikeys?page=&size=` | `APIKEY_READ` | Lista chaves do usuário (paginada se `page` ou `size` vier; `size` padrão 10) |
74
+ | `POST` | `/apikeys/{publicId}/revoke` | `APIKEY_REVOKE` | Revoga (idempotente) |
75
+ | `GET` | `/apikeys/me` | `@Authenticated`, **só API key** (JWT → 401) | Introspecção: dono (`ownerPublicId`), role, permissões, expiração; sem e-mail do dono |
76
+
77
+ Os endpoints de gestão chamam `ensureManagementEnabled()` (`ApiKeyActivationPolicy#isApiKeyManagementEnabled`); `/apikeys/me` não.
78
+
79
+ ### SPI / beans / anotações
80
+
81
+ | Símbolo | Tipo | Observação |
82
+ |---|---|---|
83
+ | `br.com.seedgrid.apikeys.spis.ApiKeyActivationPolicy` | SPI | `isApiKeyAuthEnabled()`, `isApiKeyManagementEnabled()`; padrão `DefaultApiKeyActivationPolicy` (`@DefaultBean`, ambos `true`). É a forma de "desligar" a extension — não há propriedade para isso. |
84
+ | `ApiKeyAwareCurrentUserProvider` | `CurrentUserProvider` `@Alternative @Priority(1)` | JWT tem precedência; com API key usa `publicId`/e-mail do dono e `apikey:<prefixo>` como nome; sem identidade, sentinelas do security |
85
+ | `ApiKeyIdentityProvider` | `IdentityProvider` | adiciona atributos `apikey.publicId`, `apikey.prefix`, `apikey.ownerId`, `apikey.ownerPublicId`, `apikey.ownerEmail`, `apikey.authType` |
86
+ | `ApiKeyPrincipal` | `Principal` | obtido em `identity.getPrincipal()` |
87
+ | `ApiKeyPermissionService#hasPermission` | bean | utilitário |
88
+
89
+ ### Permissões (migrations)
90
+
91
+ `APIKEY_CREATE`, `APIKEY_READ`, `APIKEY_REVOKE` (V602). V605 marcou `audience='client'`; V606 reverteu para audience nula (visível nos dois escopos).
92
+
93
+ ## Migrations (Confirmado)
94
+
95
+ `runtime/src/main/resources/db/migration/apikeys/V600`–`V607` (tabela `api_keys`, snapshot de usuário, permissões, `active`, timestamps com fuso, audiences, `company_id` com FK condicional para `companies`). Location `classpath:db/migration/apikeys`. Quem roda as migrations é o host ou uma foundation (ex.: [[SeedGrid/Extensions/login-tenancy/Visao-geral|login-tenancy]] usa a tabela de histórico `flyway_schema_history_apikeys`).
96
+
97
+ ## Testes existentes (não executados)
98
+
99
+ | Teste | Cobertura |
100
+ |---|---|
101
+ | `runtime/src/test/.../ApiKeyCompanyScopeTest` | roles elegíveis por audience; escopo por empresa na criação; dono que saiu da empresa; filtro de contexto |
102
+ | `runtime/src/test/.../ApiKeyIdentityProviderPermissionsTest` | permissões como `StringPermission`, atributo `authType`, chave inválida |
103
+ | `runtime/src/test/.../security/ApiKeyAwareCurrentUserProviderTest` | precedência JWT, dono da chave, sentinelas, whatsapp só do JWT |
104
+ | `integration-tests/.../ApiKeyFlowTest` | cria chave e autentica com permissões da role; chave inexistente |
105
+ | `integration-tests/.../ApiKeyIntrospectionTest` | `/apikeys/me`: conteúdo, não vaza chave/hash/e-mail, 401s, revogada, não empresta permissão de gestão |
106
+ | `integration-tests/.../SeedgridApikeysResourceTest`/`IT` | rota sem credencial é barrada |
107
+
108
+ ## Limitações
109
+
110
+ - Nenhuma propriedade liga/desliga a autenticação ou a gestão; isso é feito via bean `ApiKeyActivationPolicy` (Confirmado).
111
+ - Cada request autenticada por API key grava uso em transação `REQUIRES_NEW` (`ApiKeyUsageService#registerUsage`) — custo de escrita por request (Inferência).
@@ -0,0 +1,93 @@
1
+ ---
2
+ tags: [seedgrid, extension, audit, rust, configuracao]
3
+ fonte: rust/seedgrid-rust-crate-audit
4
+ branch: main
5
+ commit: be738a2d1e
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # audit — Configuração Rust
10
+
11
+ Visão do crate: [[SeedGrid/Extensions/audit/Rust|Porte Rust do audit]] · Java: [[SeedGrid/Extensions/audit/Configuracao|Configuração do audit (Java)]].
12
+
13
+ ## Cabeçalho
14
+ | Item | Valor |
15
+ |---|---|
16
+ | Struct | `AuditConfig` (+ `MongoConfig`, `JpaConfig`, enum `AuditPersistenceStrategy`) — `rust/seedgrid-rust-crate-audit/src/config.rs` |
17
+ | Mecanismo | `AuditConfig::from_env()` lê `std::env::var`; ou struct construída pelo host (`AuditConfig::default()` / literal) |
18
+ | Prefixo Java equivalente | `seedgrid.audit` (`@ConfigMapping` em `AuditConfig.java`) |
19
+ | Quem chama `from_env` | `AuditPlatform::assemble` (`src/platform.rs`) e o host (ex.: exemplo `seedgrid-audit-example`) |
20
+ | Leitura | uma vez, quando `from_env()` é chamado (no boot do host); sem recarga |
21
+
22
+ Regras gerais do helper `opt(name)` (`src/config.rs`): valor é `trim()`ado e string vazia vale como ausente. `SEEDGRID_AUDIT_ENABLED` e `AUDIT_STRATEGY` não passam por `opt` (sem trim no `enabled`).
23
+
24
+ ## Variáveis de ambiente
25
+
26
+ ### Ativação e estratégia
27
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
28
+ |---|---|---|---|---|---|---|---|---|---|
29
+ | `SEEDGRID_AUDIT_ENABLED` | bool | `true`/`false` (parse `bool` do Rust, sensível a maiúsculas) | `true` | Não | `false` torna `Auditor::record` no-op e faz `AuditPlatform::assemble` devolver `Ok(None)`. Valor inválido → `true` | liga/desliga auditoria | — | `from_env()` | decl.: `config.rs` → `AuditConfig::from_env`; consumo: `state.rs` (`if !self.config.enabled`), `platform.rs` → `AuditPlatform::assemble` |
30
+ | `AUDIT_STRATEGY` (Java: `seedgrid.audit.persistence.strategy`, via `${AUDIT_STRATEGY:...}`) | enum `AuditPersistenceStrategy` | `JPA`, `POSTGRES`, `POSTGRESQL` → `Jpa`; `MONGODB`, `MONGO` → `Mongodb` (case-insensitive, trim) | derivado da feature: `Jpa` com `postgres` (também quando ambas ou nenhuma); `Mongodb` só com `mongodb` sem `postgres` | Não | valor desconhecido → default da feature. `AuditState::postgres/mongodb` falham (`AuditError::Config`) se a estratégia não casar com o backend | escolhe backend no `AuditPlatform`; valida construtor | `MONGODB` sem a feature `mongodb` → `assemble` loga erro e devolve `Ok(None)` | `from_env()` | `config.rs` → `default_strategy`, `AuditPersistenceStrategy::parse`; `state.rs` → `validate_strategy`; `platform.rs` |
31
+
32
+ ### Relacional (JPA/Postgres)
33
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
34
+ |---|---|---|---|---|---|---|---|---|---|
35
+ | `SEEDGRID_AUDIT_DB_URL` (Java: `seedgrid.audit.jpa.jdbc.url`) | `Option<String>` | `jdbc:postgresql:...`, `postgres://...`, `postgresql://...` | — | Condicional: só se o host usar `pg_connection_url()` | `AuditConfig::pg_connection_url()` remove `jdbc:`; outro formato → `AuditError::Config` | método público; nenhum chamador no workspace | `AuditPlatform` usa o `PgPool` recebido do host | `from_env()` | `config.rs` → `pg_connection_url` |
36
+
37
+ ### MongoDB
38
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
39
+ |---|---|---|---|---|---|---|---|---|---|
40
+ | 🔒 `SEEDGRID_AUDIT_MONGODB_URI` (Java: `seedgrid.audit.mongodb.connection-string`, via `${SEEDGRID_AUDIT_MONGODB_URI:...}`) | `Option<String>` (sempre `Some` após `from_env`) | URI MongoDB | `DEFAULT_MONGODB_URI` = `mongodb://<usuario>:<SEGREDO:mongo-dev>@localhost:27017` (credenciais de dev embutidas, redigidas aqui) | Condicional: estratégia `Mongodb` | URI usada por `effective_mongo_uri()`; falha de conexão → auditoria no-op (`Ok(None)`) | `AuditPlatform::assemble_mongo` | requer feature `mongodb` | `from_env()` | `config.rs` → `DEFAULT_MONGODB_URI`, `effective_mongo_uri`; `platform.rs` |
41
+ | `SEEDGRID_AUDIT_MONGODB_DATABASE` (Java: `seedgrid.audit.mongodb.database`) | `Option<String>` | nome de banco | sem padrão no config; `AuditPlatform` usa `seedgrid_audit` quando ausente | Não | nome do banco Mongo | `AuditPlatform::assemble_mongo` | — | `from_env()` | `config.rs`; `platform.rs` |
42
+
43
+ Mapeamento Java ↔ env: **Confirmado** para `AUDIT_STRATEGY`, `SEEDGRID_AUDIT_DB_URL` e `SEEDGRID_AUDIT_MONGODB_URI` (expressões `${...}` em `java/seedgrid-quarkus-ext-audit/*/runtime/src/main/resources/META-INF/microprofile-config.properties`). `SEEDGRID_AUDIT_MONGODB_DATABASE` corresponde à conversão padrão MicroProfile de `seedgrid.audit.mongodb.database` (**Confirmado** pela regra, sem hífen ambíguo). `SEEDGRID_AUDIT_ENABLED` é uma opção só do Rust.
44
+
45
+ ## Structs (construção pelo host)
46
+ | Campo | Tipo | `Default` | Notas |
47
+ |---|---|---|---|
48
+ | `AuditConfig.enabled` | `bool` | `true` | |
49
+ | `AuditConfig.strategy` | `AuditPersistenceStrategy` | `default_strategy()` | `#[default]` do enum é `Jpa`, mas `AuditConfig::default()` usa `default_strategy()` |
50
+ | `AuditConfig.mongodb` | `MongoConfig { database, connection_string }` | ambos `None` | com `None`, `effective_mongo_uri()` cai no `DEFAULT_MONGODB_URI` |
51
+ | `AuditConfig.jpa.jdbc_url` | `Option<String>` | `None` | usado só por `pg_connection_url()` |
52
+
53
+ ## Features Cargo
54
+ | Feature | Padrão | Efeito |
55
+ |---|---|---|
56
+ | `postgres` | sim | habilita `sqlx`, `postgres.rs`, `migrate`, `MIGRATOR`, `AuditPlatform`, `AuditState::postgres`; muda `default_strategy()` para `Jpa` |
57
+ | `mongodb` | não | habilita `mongodb`/`bson`, `mongodb.rs`, `AuditState::mongodb`; sem `postgres`, `default_strategy()` vira `Mongodb` |
58
+
59
+ ## Configuração não-env (código)
60
+ - Autorização de leitura: `AuditStateBuilder::read_authorizer(...)` — default `DenyAllAuditReadAuthorizer` (403). Não há variável de ambiente.
61
+ - Escopo de leitura, request context e contribuidores: via builder (`src/state.rs`).
62
+
63
+ ## Somente testes / exemplos
64
+ | Variável | Onde | Finalidade |
65
+ |---|---|---|
66
+ | `AUDIT_IT_PG_URL` | `tests/pg_metadata_it.rs` | Postgres para IT `#[ignore]` |
67
+ | `AUDIT_IT_MONGO_URI` | `tests/mongo_metadata_it.rs` | Mongo para IT `#[ignore]` |
68
+ | `DATABASE_URL` | `examples/seedgrid-audit-example/src/main.rs` | conexão do exemplo (lida pelo exemplo, não pela crate) |
69
+ | `DOCKER_HOST`, `TESTCONTAINERS_RYUK_DISABLED` | `.env.example` do exemplo | Testcontainers/Podman |
70
+
71
+ ## Configuração mínima (`.env`)
72
+ ```dotenv
73
+ # Postgres (feature default): a conexão é do host; a crate só precisa disto se quiser desligar
74
+ SEEDGRID_AUDIT_ENABLED=true
75
+ ```
76
+
77
+ ## Configuração completa comentada
78
+ ```dotenv
79
+ SEEDGRID_AUDIT_ENABLED=true # false => Auditor no-op
80
+ AUDIT_STRATEGY=JPA # JPA|POSTGRES|POSTGRESQL|MONGODB|MONGO
81
+ SEEDGRID_AUDIT_DB_URL=jdbc:postgresql://<host>:5432/<db> # só via pg_connection_url()
82
+ # Mongo (feature mongodb + AUDIT_STRATEGY=MONGODB)
83
+ SEEDGRID_AUDIT_MONGODB_URI=mongodb://<usuario>:<SEGREDO:audit-mongo>@<host>:27017
84
+ SEEDGRID_AUDIT_MONGODB_DATABASE=seedgrid_audit
85
+ ```
86
+
87
+ ## Receitas
88
+ - **Postgres (padrão)**: compile com a feature default, crie o `PgPool`, `seedgrid_audit::migrate(&pool)`, `AuditState::postgres(pool, AuditConfig::from_env())?`, registre um `AuditReadAuthorizer` que valide `LOG_READ`.
89
+ - **MongoDB**: `default-features = false, features = ["mongodb"]`, `AUDIT_STRATEGY=MONGODB` (ou deixe o default da feature), `SEEDGRID_AUDIT_MONGODB_URI` e `SEEDGRID_AUDIT_MONGODB_DATABASE`.
90
+ - **Desligar**: `SEEDGRID_AUDIT_ENABLED=false`.
91
+
92
+ ## Dúvidas e lacunas
93
+ - `SEEDGRID_AUDIT_DB_URL` só tem efeito se o host chamar `pg_connection_url()`; `AuditPlatform` e os construtores usam o `PgPool` do host.
@@ -0,0 +1,127 @@
1
+ ---
2
+ tags: [seedgrid, extension, audit, configuracao]
3
+ fonte: java/seedgrid-quarkus-ext-audit
4
+ branch: main
5
+ commit: d5bf32e509
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # SeedGrid Audit — Configuração
10
+
11
+ Voltar: [[SeedGrid/Extensions/audit/Visao-geral|Visão geral do audit]] · [[SeedGrid/Extensions/audit/Exemplos|Exemplos]] · [[SeedGrid/Extensions/audit/Rust|Porte Rust]]
12
+
13
+ ## 1. Cabeçalho
14
+
15
+ | Item | Valor |
16
+ |---|---|
17
+ | Prefixo | `seedgrid.audit` |
18
+ | Classe de config | `seedgrid-quarkus-ext-audit-core/runtime/src/main/java/br/com/seedgrid/audit/core/configs/AuditConfig.java` (`@ConfigMapping(prefix = "seedgrid.audit")`) |
19
+ | Mecanismo | SmallRye `@ConfigMapping` (interfaces aninhadas `Persistence`, `MongoDb`, `Jpa`, `Jpa.Jdbc`) |
20
+ | Fase | Runtime (ConfigMapping em módulo runtime; não há `@ConfigRoot`/`*BuildTimeConfig` nos deployments) |
21
+ | Defaults de módulo | `META-INF/microprofile-config.properties` em `seedgrid-quarkus-ext-audit-postgresql/runtime` e `seedgrid-quarkus-ext-audit-mongodb/runtime` (ordinal 100, sobrescrevível pelo `application.properties` do host) |
22
+ | Outras leituras | Nenhum `@ConfigProperty`, `ConfigProvider.getConfig()` ou `@IfBuildProperty` no repositório audit. Fora dele, `seedgrid-login-tenancy` lê `seedgrid.audit.mongodb.database` via `@ConfigProperty`. **Confirmado** por grep. |
23
+
24
+ Variáveis de ambiente lidas explicitamente pelos `microprofile-config.properties` (expressões `${VAR:default}`): `AUDIT_STRATEGY`, `SEEDGRID_AUDIT_DB_USERNAME`, `SEEDGRID_AUDIT_DB_PASSWORD`, `SEEDGRID_AUDIT_DB_URL`, `SEEDGRID_AUDIT_MONGODB_URI`. Além disso vale a regra MicroProfile padrão (ex.: `SEEDGRID_AUDIT_PERSISTENCE_STRATEGY`), sem ambiguidade para essas chaves.
25
+
26
+ ## 2. Propriedades da extension
27
+
28
+ ### 2.1 Geral e strategy
29
+
30
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
31
+ |---|---|---|---|---|---|---|---|---|---|
32
+ | `seedgrid.audit.persistence.strategy` | enum [[SeedGrid/Extensions/audit/Enums#AuditPersistenceStrategy\|AuditPersistenceStrategy]] | `JPA`, `MONGODB` (conversão case-insensitive, segundo javadoc) | `JPA` (`@WithDefault`); o módulo postgresql define `${AUDIT_STRATEGY:JPA}` e o módulo mongodb `${AUDIT_STRATEGY:MONGODB}` | Não (mas deve corresponder ao módulo de store presente) | Seleciona o `AuditPersistenceProvider` cuja `strategy()` coincide; sem provider correspondente → `IllegalStateException("No audit persistence provider available for strategy ...")` na primeira injeção dos repositórios | `AuditPersistenceRouter#resolveProvider()`; `AuditConfig#isMongo()/isJpa()` | Determina se `seedgrid.audit.jpa.*` ou `seedgrid.audit.mongodb.*` têm efeito (`effective*`) | Runtime | Decl.: `AuditConfig.Persistence#strategy()`; default de módulo: `META-INF/microprofile-config.properties` (postgresql e mongodb) |
33
+
34
+ ### 2.2 JPA / PostgreSQL (`seedgrid.audit.jpa.*`)
35
+
36
+ Só têm efeito com `strategy=JPA` **e** quando não há `EntityManager` CDI resolvível no host (datasource standalone do audit). Com `EntityManager` do host, estas chaves são ignoradas. **Confirmado** (`PostgreSqlAuditPersistenceProvider`).
37
+
38
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
39
+ |---|---|---|---|---|---|---|---|---|---|
40
+ | `seedgrid.audit.jpa.jdbc.url` | `Optional<String>` | URL iniciando com `jdbc:postgresql:` | — (módulo: `${SEEDGRID_AUDIT_DB_URL:}` = vazio) | Condicional: obrigatória com `strategy=JPA` sem `EntityManager` CDI | Vazia → `IllegalStateException("Audit JPA strategy configured but seedgrid.audit.jpa.jdbc.url not set")`; outro esquema → `IllegalArgumentException("Unsupported JDBC URL")`. Usada no `PGSimpleDataSource` do PU standalone `audit-pu` | `PostgreSqlAuditPersistenceProvider#getOrCreateEntityManagerFactory()` via `AuditConfig#effectiveJpaJdbcUrl()` | `username`, `password` | Runtime | Decl.: `AuditConfig.Jpa.Jdbc#url()`; default: `seedgrid-quarkus-ext-audit-postgresql/runtime/.../META-INF/microprofile-config.properties` |
41
+ | `seedgrid.audit.jpa.username` | `Optional<String>` | texto | — (módulo: `${SEEDGRID_AUDIT_DB_USERNAME:}`) | Condicional (conforme o banco) | Usuário do datasource standalone | idem, via `effectiveJpaUsername()` | `jdbc.url` | Runtime | `AuditConfig.Jpa#username()` |
42
+ | 🔒 `seedgrid.audit.jpa.password` | `Optional<String>` | texto | — (módulo: `${SEEDGRID_AUDIT_DB_PASSWORD:}`) | Condicional (conforme o banco) | Senha do datasource standalone | idem, via `effectiveJpaPassword()` | `jdbc.url` | Runtime | `AuditConfig.Jpa#password()` |
43
+
44
+ ### 2.3 MongoDB (`seedgrid.audit.mongodb.*`)
45
+
46
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
47
+ |---|---|---|---|---|---|---|---|---|---|
48
+ | 🔒 `seedgrid.audit.mongodb.connection-string` | `Optional<String>` | connection string MongoDB | — no mapping; o módulo mongodb define `${SEEDGRID_AUDIT_MONGODB_URI:<URI local com credenciais de desenvolvimento>}` (valor não reproduzido aqui) | Condicional: necessária em produção com `strategy=MONGODB` (senão cai no default de desenvolvimento do módulo) | Não é lida por Java; o módulo faz a ponte `quarkus.mongodb.connection-string=${seedgrid.audit.mongodb.connection-string}` | Ponte em `microprofile-config.properties` | `quarkus.mongodb.connection-string` | Runtime | Decl.: `AuditConfig.MongoDb#connectionString()`; ponte: `seedgrid-quarkus-ext-audit-mongodb/runtime/.../META-INF/microprofile-config.properties` |
49
+ | `seedgrid.audit.mongodb.database` | `Optional<String>` | nome de database | — (fallback do producer: `<seedgrid.login-tenancy.app.code>_audit_db`, ou `audit_db`) | Não | Não é lida pelo módulo audit. Só tem efeito quando o `MongoDatabase` vem do `LoginTenancyMongoAuditDatabaseProducer` (seedgrid-login-tenancy, banco único): define o nome do banco de auditoria. Ignorada com `seedgrid-subdomain-tenancy` (`TenantAwareMongoProducer` usa `<product-prefix>_<tenant>_audit_db`) ou com producer próprio da app | `java/seedgrid-quarkus-ext-login-tenancy/runtime/src/main/java/br/com/seedgrid/logintenancy/configs/LoginTenancyMongoAuditDatabaseProducer.java` → `#resolveDatabaseName()` (`@ConfigProperty`) | `seedgrid.login-tenancy.app.code` | Runtime | Decl.: `AuditConfig.MongoDb#database()`; consumo: `LoginTenancyMongoAuditDatabaseProducer#auditDatabase` |
50
+
51
+ Total: **6** propriedades com efeito (`persistence.strategy`, `jpa.jdbc.url`, `jpa.username`, `jpa.password`, `mongodb.connection-string`, `mongodb.database`).
52
+
53
+ ## 3. Propriedades de framework definidas/recomendadas
54
+
55
+ | Propriedade | Valor definido pela extension | Onde | Observação |
56
+ |---|---|---|---|
57
+ | `quarkus.mongodb.connection-string` | `${seedgrid.audit.mongodb.connection-string}` | módulo mongodb `microprofile-config.properties` | Ponte; o host pode sobrescrever |
58
+ | `quarkus.flyway.locations` | `classpath:db/migration/audit` | módulo postgresql | **Atenção (Inferência):** por ser chave global do Flyway default, pode conflitar com as migrations do host se o host não a sobrescrever/compor |
59
+ | `quarkus.flyway.table` | `flyway_schema_history_audit` | módulo postgresql | idem |
60
+ | `quarkus.flyway.baseline-on-migrate` | `true` | módulo postgresql | — |
61
+ | `quarkus.swagger-ui.path` | `/swagger-ui` | módulo postgresql | — |
62
+ | `quarkus.swagger-ui.always-include` | `true` | módulo postgresql | — |
63
+ | Permissão `LOG_READ` | — | `AuditLogController` | Não é propriedade; o host deve mapear a permissão (ex.: via security) |
64
+
65
+ ## 4. Propriedades de testes
66
+
67
+ Nenhuma. Os testes (`*IT`, `AuditMaskingTest`) configuram Testcontainers programaticamente; não há `application.properties` de teste. **Confirmado**.
68
+
69
+ ## 5. Aliases, obsoletas, renomeações
70
+
71
+ - Não há aliases nem renomeações em código.
72
+ - Variáveis de ambiente `AUDIT_STRATEGY` e `SEEDGRID_AUDIT_*` funcionam como "aliases" via expressão nos `microprofile-config.properties`.
73
+
74
+ ## 6. Configuração mínima
75
+
76
+ PostgreSQL usando o datasource/`EntityManager` do host:
77
+ ```properties
78
+ seedgrid.audit.persistence.strategy=JPA
79
+ ```
80
+
81
+ PostgreSQL sem `EntityManager` CDI (standalone):
82
+ ```properties
83
+ seedgrid.audit.persistence.strategy=JPA
84
+ seedgrid.audit.jpa.jdbc.url=jdbc:postgresql://<host>:5432/<database>
85
+ seedgrid.audit.jpa.username=<usuario>
86
+ seedgrid.audit.jpa.password=<SEGREDO:audit-db-password>
87
+ ```
88
+
89
+ MongoDB:
90
+ ```properties
91
+ seedgrid.audit.persistence.strategy=MONGODB
92
+ seedgrid.audit.mongodb.connection-string=<SEGREDO:audit-mongodb-uri>
93
+ ```
94
+
95
+ ## 7. Configuração completa comentada
96
+
97
+ ```properties
98
+ # JPA (padrão) ou MONGODB — deve corresponder ao módulo de store no classpath.
99
+ seedgrid.audit.persistence.strategy=JPA
100
+
101
+ # --- JPA standalone (só usado quando não há EntityManager CDI no host) ---
102
+ seedgrid.audit.jpa.jdbc.url=jdbc:postgresql://<host>:5432/<database>
103
+ seedgrid.audit.jpa.username=<usuario>
104
+ seedgrid.audit.jpa.password=<SEGREDO:audit-db-password>
105
+
106
+ # --- MongoDB ---
107
+ # Repassada para quarkus.mongodb.connection-string pelo módulo mongodb.
108
+ #seedgrid.audit.mongodb.connection-string=<SEGREDO:audit-mongodb-uri>
109
+ # Só com seedgrid-login-tenancy (producer de banco único): nome do banco de auditoria.
110
+ #seedgrid.audit.mongodb.database=<database>
111
+
112
+ # --- Framework (já definidas pelo módulo postgresql; sobrescreva se o host tiver migrations próprias) ---
113
+ #quarkus.flyway.locations=classpath:db/migration/audit
114
+ #quarkus.flyway.table=flyway_schema_history_audit
115
+ #quarkus.flyway.baseline-on-migrate=true
116
+ ```
117
+
118
+ ## 8. Receitas
119
+
120
+ - **Usar o banco do próprio host (JPA):** inclua `seedgrid-audit-postgresql`; mantenha `strategy=JPA`. Com `quarkus-hibernate-orm` ativo o provider usa o `EntityManager` CDI. Garanta que as migrations `db/migration/audit` (V300–V303) sejam aplicadas — revise `quarkus.flyway.locations` para combinar com as do host.
121
+ - **Banco de auditoria separado (JPA standalone):** sem `EntityManager` CDI resolvível, informe `seedgrid.audit.jpa.jdbc.url/username/password` (ou `SEEDGRID_AUDIT_DB_URL/USERNAME/PASSWORD`).
122
+ - **MongoDB:** inclua `seedgrid-audit-mongodb`, defina `SEEDGRID_AUDIT_MONGODB_URI` (ou a propriedade) e garanta um producer de `MongoDatabase`: a extension não o produz; `seedgrid-login-tenancy` (banco único, nome via `seedgrid.audit.mongodb.database`) e `seedgrid-subdomain-tenancy` (banco por tenant) produzem um `@DefaultBean`.
123
+ - **Isolamento de leitura por tenant/company:** não é por propriedade; implemente `AuditReadScopeProvider` (ver [[SeedGrid/Extensions/audit/Exemplos|Exemplos]]).
124
+
125
+ ## 9. Dúvidas e lacunas
126
+ - Comportamento quando os dois módulos de store estão no classpath (dois defaults conflitantes para `strategy`). **Não confirmado**.
127
+ - Os `quarkus.flyway.*` globais definidos pelo módulo postgresql podem interferir com o Flyway do host. **Inferência**.