@seedgrid/ai-toolkit 0.0.0-stage → 0.3.1

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 (226) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -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 +209 -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/selfinstall.js +63 -0
  16. package/dist/commands/status.js +73 -0
  17. package/dist/commands/update.js +8 -0
  18. package/dist/commands/validate.js +27 -0
  19. package/dist/core/apply.js +181 -0
  20. package/dist/core/blocks.js +64 -0
  21. package/dist/core/content.js +528 -0
  22. package/dist/core/env.js +40 -0
  23. package/dist/core/frontmatter.js +29 -0
  24. package/dist/core/hash.js +14 -0
  25. package/dist/core/inspect.js +51 -0
  26. package/dist/core/lock.js +124 -0
  27. package/dist/core/paths.js +65 -0
  28. package/dist/core/plan.js +242 -0
  29. package/dist/core/tools.js +62 -0
  30. package/dist/core/types.js +11 -0
  31. package/dist/core/updates.js +121 -0
  32. package/docs/arquitetura.md +80 -0
  33. package/docs/compatibilidade.md +50 -0
  34. package/docs/formato.md +155 -0
  35. package/docs/instalacao.md +105 -0
  36. package/docs/manutencao.md +115 -0
  37. package/package.json +43 -4
  38. package/seedgridKB/SeedGrid/Extensions/Catalogo-de-enums.md +161 -0
  39. package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +971 -0
  40. package/seedgridKB/SeedGrid/Extensions/Indice.md +63 -0
  41. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +124 -0
  42. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Enums.md +40 -0
  43. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +97 -0
  44. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +114 -0
  45. package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao-Rust.md +69 -0
  46. package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao.md +88 -0
  47. package/seedgridKB/SeedGrid/Extensions/apikeys/Enums.md +33 -0
  48. package/seedgridKB/SeedGrid/Extensions/apikeys/Exemplos.md +121 -0
  49. package/seedgridKB/SeedGrid/Extensions/apikeys/Rust.md +126 -0
  50. package/seedgridKB/SeedGrid/Extensions/apikeys/Visao-geral.md +111 -0
  51. package/seedgridKB/SeedGrid/Extensions/audit/Configuracao-Rust.md +93 -0
  52. package/seedgridKB/SeedGrid/Extensions/audit/Configuracao.md +127 -0
  53. package/seedgridKB/SeedGrid/Extensions/audit/Enums.md +66 -0
  54. package/seedgridKB/SeedGrid/Extensions/audit/Exemplos.md +151 -0
  55. package/seedgridKB/SeedGrid/Extensions/audit/Rust.md +120 -0
  56. package/seedgridKB/SeedGrid/Extensions/audit/Visao-geral.md +114 -0
  57. package/seedgridKB/SeedGrid/Extensions/backup/Configuracao-Rust.md +136 -0
  58. package/seedgridKB/SeedGrid/Extensions/backup/Configuracao.md +319 -0
  59. package/seedgridKB/SeedGrid/Extensions/backup/Enums.md +131 -0
  60. package/seedgridKB/SeedGrid/Extensions/backup/Exemplos.md +210 -0
  61. package/seedgridKB/SeedGrid/Extensions/backup/Rust.md +135 -0
  62. package/seedgridKB/SeedGrid/Extensions/backup/Visao-geral.md +150 -0
  63. package/seedgridKB/SeedGrid/Extensions/billing/Configuracao-Rust.md +86 -0
  64. package/seedgridKB/SeedGrid/Extensions/billing/Configuracao.md +243 -0
  65. package/seedgridKB/SeedGrid/Extensions/billing/Enums.md +165 -0
  66. package/seedgridKB/SeedGrid/Extensions/billing/Exemplos.md +205 -0
  67. package/seedgridKB/SeedGrid/Extensions/billing/Rust.md +109 -0
  68. package/seedgridKB/SeedGrid/Extensions/billing/Visao-geral.md +181 -0
  69. package/seedgridKB/SeedGrid/Extensions/broker/Configuracao-Rust.md +40 -0
  70. package/seedgridKB/SeedGrid/Extensions/broker/Visao-geral.md +114 -0
  71. package/seedgridKB/SeedGrid/Extensions/cache/Configuracao-Rust.md +73 -0
  72. package/seedgridKB/SeedGrid/Extensions/cache/Configuracao.md +112 -0
  73. package/seedgridKB/SeedGrid/Extensions/cache/Enums.md +36 -0
  74. package/seedgridKB/SeedGrid/Extensions/cache/Exemplos.md +149 -0
  75. package/seedgridKB/SeedGrid/Extensions/cache/Rust.md +81 -0
  76. package/seedgridKB/SeedGrid/Extensions/cache/Visao-geral.md +90 -0
  77. package/seedgridKB/SeedGrid/Extensions/commons/Configuracao.md +107 -0
  78. package/seedgridKB/SeedGrid/Extensions/commons/Enums.md +105 -0
  79. package/seedgridKB/SeedGrid/Extensions/commons/Exemplos.md +141 -0
  80. package/seedgridKB/SeedGrid/Extensions/commons/Visao-geral.md +99 -0
  81. package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +122 -0
  82. package/seedgridKB/SeedGrid/Extensions/exchange/Enums.md +29 -0
  83. package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +82 -0
  84. package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +118 -0
  85. package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao-Rust.md +110 -0
  86. package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao.md +157 -0
  87. package/seedgridKB/SeedGrid/Extensions/filemanagement/Exemplos.md +157 -0
  88. package/seedgridKB/SeedGrid/Extensions/filemanagement/Rust.md +70 -0
  89. package/seedgridKB/SeedGrid/Extensions/filemanagement/Visao-geral.md +88 -0
  90. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao-Rust.md +124 -0
  91. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +195 -0
  92. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Enums.md +71 -0
  93. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Exemplos.md +149 -0
  94. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Rust.md +139 -0
  95. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +130 -0
  96. package/seedgridKB/SeedGrid/Extensions/notification/Configuracao.md +141 -0
  97. package/seedgridKB/SeedGrid/Extensions/notification/Enums.md +52 -0
  98. package/seedgridKB/SeedGrid/Extensions/notification/Exemplos.md +141 -0
  99. package/seedgridKB/SeedGrid/Extensions/notification/Visao-geral.md +113 -0
  100. package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao-Rust.md +67 -0
  101. package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao.md +94 -0
  102. package/seedgridKB/SeedGrid/Extensions/privacy/Enums.md +79 -0
  103. package/seedgridKB/SeedGrid/Extensions/privacy/Exemplos.md +172 -0
  104. package/seedgridKB/SeedGrid/Extensions/privacy/Rust.md +107 -0
  105. package/seedgridKB/SeedGrid/Extensions/privacy/Visao-geral.md +90 -0
  106. package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao-Rust.md +72 -0
  107. package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao.md +104 -0
  108. package/seedgridKB/SeedGrid/Extensions/realtime/Exemplos.md +104 -0
  109. package/seedgridKB/SeedGrid/Extensions/realtime/Rust.md +69 -0
  110. package/seedgridKB/SeedGrid/Extensions/realtime/Visao-geral.md +105 -0
  111. package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao-Rust.md +68 -0
  112. package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao.md +186 -0
  113. package/seedgridKB/SeedGrid/Extensions/resilience/Enums.md +96 -0
  114. package/seedgridKB/SeedGrid/Extensions/resilience/Exemplos.md +229 -0
  115. package/seedgridKB/SeedGrid/Extensions/resilience/Rust.md +80 -0
  116. package/seedgridKB/SeedGrid/Extensions/resilience/Visao-geral.md +112 -0
  117. package/seedgridKB/SeedGrid/Extensions/runtime/Configuracao-Rust.md +90 -0
  118. package/seedgridKB/SeedGrid/Extensions/runtime/Visao-geral.md +114 -0
  119. package/seedgridKB/SeedGrid/Extensions/security/Configuracao-Rust.md +327 -0
  120. package/seedgridKB/SeedGrid/Extensions/security/Configuracao.md +510 -0
  121. package/seedgridKB/SeedGrid/Extensions/security/Enums.md +95 -0
  122. package/seedgridKB/SeedGrid/Extensions/security/Exemplos.md +218 -0
  123. package/seedgridKB/SeedGrid/Extensions/security/Rust.md +203 -0
  124. package/seedgridKB/SeedGrid/Extensions/security/Visao-geral.md +131 -0
  125. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao-Rust.md +188 -0
  126. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +345 -0
  127. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Enums.md +117 -0
  128. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Exemplos.md +205 -0
  129. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Rust.md +161 -0
  130. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +142 -0
  131. package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao-Rust.md +75 -0
  132. package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao.md +152 -0
  133. package/seedgridKB/SeedGrid/Extensions/whatsapp/Enums.md +198 -0
  134. package/seedgridKB/SeedGrid/Extensions/whatsapp/Exemplos.md +173 -0
  135. package/seedgridKB/SeedGrid/Extensions/whatsapp/Rust.md +83 -0
  136. package/seedgridKB/SeedGrid/Extensions/whatsapp/Visao-geral.md +99 -0
  137. package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +112 -0
  138. package/seedgridKB/SeedGrid/SeedGrid-components/Indice.md +323 -0
  139. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/API.md +257 -0
  140. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Exemplos.md +307 -0
  141. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Visao-geral.md +51 -0
  142. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/API.md +174 -0
  143. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Exemplos.md +236 -0
  144. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Visao-geral.md +76 -0
  145. package/seedgridKB/SeedGrid/SeedGrid-components/digits/API.md +339 -0
  146. package/seedgridKB/SeedGrid/SeedGrid-components/digits/Exemplos.md +311 -0
  147. package/seedgridKB/SeedGrid/SeedGrid-components/digits/Visao-geral.md +57 -0
  148. package/seedgridKB/SeedGrid/SeedGrid-components/editor/API.md +125 -0
  149. package/seedgridKB/SeedGrid/SeedGrid-components/editor/Exemplos.md +116 -0
  150. package/seedgridKB/SeedGrid/SeedGrid-components/editor/Visao-geral.md +86 -0
  151. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/API.md +490 -0
  152. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Exemplos.md +544 -0
  153. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Visao-geral.md +69 -0
  154. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/API.md +113 -0
  155. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Exemplos.md +159 -0
  156. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Visao-geral.md +92 -0
  157. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/API.md +516 -0
  158. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Exemplos.md +629 -0
  159. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Visao-geral.md +80 -0
  160. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/API.md +615 -0
  161. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Exemplos.md +384 -0
  162. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral.md +111 -0
  163. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/API.md +661 -0
  164. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Exemplos.md +312 -0
  165. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Visao-geral.md +123 -0
  166. package/seedgridKB/SeedGrid/SeedGrid-components/layout/API.md +1090 -0
  167. package/seedgridKB/SeedGrid/SeedGrid-components/layout/Exemplos.md +1172 -0
  168. package/seedgridKB/SeedGrid/SeedGrid-components/layout/Visao-geral.md +98 -0
  169. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/Visao-geral.md +98 -0
  170. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-apikeys.md +118 -0
  171. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-audit.md +88 -0
  172. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-backup.md +131 -0
  173. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-platform.md +132 -0
  174. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-user.md +120 -0
  175. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-login-tenancy.md +119 -0
  176. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-security.md +427 -0
  177. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-self-enter.md +104 -0
  178. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-subdomain-tenancy.md +110 -0
  179. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/API.md +490 -0
  180. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Exemplos.md +561 -0
  181. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Visao-geral.md +82 -0
  182. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/Visao-geral.md +68 -0
  183. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-commons.md +61 -0
  184. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-core.md +140 -0
  185. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-playground.md +112 -0
  186. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-theme.md +97 -0
  187. package/seedgridKB/SeedGrid/SeedGrid-components/providers/API.md +177 -0
  188. package/seedgridKB/SeedGrid/SeedGrid-components/providers/Exemplos.md +332 -0
  189. package/seedgridKB/SeedGrid/SeedGrid-components/providers/Visao-geral.md +106 -0
  190. package/seedgridKB/SeedGrid/SeedGrid-components/showcase.md +70 -0
  191. package/seedgridKB/SeedGrid/Toolkit/agents/arquiteto.md +53 -0
  192. package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +45 -0
  193. package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +43 -0
  194. package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +41 -0
  195. package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +44 -0
  196. package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +40 -0
  197. package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +78 -0
  198. package/seedgridKB/SeedGrid/Toolkit/references/glossario.md +15 -0
  199. package/seedgridKB/SeedGrid/Toolkit/references/modos-shared-native.md +27 -0
  200. package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +54 -0
  201. package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +39 -0
  202. package/seedgridKB/SeedGrid/Toolkit/rules/formato-entrega.md +29 -0
  203. package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +47 -0
  204. package/seedgridKB/SeedGrid/Toolkit/rules/personalizacao-local.md +22 -0
  205. package/seedgridKB/SeedGrid/Toolkit/skills/planejar-mudanca/SKILL.md +38 -0
  206. package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/SKILL.md +33 -0
  207. package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/references/checklist.md +25 -0
  208. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-backend-crud/SKILL.md +29 -0
  209. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-bump/SKILL.md +26 -0
  210. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/SKILL.md +221 -0
  211. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/agents/openai.yaml +4 -0
  212. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/checklist.md +31 -0
  213. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/patterns.md +185 -0
  214. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/routing.md +66 -0
  215. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/SKILL.md +56 -0
  216. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +4 -0
  217. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/checklist.md +32 -0
  218. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/steps.md +114 -0
  219. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-review/SKILL.md +61 -0
  220. package/seedgridKB/SeedGrid/Toolkit/skills/validar-mudanca/SKILL.md +29 -0
  221. package/seedgridKB/SeedGrid/Toolkit/templates/decisao-arquitetura.md +29 -0
  222. package/seedgridKB/SeedGrid/Toolkit/templates/especificacao-tarefa.md +32 -0
  223. package/seedgridKB/SeedGrid/Toolkit/templates/relatorio-validacao.md +30 -0
  224. package/seedgridKB/SeedGrid/Versoes.md +64 -0
  225. package/seedgridKB/SeedGrid/Visao-geral.md +35 -0
  226. package/seedgridKB/manifest.json +142 -0
@@ -0,0 +1,66 @@
1
+ ---
2
+ tags: [seedgrid, extension, audit, enum]
3
+ fonte: java/seedgrid-quarkus-ext-audit
4
+ branch: main
5
+ commit: d5bf32e509
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # SeedGrid Audit — Enums
10
+
11
+ Voltar: [[SeedGrid/Extensions/audit/Visao-geral|Visão geral do audit]] · [[SeedGrid/Extensions/audit/Configuracao|Configuração]] · [[SeedGrid/Extensions/audit/Rust|Porte Rust]]
12
+
13
+ ## Índice
14
+
15
+ | Enum | Pacote/arquivo | Usado em | Público? |
16
+ |---|---|---|---|
17
+ | [[#AuditOperationEnum]] | `seedgrid-quarkus-ext-audit-core/runtime/src/main/java/br/com/seedgrid/audit/core/enums/AuditOperationEnum.java` | `@Audit(operation)`, `AuditLog.operation`, query param `operation` de `GET /audit-logs`, coluna `audit_log.operation`, campo Mongo `operation` | Sim |
18
+ | [[#AuditPersistenceStrategy]] | `seedgrid-quarkus-ext-audit-core/runtime/src/main/java/br/com/seedgrid/audit/core/configs/AuditPersistenceStrategy.java` | propriedade `seedgrid.audit.persistence.strategy`, SPI `AuditPersistenceProvider#strategy()` | Sim |
19
+
20
+ ## AuditOperationEnum
21
+
22
+ FQN: `br.com.seedgrid.audit.core.enums.AuditOperationEnum`. Sem campos, construtor ou métodos próprios.
23
+
24
+ | Valor | Significado | Efeito / onde é tratado | Observações |
25
+ |---|---|---|---|
26
+ | `CREATE` | Criação de entidade | `AuditInterceptor#around`: captura só o estado **depois** (`afterState`), a partir do retorno ou de um novo lookup. **Confirmado** | — |
27
+ | `UPDATE` | Alteração de entidade | Captura **antes** (lookup antes de `proceed()`) e **depois**. **Confirmado** | — |
28
+ | `DELETE` | Exclusão de entidade | Captura só o estado **antes**. **Confirmado** | — |
29
+ | `READ` | Leitura/consulta | Nenhum tratamento específico: registra o evento sem before/after. **Confirmado** | — |
30
+ | `OTHER` | Operação genérica | Igual a `READ` (sem before/after). É o **padrão** de `@Audit(operation)`. **Confirmado** | — |
31
+
32
+ Comportamento comum: quando `@Audit(description)` está vazia, a descrição gravada é `operation.name()` (ex.: `UPDATE`). **Confirmado** (`AuditInterceptor#around`).
33
+
34
+ Serialização:
35
+ - JSON (respostas de `/audit-logs`): nome da constante (Jackson padrão; sem `@JsonValue`). **Inferência** (nenhuma anotação Jackson no enum).
36
+ - Query param `operation` em `GET /audit-logs`: convertido pelo JAX-RS pelo nome exato (`valueOf`), portanto case-sensitive; valor inválido falha a conversão do parâmetro. **Inferência** (comportamento padrão do JAX-RS; sem `ParamConverter` próprio).
37
+ - PostgreSQL: `@Enumerated(EnumType.STRING)` em `AuditLogEntity#operation`; coluna `operation VARCHAR(50)` (V300) **sem CHECK constraint** — o banco aceita qualquer texto, mas a aplicação só grava as 5 constantes. **Confirmado**.
38
+ - MongoDB: campo `operation` do documento `MongoAuditLogDocument` (coleção `audit_logs`), gravado pelo codec POJO como o nome da constante. **Inferência** (sem codec próprio no módulo).
39
+
40
+ Onde é usado: anotação `@Audit` ([[SeedGrid/Extensions/audit/Exemplos|Exemplos]]), filtro `AuditFilter#operation` (JPQL/Criteria em `JpaAuditRepositoryImpl`, filtro Mongo em `MongoAuditLogRepositoryImpl`), índice `idx_audit_log_operation_date`.
41
+
42
+ ## AuditPersistenceStrategy
43
+
44
+ FQN: `br.com.seedgrid.audit.core.configs.AuditPersistenceStrategy`. Sem campos/métodos próprios; `AuditConfig#isMongo()/isJpa()` comparam com as constantes.
45
+
46
+ | Valor | Significado | Efeito / onde é tratado | Observações |
47
+ |---|---|---|---|
48
+ | `MONGODB` | Persistência documental no MongoDB | `AuditPersistenceRouter#resolveProvider()` escolhe o provider com `strategy() == MONGODB` (`MongoAuditPersistenceProvider`, módulo `seedgrid-audit-mongodb`). **Confirmado** | Default do módulo mongodb: `${AUDIT_STRATEGY:MONGODB}` |
49
+ | `JPA` | Persistência relacional (PostgreSQL) via Hibernate/JPA | Escolhe `PostgreSqlAuditPersistenceProvider` (módulo `seedgrid-audit-postgresql`); habilita `seedgrid.audit.jpa.*` (`AuditConfig#effectiveJpa*`). **Confirmado** | `@WithDefault("JPA")`; default do módulo postgresql: `${AUDIT_STRATEGY:JPA}` |
50
+
51
+ Se nenhum `AuditPersistenceProvider` do classpath retornar o valor configurado → `IllegalStateException("No audit persistence provider available for strategy ...")` na primeira injeção dos repositórios. **Confirmado**.
52
+
53
+ Leitura da config: conversor de enum do SmallRye Config; o javadoc do código afirma que é case-insensitive (`jpa` aceito), com constantes canônicas `JPA` e `MONGODB`. **Confirmado** (javadoc de `AuditConfig.Persistence#strategy` e do enum). Não é persistido nem serializado em JSON.
54
+
55
+ Onde é usado: [[SeedGrid/Extensions/audit/Configuracao|`seedgrid.audit.persistence.strategy`]]; SPI `AuditPersistenceProvider#strategy()`.
56
+
57
+ ## Internos
58
+
59
+ | Enum | Arquivo |
60
+ |---|---|
61
+ | `AuditInterceptor.LookupType` (`NONE`, `BY_METHOD`, `BY_FIELDS`, `BY_ID`) | `seedgrid-quarkus-ext-audit-core/runtime/src/main/java/br/com/seedgrid/audit/core/interceptors/AuditInterceptor.java` |
62
+
63
+ ## Comparação com o porte Rust (informativo)
64
+
65
+ - `AuditOperationEnum` ↔ `AuditOperation` (`rust/seedgrid-rust-crate-audit/src/models.rs`, `#[serde(rename_all = "UPPERCASE")]`): mesmos 5 valores, mesma grafia.
66
+ - `AuditPersistenceStrategy` ↔ `AuditPersistenceStrategy` (`rust/seedgrid-rust-crate-audit/src/config.rs`, variantes `Jpa`/`Mongodb`): o `parse` do Rust também aceita os aliases `POSTGRES`, `POSTGRESQL` e `MONGO`, que o Java não aceita.
@@ -0,0 +1,151 @@
1
+ ---
2
+ tags: [seedgrid, extension, audit, exemplos]
3
+ fonte: java/seedgrid-quarkus-ext-audit
4
+ branch: main
5
+ commit: d5bf32e509
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # SeedGrid Audit — Exemplos
10
+
11
+ Voltar: [[SeedGrid/Extensions/audit/Visao-geral|Visão geral do audit]] · [[SeedGrid/Extensions/audit/Configuracao|Configuração do audit]]
12
+
13
+ Fontes: `java/seedgrid-quarkus-ext-audit/README.md` (seção "Como usar"), assinaturas em `seedgrid-quarkus-ext-audit-core/runtime/src/main/java/br/com/seedgrid/audit/core/**`. Configuração de propriedades: ver a nota de Configuração (não repetida aqui).
14
+
15
+ ## 1. Dependência Maven (strategy JPA)
16
+
17
+ ```xml
18
+ <dependency>
19
+ <groupId>br.com.seedgrid</groupId>
20
+ <artifactId>seedgrid-audit-postgresql</artifactId>
21
+ <version>2026.09.25</version>
22
+ </dependency>
23
+ ```
24
+ Para MongoDB troque por `seedgrid-audit-mongodb`. Versão conforme pom no commit analisado.
25
+
26
+ ## 2. Auditar CREATE/UPDATE (README)
27
+
28
+ ```java
29
+ import br.com.seedgrid.audit.core.annotations.Audit;
30
+ import br.com.seedgrid.audit.core.enums.AuditOperationEnum;
31
+
32
+ @ApplicationScoped
33
+ public class UserService {
34
+
35
+ @Transactional
36
+ @Audit(entityFqcn = "br.com.seuapp.entities.User",
37
+ operation = AuditOperationEnum.CREATE,
38
+ description = "Cria novo usuário")
39
+ public User createUser(User user) {
40
+ return user; // estado "depois" capturado após proceed()
41
+ }
42
+
43
+ @Transactional
44
+ @Audit(entityFqcn = "br.com.seuapp.entities.User",
45
+ operation = AuditOperationEnum.UPDATE,
46
+ description = "Atualiza usuário")
47
+ public User updateUser(Long id, User user) { // antes (lookup por @Id Long) + depois
48
+ return user;
49
+ }
50
+ }
51
+ ```
52
+ O repository usado no lookup é derivado: `br.com.seuapp.entities.User` → `br.com.seuapp.repositories.UserRepository` (precisa expor `findByIdOptional`, ou `find(String, Object...)` para lookups por campo).
53
+
54
+ ## 3. Lookup explícito
55
+
56
+ ```java
57
+ // Por método do repository
58
+ @Audit(entityFqcn = "br.com.seuapp.entities.LegacyPerson",
59
+ operation = AuditOperationEnum.READ,
60
+ lookupMethod = "findByDocument")
61
+ public LegacyPerson findByDocument(String document) { ... }
62
+
63
+ // Por campos, na ordem dos argumentos: "tenantId = ?1 and publicId = ?2"
64
+ @Audit(entityFqcn = "br.com.seuapp.entities.Customer",
65
+ operation = AuditOperationEnum.UPDATE,
66
+ lookups = { @AuditLookup(field = "tenantId"), @AuditLookup(field = "publicId") })
67
+ public Customer update(String tenantId, String publicId, Customer input) { ... }
68
+ ```
69
+ Usar `lookupMethod` e `lookups` juntos falha o build (`AuditProcessor`).
70
+
71
+ ## 4. Mascaramento (delegado ao seedgrid-privacy)
72
+
73
+ ```java
74
+ import br.com.seedgrid.privacy.masking.MaskRule;
75
+ import br.com.seedgrid.privacy.masking.MaskingStrategy;
76
+ import br.com.seedgrid.privacy.masking.PersonalData;
77
+
78
+ public class User {
79
+ @PersonalData(type = MaskingStrategy.PARTIAL, maskWith = "2")
80
+ private String cpf;
81
+ }
82
+
83
+ @Audit(entityFqcn = "br.com.seuapp.entities.User",
84
+ operation = AuditOperationEnum.UPDATE,
85
+ options = { @MaskRule(field = "password", remove = true) })
86
+ public User update(Long id, User u) { ... }
87
+ ```
88
+ Fonte: README e `AuditMaskingTest`. Detalhes das estratégias: [[SeedGrid/Extensions/privacy/Visao-geral|privacy]].
89
+
90
+ ## 5. Auditoria programática
91
+
92
+ ```java
93
+ import br.com.seedgrid.audit.core.entities.AuditLog;
94
+ import br.com.seedgrid.audit.core.enums.AuditOperationEnum;
95
+ import br.com.seedgrid.audit.core.services.AuditEmitter;
96
+
97
+ AuditLog log = new AuditLog();
98
+ log.setOperation(AuditOperationEnum.OTHER);
99
+ log.setEntity("Report");
100
+ log.setDescription("Exportação de relatório");
101
+ log.setUserName("job-scheduler");
102
+ log.setOperationDateTime(java.time.Instant.now());
103
+ AuditEmitter.emit(log); // best-effort: nunca lança; usa AuditGateway (enriquece + persiste)
104
+ ```
105
+ Alternativa: injetar `AuditGateway` e chamar `persist(log)`. Fonte: `AuditEmitter`, `AuditGatewayImpl`, setters de `AuditLog`.
106
+
107
+ ## 6. Contribuir metadata (SPI)
108
+
109
+ ```java
110
+ import br.com.seedgrid.audit.core.services.AuditMetadataContributor;
111
+
112
+ @RequestScoped
113
+ public class CompanyAuditMetadata implements AuditMetadataContributor {
114
+ @Inject JsonWebToken jwt;
115
+
116
+ @Override
117
+ public Map<String, String> contribute() {
118
+ String company = jwt.getClaim("companyPublicId"); // nome do claim é do host
119
+ return company == null ? Map.of() : Map.of("companyPublicId", company);
120
+ }
121
+ }
122
+ ```
123
+ Todas as implementações são mescladas (`AuditEnricher`); contribuidor que lança é ignorado. Filtro: `GET /audit-logs?metaKey=companyPublicId&metaValue=<uuid>`.
124
+
125
+ ## 7. Forçar escopo de leitura (SPI)
126
+
127
+ ```java
128
+ import br.com.seedgrid.audit.core.spi.AuditReadScope;
129
+ import br.com.seedgrid.audit.core.spi.AuditReadScopeProvider;
130
+
131
+ @ApplicationScoped // sem @DefaultBean: vence DefaultAuditReadScopeProvider
132
+ public class TenantAuditReadScope implements AuditReadScopeProvider {
133
+ @Override
134
+ public AuditReadScope resolveReadScope() {
135
+ String company = /* obter do contexto de segurança */ null;
136
+ return company == null ? AuditReadScope.unrestricted()
137
+ : AuditReadScope.of("companyPublicId", company);
138
+ }
139
+ }
140
+ ```
141
+ Com escopo restrito, `AuditLogController` sobrescreve `metaKey/metaValue` do cliente e responde 404 em `/audit-logs/{id}` fora do escopo.
142
+
143
+ ## 8. Leitura REST
144
+
145
+ ```http
146
+ GET /audit-logs?entity=User&operation=UPDATE&operationDateFrom=2026-06-01&page=0&size=20
147
+ GET /audit-logs/42
148
+ GET /audit-logs/entities
149
+ GET /audit-logs/users
150
+ ```
151
+ Exige permissão `LOG_READ`.
@@ -0,0 +1,120 @@
1
+ ---
2
+ tags: [seedgrid, extension, audit, rust]
3
+ fonte: rust/seedgrid-rust-crate-audit
4
+ branch: main
5
+ commit: be738a2d1e
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # audit — porte Rust (`seedgrid-rust-crate-audit`)
10
+
11
+ Porte da extensão Quarkus `seedgrid-quarkus-ext-audit` (módulos `audit-core`, `audit-postgresql`, `audit-mongodb`). Lado Java: [[SeedGrid/Extensions/audit/Visao-geral|Visão geral do audit (Java)]] · [[SeedGrid/Extensions/audit/Configuracao|Configuração do audit (Java)]]. Configuração Rust: [[SeedGrid/Extensions/audit/Configuracao-Rust|Configuração Rust do audit]].
12
+
13
+ Trilha de auditoria (snapshot *before/after*) com mascaramento de PII, backends PostgreSQL (sqlx) e MongoDB e um router Axum de leitura. **Confirmado** (`rust/seedgrid-rust-crate-audit/src/lib.rs`).
14
+
15
+ ## Identificação
16
+ | Item | Valor |
17
+ |---|---|
18
+ | Pacote Cargo | `seedgrid-rust-crate-audit` (lib `seedgrid_audit`) |
19
+ | Versão | herdada do workspace: `2026.10.14` (`rust/Cargo.toml` → `[workspace.package]`). |
20
+ | Edição / MSRV | 2021 / 1.82 |
21
+ | Features | `postgres` (default, `sqlx`), `mongodb` (`mongodb` + `bson`) |
22
+ | Dependência SeedGrid | `seedgrid-rust-crate-privacy` (motor de mascaramento; o módulo `masking` re-exporta `seedgrid_privacy::masking`) |
23
+ | Consumidores no workspace | security, backup, login-tenancy, subdomain-tenancy |
24
+
25
+ ## Arquitetura (diferença em relação ao Java)
26
+ No Java a captura vem do interceptor CDI `@Audit`. Em Rust **não há interceptor**: o consumidor monta um `AuditEvent` e chama `Auditor::record`. A crate então: (1) deriva `entity` = nome simples do FQCN; (2) mascara `before_state`/`after_state` com as `MaskRule`s do evento; (3) preenche usuário, timestamp, origin, IP, user-agent e metadata pelos SPIs; (4) faz *upsert* dos índices `entities`/`users`; (5) persiste. Escritas são best-effort: erros são logados e engolidos. **Confirmado** (`src/lib.rs`, `src/state.rs`).
27
+
28
+ As validações build-time do `AuditProcessor` do Quarkus (`@Audit(entityFqcn=...)`, `lookupMethod`/`lookups`) não existem em Rust; estão só como doc comments em `src/lib.rs`.
29
+
30
+ ## API pública principal
31
+ | Símbolo | Papel | Fonte |
32
+ |---|---|---|
33
+ | `AuditConfig`, `AuditPersistenceStrategy`, `default_strategy()` | Config (ver [[SeedGrid/Extensions/audit/Configuracao-Rust\|Configuração Rust]]) | `src/config.rs` |
34
+ | `AuditState::postgres(pool, cfg)` / `AuditState::mongodb(db, cfg)` | Construtores; retornam `Result` e validam que `cfg.strategy` casa com o backend (`validate_strategy`) | `src/state.rs` |
35
+ | `AuditState::builder(config, repo, entities_repo, users_repo)` → `AuditStateBuilder` | Montagem com repositórios arbitrários; `.request_context(..)`, `.metadata_contributor(..)`, `.read_scope(..)`, `.read_authorizer(..)`, `.build()` | `src/state.rs` |
36
+ | trait `Auditor` (`record(event, ctx)`) | Seam de escrita | `src/state.rs` |
37
+ | `AuditEvent` (`new`, `description`, `before_state`, `after_state`, `mask_rule(s)`, `tech_operation`) | Evento montado pelo consumidor | `src/models.rs` |
38
+ | `AuditContext` (`user`, `request`, `metadata`) | Contexto da escrita; `metadata` direta vence os contribuidores (adição do Rust, D8) | `src/state.rs` |
39
+ | `AuditFilter`, `PageReq`, `PageResult` (serializa `items`) | Leitura/paginação | `src/models.rs` |
40
+ | `migrate(&PgPool)` / `MIGRATOR` | Migrations `0300`–`0302`, histórico isolado `_sqlx_migrations_audit` | `src/lib.rs`, `src/migrations.rs` |
41
+ | `router(state)` / `router_with_resolver(resolver, authorizer)` | Router Axum (único ou resolvido por tenant) | `src/routes.rs` |
42
+ | `openapi()` | Spec utoipa da crate | `src/apidoc.rs` |
43
+ | `AuditPlatform::assemble(Option<&PgPool>)` | Montagem "estilo CDI" a partir do ambiente (só com feature `postgres`) | `src/platform.rs` |
44
+ | Repositórios `PgAuditLog*Repository`, `MongoAuditLog*Repository`; traits `AuditLogRepository`, `AuditLogEntitiesRepository`, `AuditLogUsersRepository` | Persistência | `src/postgres.rs`, `src/mongodb.rs`, `src/repo.rs` |
45
+
46
+ ### SPIs (todos com default, substituíveis no builder)
47
+ | Trait | Default | Observação |
48
+ |---|---|---|
49
+ | `AuditRequestContextProvider` | `HttpAuditRequestContextProvider` | origin = `Origin` → `Referer` → `Host`; IP = 1º hop de `X-Forwarded-For` |
50
+ | `AuditMetadataContributor` | nenhum | falhas ignoradas |
51
+ | `AuditReadScopeProvider` | `DefaultAuditReadScopeProvider` (irrestrito) | pode forçar `metaKey`/`metaValue` (isolamento por company) |
52
+ | `AuditReadAuthorizer` | **`DenyAllAuditReadAuthorizer`** (403) | porta `@PermissionsAllowed("LOG_READ")`; `AllowAllAuditReadAuthorizer` é opt-in inseguro |
53
+ | `AuditStateResolver` | — | resolve o `AuditState` do tenant corrente; `None` → 503 |
54
+
55
+ **Confirmado** (`src/spi.rs`).
56
+
57
+ ## Endpoints (router Axum)
58
+ | Método | Path | Descrição |
59
+ |---|---|---|
60
+ | GET | `/audit-logs` | lista; com `page` ou `size` → `PageResult` (`{items,total,page,size}`); filtros `idFrom, idTo, entity, operation, description, operationDateFrom, operationDateTo, userName, metaKey, metaValue` |
61
+ | GET | `/audit-logs/{id}` | 404 se fora do escopo de leitura |
62
+ | GET | `/audit-logs/entities` | entidades distintas |
63
+ | GET | `/audit-logs/users` | usuários distintos |
64
+
65
+ Fonte: `src/routes.rs` → `router`, `router_with_resolver`.
66
+
67
+ ## Persistência
68
+ - Postgres: migrations `migrations/0300_create_audit_tables.sql`, `0301_add_tech_operation.sql`, `0302_add_metadata.sql` (portadas de V300–V302); metadata em EAV `audit_log_metadata`.
69
+ - Mongo: coleções `audit_logs`, `audit_log_entities`, `audit_log_users`; `sequentialId` via contador `counters` (`_id="audit_log_sequence"`).
70
+
71
+ ## Exemplo (de `rust/examples/seedgrid-audit-example/src/main.rs`)
72
+ ```rust
73
+ use seedgrid_audit::{AuditConfig, AuditContext, AuditEvent, AuditOperation, Auditor, MaskRule};
74
+
75
+ seedgrid_audit::migrate(&pool).await?;
76
+ let state = seedgrid_audit::AuditState::postgres(pool.clone(), AuditConfig::from_env())?;
77
+
78
+ let event = AuditEvent::new("br.com.seedgrid.example.Cliente", AuditOperation::Create)
79
+ .description("cadastro de cliente")
80
+ .after_state(serde_json::json!({ "cpf": "12345678900", "nome": "Joao Silva" }))
81
+ .mask_rule(MaskRule::format("cpf", "***.***.***-**"));
82
+ state
83
+ .record(event, AuditContext::new().user("maria").metadata("companyPublicId", company))
84
+ .await; // best-effort: não retorna erro
85
+ ```
86
+ Para expor a leitura: `axum::Router::new().merge(seedgrid_audit::router(state))` — lembrando que, sem `read_authorizer`, toda leitura responde 403.
87
+
88
+ ## Testes
89
+ - Unitários em `src/*` (mascaramento, filtros, enum, `config` — default de estratégia por feature).
90
+ - `tests/pg_metadata_it.rs` e `tests/mongo_metadata_it.rs`: `#[ignore]`, só rodam com `AUDIT_IT_PG_URL` / `AUDIT_IT_MONGO_URI`.
91
+ - E2E Testcontainers no exemplo: `rust/examples/seedgrid-audit-example/tests/audit_e2e.rs`.
92
+ - **Não executados** nesta análise.
93
+
94
+ ## Notas de comportamento
95
+
96
+ - `enabled=false` faz `Auditor::record` virar no-op.
97
+ - Leitura é deny-by-default.
98
+ - O consumidor preenche `AuditEvent::tech_operation`.
99
+ - A estratégia padrão deriva da feature Cargo; não há router dinâmico entre dois backends.
100
+
101
+ ## Lacunas
102
+ - No modo JPA a conexão vem do `PgPool` do host; `SEEDGRID_AUDIT_DB_URL` só é usada por `AuditConfig::pg_connection_url()`, que nenhuma crate do workspace chama.
103
+
104
+ ## Enums
105
+ Equivalentes Java e comparação detalhada: [[SeedGrid/Extensions/audit/Enums|Enums do audit (Java)]].
106
+
107
+ | Enum | Arquivo | Java equivalente |
108
+ |---|---|---|
109
+ | `AuditOperation` | `src/models.rs` | [[SeedGrid/Extensions/audit/Enums#AuditOperationEnum\|AuditOperationEnum]] |
110
+ | `AuditPersistenceStrategy` | `src/config.rs` | [[SeedGrid/Extensions/audit/Enums#AuditPersistenceStrategy\|AuditPersistenceStrategy]] |
111
+ | `AuditError` | `src/error.rs` | exceções do audit (sem enum Java) |
112
+
113
+ ### AuditOperation
114
+ Variantes: `Create`, `Update`, `Delete`, `Read`, `Other`. `#[serde(rename_all = "UPPERCASE")]` → JSON `"CREATE"`…`"OTHER"`. `name()`/`Display` devolvem o nome em maiúsculas (usado como `description` padrão); `FromStr` aceita qualquer caixa e erra com `AuditOperation invalida: X`. Persistida como `VARCHAR(50)` com o nome (sem CHECK constraint em `migrations/0300`); valor desconhecido lido do banco falha. Valores **iguais** ao Java (`@Enumerated(STRING)`).
115
+
116
+ ### AuditPersistenceStrategy
117
+ Variantes: `Jpa` (padrão do enum), `Mongodb`. Sem serde. `parse(&str)` (trim, case-insensitive): `JPA`/`POSTGRES`/`POSTGRESQL` → `Jpa`; `MONGODB`/`MONGO` → `Mongodb`; outro → `None` (cai no default da feature). Lido de `AUDIT_STRATEGY` ([[SeedGrid/Extensions/audit/Configuracao-Rust|Configuração Rust]]). Nota: o Java só tem `JPA` e `MONGODB`; os aliases `POSTGRES`/`POSTGRESQL`/`MONGO` existem só no Rust. O default depende da feature compilada (`default_strategy()`).
118
+
119
+ ### AuditError
120
+ `NotFound(i64)` e `OutOfScope` → 404; `Forbidden(String)` → 403; `Config`, `Json`, `Internal`, `Database` (feature `postgres`), `Mongo` (feature `mongodb`) → 500 (`AuditError::status`).
@@ -0,0 +1,114 @@
1
+ ---
2
+ tags: [seedgrid, extension, audit]
3
+ fonte: java/seedgrid-quarkus-ext-audit
4
+ branch: main
5
+ commit: d5bf32e509
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # SeedGrid Audit (Quarkus) — Visão geral
10
+
11
+ Trilha de auditoria declarativa: um método (ou classe) anotado com `@Audit` é interceptado; a extensão registra quem, o quê, quando, de onde (origin/IP/User-Agent) e o estado **antes/depois** da entidade, com mascaramento de dados pessoais delegado à lib `seedgrid-privacy`. Persistência plugável em PostgreSQL (JPA) ou MongoDB e API REST de leitura. **Confirmado** (`AuditInterceptor`, `README.md`).
12
+
13
+ - Configuração: [[SeedGrid/Extensions/audit/Configuracao|Configuração do audit]]
14
+ - Exemplos: [[SeedGrid/Extensions/audit/Exemplos|Exemplos do audit]]
15
+ - Enums: [[SeedGrid/Extensions/audit/Enums|Enums do audit]]
16
+ - [[SeedGrid/Extensions/audit/Rust|Porte Rust]] (crate `seedgrid-rust-crate-audit`)
17
+
18
+ ## Módulos Maven e coordenadas
19
+
20
+ Todos com `groupId` `br.com.seedgrid`. Agregador `seedgrid-audit` versão **`2026.09.25`** (parent `seedgrid-parent` 2026.07.02). **Confirmado** (`pom.xml`).
21
+
22
+ | Módulo (pasta) | artifactId | Tipo |
23
+ |---|---|---|
24
+ | `seedgrid-quarkus-ext-audit-core/runtime` | `seedgrid-audit-core` | biblioteca runtime (sem deployment próprio, sem `quarkus-extension.properties`) |
25
+ | `seedgrid-quarkus-ext-audit-postgresql/runtime` | `seedgrid-audit-postgresql` | extensão Quarkus (strategy `JPA`) |
26
+ | `seedgrid-quarkus-ext-audit-postgresql/deployment` | `seedgrid-audit-postgresql-deployment` | deployment |
27
+ | `seedgrid-quarkus-ext-audit-mongodb/runtime` | `seedgrid-audit-mongodb` | extensão Quarkus (strategy `MONGODB`) |
28
+ | `seedgrid-quarkus-ext-audit-mongodb/deployment` | `seedgrid-audit-mongodb-deployment` | deployment |
29
+
30
+ O host adiciona **apenas** o módulo da strategy (`seedgrid-audit-postgresql` ou `seedgrid-audit-mongodb`); ambos já dependem de `seedgrid-audit-core`.
31
+
32
+ ### Dependências SeedGrid e de framework
33
+ - `seedgrid-commons` e `seedgrid-privacy` (core). Ver [[SeedGrid/Extensions/commons/Visao-geral|commons]] e [[SeedGrid/Extensions/privacy/Visao-geral|privacy]].
34
+ - Core: `quarkus-arc`, `quarkus-jackson`, `quarkus-rest-jackson`, `quarkus-smallrye-jwt`, `quarkus-hibernate-validator`, `quarkus-smallrye-openapi`.
35
+ - PostgreSQL: `quarkus-jdbc-postgresql`, `quarkus-flyway`. MongoDB: `quarkus-mongodb-panache`.
36
+ - Integração opcional (por SPI, sem dependência Maven): `seedgrid-security` / `seedgrid-login-tenancy` (usuário corrente, metadata `companyPublicId`, escopo de leitura). **Inferência** a partir de comentários/README.
37
+
38
+ ## Arquitetura e fluxo
39
+
40
+ ```mermaid
41
+ sequenceDiagram
42
+ participant C as Chamador
43
+ participant I as AuditInterceptor
44
+ participant M as Método @Audit
45
+ participant P as PersonalDataSanitizer (privacy)
46
+ participant E as AuditEnricher
47
+ participant S as AuditLogService (REQUIRES_NEW)
48
+ C->>I: invoca
49
+ I->>I: resolve entityFqcn, usuário (SecurityIdentity ou "anonymous")
50
+ alt UPDATE/DELETE
51
+ I->>I: lookup "antes" (repository derivado ou EntityManager)
52
+ I->>P: sanitizeToJson(antes)
53
+ end
54
+ I->>M: ctx.proceed()
55
+ alt CREATE/UPDATE
56
+ I->>P: sanitizeToJson(depois)
57
+ end
58
+ I->>E: enrich (origin/IP/UA + metadata SPI)
59
+ I->>S: persist(AuditLog)
60
+ ```
61
+
62
+ - Interceptor: `@Audit` é `@InterceptorBinding`; `AuditInterceptor` tem `@Priority(APPLICATION + 200)`. Lê a anotação no método ou, em fallback, na classe. **Confirmado**.
63
+ - Resolução do repositório: `entityFqcn` com pacote `.entities` → `.repositories` + sufixo `Repository`. Plano de lookup: `lookupMethod` → `lookups` → `publicId` (se herda `br.com.seedgrid.commons.persistence.BaseEntity`/`BaseEntityPanache`) → `@Id` compatível com o 1º argumento. Sem repository derivável, usa `EntityManager` (active-record). **Confirmado** (`AuditInterceptor#resolveLookupPlan`, `#findViaActiveRecord`).
64
+ - Roteamento de persistência: `AuditPersistenceRouter` produz `AuditLogRepository`, `AuditLogUsersRepository`, `AuditLogEntitiesRepository` a partir do `AuditPersistenceProvider` cuja `strategy()` = `seedgrid.audit.persistence.strategy`. Sem provider → `IllegalStateException`. **Confirmado**.
65
+ - `PostgreSqlAuditPersistenceProvider`: usa o `EntityManager` CDI do host se resolvível; senão cria um `EntityManagerFactory` standalone (`audit-pu`, `PGSimpleDataSource`, dialeto PostgreSQL) a partir de `seedgrid.audit.jpa.*`. **Confirmado**.
66
+ - `MongoAuditPersistenceProvider`: usa `Instance<MongoDatabase>`; coleções `audit_logs`, `audit_log_users`, `audit_log_entities` e `counters` (sequência `audit_log_sequence`); índices criados de forma lazy. **Confirmado**. A extensão **não produz** um bean `MongoDatabase`: ele vem de `seedgrid-login-tenancy` (`LoginTenancyMongoAuditDatabaseProducer`, banco único, registrado só com o driver Mongo no classpath), de `seedgrid-subdomain-tenancy` (`TenantAwareMongoProducer`, banco por tenant), ambos `@DefaultBean`, ou de um producer da aplicação. **Confirmado**.
67
+ - Validação em build (`AuditProcessor#validateAuditUsage`, idêntico nos dois deployments): falha o build se `entityFqcn` vazio/inexistente, se `lookupMethod` e `lookups` forem usados juntos, se um campo de `lookups` não existir, se houver mais lookups que parâmetros, ou se o lookup implícito por PK for incompatível; avisa (warn) quando o repository derivado não existe. **Confirmado**.
68
+
69
+ ## APIs públicas e pontos de integração
70
+
71
+ | Tipo | Símbolo | Descrição |
72
+ |---|---|---|
73
+ | Anotação | `br.com.seedgrid.audit.core.annotations.Audit` | `operation` (`AuditOperationEnum`, padrão `OTHER`), `description`, `entityFqcn` (obrigatório), `lookupMethod`, `lookups` (`AuditLookup[]`), `options` (`MaskRule[]` do privacy) |
74
+ | Anotação | `AuditLookup` | `field()` |
75
+ | Enum | `AuditOperationEnum` | `CREATE, UPDATE, DELETE, READ, OTHER` |
76
+ | Enum | `AuditPersistenceStrategy` | `MONGODB, JPA` |
77
+ | SPI | `core.spi.AuditPersistenceProvider` | liga strategy aos repositórios (fornecido pelos módulos de store) |
78
+ | SPI | `core.services.AuditMetadataContributor` | `Map<String,String> contribute()` mesclado em `AuditLog.metadata` |
79
+ | SPI | `core.spi.AuditReadScopeProvider` | força filtro `metaKey/metaValue` na leitura; default `DefaultAuditReadScopeProvider` (`@DefaultBean`, irrestrito) |
80
+ | SPI | `core.services.AuditRequestContextProvider` | origin/IP/UA; default `HttpAuditRequestContextProvider` (`@DefaultBean`; usa `Origin`→`Referer`→`Host`, `X-Forwarded-For`) |
81
+ | Bean | `core.services.AuditGateway` / `AuditGatewayImpl` (`@DefaultBean`) | `persist(AuditLog)` para auditoria programática (enriquece e persiste) |
82
+ | Utilitário | `core.services.AuditEmitter#emit(AuditLog)` | estático, best-effort (nunca lança) via `AuditGateway` |
83
+
84
+ ### Endpoints REST (`AuditLogController`, todos `@PermissionsAllowed("LOG_READ")`)
85
+
86
+ | Método | Path | Descrição |
87
+ |---|---|---|
88
+ | GET | `/audit-logs` | lista; paginada se `page`/`size` (padrão de página 0, tamanho 10). Filtros: `idFrom`, `idTo`, `entity`, `operation`, `description`, `operationDateFrom`, `operationDateTo`, `userName`, `metaKey`, `metaValue` |
89
+ | GET | `/audit-logs/{id}` | por id; 404 se fora do escopo do `AuditReadScopeProvider` |
90
+ | GET | `/audit-logs/entities` | nomes de entidades (escopados) |
91
+ | GET | `/audit-logs/users` | usuários (escopados) |
92
+
93
+ **Confirmado** (`RestControllerPath`, `AuditLogController`). Os paths são fixos (não configuráveis).
94
+
95
+ ## Migrations (PostgreSQL)
96
+
97
+ `seedgrid-quarkus-ext-audit-postgresql/runtime/src/main/resources/db/migration/audit/`: `V300__create_audit_tables.sql`, `V301__add_tech_operation.sql`, `V302__add_metadata.sql` (tabela `audit_log_metadata`), `V303__operation_date_time_timestamptz.sql` (converte `operation_date_time` para `TIMESTAMPTZ` usando `AT TIME ZONE 'UTC'`). Faixa **V300–V303**, tabela de histórico `flyway_schema_history_audit`. **Confirmado**. MongoDB não tem migrations.
98
+
99
+ ## Testes (não executados)
100
+
101
+ | Local | Cobre |
102
+ |---|---|
103
+ | `audit-core/runtime/src/test/.../AuditInterceptorTest` | plano de lookup (publicId, lookups, lookupMethod, fallback por id) |
104
+ | `audit-core/.../HttpAuditRequestContextProviderTest` | comportamento sem requisição HTTP e `X-Forwarded-For` |
105
+ | `audit-core/.../AuditEnricherTest` | merge de metadata e tolerância a contribuidor com erro |
106
+ | `audit-postgresql/deployment/src/test/.../AuditProcessorTest` | validação de lookup implícito por PK e derivação de repository |
107
+ | `audit-postgresql/runtime/src/test/.../AuditMaskingTest` | mascaramento persistido no Postgres (Testcontainers) |
108
+ | `audit-postgresql/runtime/src/test/.../JpaAuditMetadataIT` | metadata, filtros e paginação JPA (Testcontainers) |
109
+ | `audit-mongodb/runtime/src/test/.../MongoAuditMetadataIT` | metadata em subdocumento e filtros (Testcontainers) |
110
+
111
+ ## Limitações
112
+ - O standalone JPA só aceita URL `jdbc:postgresql:` (`IllegalArgumentException` caso contrário).
113
+ - Se ambos os módulos (postgresql e mongodb) estiverem no classpath, os dois `microprofile-config.properties` definem `seedgrid.audit.persistence.strategy` com mesmo ordinal — resultado não determinado. **Não confirmado**.
114
+ - Persistência em `REQUIRES_NEW`: o log é gravado mesmo que a transação principal falhe. Lookup que falha resulta em log sem before/after (warn/debug).
@@ -0,0 +1,136 @@
1
+ ---
2
+ tags: [seedgrid, extension, backup, rust, configuracao]
3
+ fonte: rust/seedgrid-rust-crate-backup
4
+ branch: main
5
+ commit: be738a2d1e
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # backup — Configuração Rust
10
+
11
+ Visão do crate: [[SeedGrid/Extensions/backup/Rust|Porte Rust do backup]] · Java: [[SeedGrid/Extensions/backup/Configuracao|Configuração do backup (Java)]].
12
+
13
+ ## Cabeçalho
14
+ | Item | Valor |
15
+ |---|---|
16
+ | Struct | `BackupConfig` (+ `NotificationConfig`, `MailerConfig`, `CsvConfig`, `FilesystemConfig`, `S3Config`, `MinioConfig`, `AzureBlobConfig`, `GoogleDriveConfig`, `OnedriveConfig`, `GcsConfig`) — `rust/seedgrid-rust-crate-backup/src/config.rs` |
17
+ | Mecanismo | `BackupConfig::from_env()` parte de `BackupConfig::default()` e sobrescreve com env; ou struct montada pelo host |
18
+ | Prefixo Java | `seedgrid.backup` (`BackupConfig.java`, `@ConfigMapping`) |
19
+ | Quem chama `from_env` | `BackupPlatform::assemble` (`src/platform.rs`) |
20
+ | Leitura | no boot, uma vez |
21
+
22
+ Regras de leitura (`src/config.rs` → `env_any`): lista de nomes em ordem; vence o **primeiro nome com valor não vazio após `trim`**. Valor que não parseia (número, bool, duração) é ignorado e o default permanece. Booleanos (`env_bool_any`): `true/1/yes` e `false/0/no` (case-insensitive). Durações (`parse_duration`): `500ms`, `30s`, `5m`, `2h`, `1d` ou ISO-8601 `PT15M`, `P30D`, `P1DT2H` (sem anos/meses/semanas).
23
+
24
+ ## Habilitação (fora do `BackupConfig`)
25
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
26
+ |---|---|---|---|---|---|---|---|---|---|
27
+ | `SEEDGRID_BACKUP_ENABLED` / alias `BACKUP_ENABLED` | bool | `1`, `true`, `yes`, `on` (case-insensitive); qualquer outro = falso | falso (ausente) | Condicional: obrigatória `true` quando `BackupOverrides.require_opt_in` (default `true`) | sem opt-in, `BackupPlatform::assemble` devolve `Ok(None)` (backup desligado). Precedência: primeiro nome **definido** (mesmo vazio) | `BackupPlatform::assemble` | requer também `PgPool` | `assemble()` | `src/platform.rs` → `backup_opt_in` |
28
+
29
+ Equivalente Java: não há `seedgrid.backup.enabled` no `BackupConfig.java` (**Confirmado** — o Java liga a extensão por presença no classpath).
30
+
31
+ ## Geral
32
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
33
+ |---|---|---|---|---|---|---|---|---|---|
34
+ | `BACKUP_RETENTION_DAYS` / alias `SEEDGRID_BACKUP_RETENTION_DAYS` (Java `seedgrid.backup.retention-days`) | i64 | inteiro | `7` | Não | `expires_at = agora + N dias` | `ExportService` (`src/service.rs`) | limpeza no scheduler | `from_env()` | `config.rs`; consumo `service.rs` |
35
+ | `BACKUP_MAX_CONCURRENT_EXPORTS` / `SEEDGRID_BACKUP_MAX_CONCURRENT_EXPORTS` (Java `max-concurrent-exports`) | i64 | inteiro | `1` | Não | limite de exports simultâneos | `BackupScheduler::process_queued_exports` | — | `from_env()` | `scheduler.rs` |
36
+ | `BACKUP_STORAGE` / `SEEDGRID_BACKUP_STORAGE` (Java `storage`, `${SEEDGRID_BACKUP_STORAGE:filesystem}`) | String | `filesystem`, `s3`, `minio`, `azure-blob`, `google-drive`, `onedrive`, `gcs` (case-insensitive) | `filesystem` | Não | outro valor → erro `Unknown storage type` em `build_storage_config` | `exporter.rs`, `storage.rs` | escolhe o bloco de storage | `from_env()` | `config.rs` → `build_storage_config` |
37
+ | `BACKUP_QUEUE_POLL_INTERVAL` / `SEEDGRID_BACKUP_QUEUE_POLL_INTERVAL` (Java `queue-poll-interval`) | Duration | ver durações | `30s` | Não | intervalo do loop de fila | `BackupScheduler::spawn` | — | `from_env()` | `scheduler.rs` |
38
+ | `BACKUP_ASYNC_ENABLED` / `SEEDGRID_BACKUP_ASYNC_ENABLED` (Java `async-enabled`) | bool | `true/1/yes`, `false/0/no` | `true` | Não | dispara worker assíncrono após criar o job | `ExportService::create_export_job` | — | `from_env()` | `service.rs` |
39
+
40
+ ## Notificação
41
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
42
+ |---|---|---|---|---|---|---|---|---|---|
43
+ | `BACKUP_NOTIFICATION_ENABLED` / `SEEDGRID_BACKUP_NOTIFICATION_ENABLED` (Java `notification.enabled`) | bool | idem | `true` | Não | desliga o loop de notificação e `is_enabled()` | `scheduler.rs`, `notification.rs` | exige `mailer.from` e `mailer.host` | `from_env()` | `config.rs` |
44
+ | `BACKUP_NOTIFICATION_POLL_INTERVAL` / `SEEDGRID_BACKUP_NOTIFICATION_POLL_INTERVAL` (Java `notification.poll-interval`) | Duration | idem | `5m` | Não | intervalo do loop | `BackupScheduler::spawn` | — | `from_env()` | `scheduler.rs` |
45
+ | `BACKUP_NOTIFICATION_MAX_RETRIES` / `SEEDGRID_BACKUP_NOTIFICATION_MAX_RETRIES` (Java `notification.max-retries`) | i32 (lido como i64) | inteiro | `3` | Não | máx. tentativas de e-mail | `process_notifications` | — | `from_env()` | `scheduler.rs`, `repo.rs` |
46
+ | `BACKUP_NOTIFICATION_RETRY_DELAY` / `SEEDGRID_BACKUP_NOTIFICATION_RETRY_DELAY` (Java `notification.retry-delay`) | Duration | idem | `PT15M` | Não | atraso mínimo entre tentativas | `process_notifications` | — | `from_env()` | `scheduler.rs` |
47
+
48
+ ## Mailer (SMTP)
49
+ Precedência invertida: **`SEEDGRID_BACKUP_MAILER_*` primeiro**, `BACKUP_MAILER_*` como alias (igual às `${...}` do `microprofile-config.properties` Java — **Confirmado**). Só sobrescreve o default quando a env existe e não é vazia.
50
+
51
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
52
+ |---|---|---|---|---|---|---|---|---|---|
53
+ | `SEEDGRID_BACKUP_MAILER_FROM` / `BACKUP_MAILER_FROM` (Java `mailer.from`) | `Option<String>` | e-mail | `noreply@example.com` | Não | remetente; ausente → erro no envio | `notification.rs` | entra em `is_enabled()` | `from_env()` | `config.rs`, `notification.rs` |
54
+ | `SEEDGRID_BACKUP_MAILER_HOST` / `BACKUP_MAILER_HOST` (Java `mailer.host`) | `Option<String>` | host | `smtp.gmail.com` | Não | host SMTP | `SmtpMailer::from_config`, `is_enabled()` | — | `from_env()` | `email_smtp.rs` |
55
+ | `SEEDGRID_BACKUP_MAILER_PORT` / `BACKUP_MAILER_PORT` (Java `mailer.port`) | `Option<u16>` | 1–65535 | `587` | Não | `465` → TLS implícito; senão STARTTLS | `SmtpMailer::from_config` | `start_tls` | `from_env()` | `email_smtp.rs` |
56
+ | `SEEDGRID_BACKUP_MAILER_START_TLS` / `BACKUP_MAILER_START_TLS` (Java `mailer.start-tls`) | `Option<String>` | `REQUIRED`, `OPTIONAL`, `DISABLED` | `REQUIRED` | Não | só `DISABLED` muda o comportamento (texto puro) | `SmtpMailer::from_config` | — | `from_env()` | `email_smtp.rs` |
57
+ | `SEEDGRID_BACKUP_MAILER_USERNAME` / `BACKUP_MAILER_USERNAME` (Java `mailer.username`) | `Option<String>` | texto | — | Condicional (para `MailerConfig::is_configured()`) | credencial SMTP | `SmtpMailer::from_config` | — | `from_env()` | `email_smtp.rs` |
58
+ | 🔒 `SEEDGRID_BACKUP_MAILER_PASSWORD` / `BACKUP_MAILER_PASSWORD` (Java `mailer.password`) | `Option<String>` | texto | — | Condicional (idem) | credencial SMTP | `SmtpMailer::from_config` | — | `from_env()` | `email_smtp.rs` |
59
+
60
+ `MailerConfig::is_configured()` = host + from + username + password presentes; usado por hosts para decidir `SmtpMailer` vs `LoggingMailer` (comentário em `src/email_smtp.rs`; o auto-wire fica no subdomain-tenancy — **Não confirmado** nesta análise).
61
+
62
+ ## CSV e filesystem
63
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
64
+ |---|---|---|---|---|---|---|---|---|---|
65
+ | `BACKUP_CSV_DELIMITER` / `SEEDGRID_BACKUP_CSV_DELIMITER` (Java `csv.delimiter`) | String | 1º byte é usado | `,` | Não | delimitador do CSV e do manifest | `exporter.rs` | — | `from_env()` | `exporter.rs` |
66
+ | `BACKUP_CSV_QUOTE_CHAR` / `SEEDGRID_BACKUP_CSV_QUOTE_CHAR` (Java `csv.quote-char`) | String | 1º byte é usado | `"` | Não | aspas do CSV | `exporter.rs` | — | `from_env()` | `exporter.rs` |
67
+ | `BACKUP_FILESYSTEM_BASE` / `SEEDGRID_BACKUP_FILESYSTEM_BASE_PATH` (Java `filesystem.base-path`) | String | caminho | `/var/seedgrid/files` | Não | `base-path` do storage filesystem | `build_storage_config("filesystem")` | — | `from_env()` | `config.rs` |
68
+
69
+ ## MinIO
70
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
71
+ |---|---|---|---|---|---|---|---|---|---|
72
+ | `BACKUP_MINIO_BUCKET` / `SEEDGRID_BACKUP_MINIO_BUCKET` (Java `minio.bucket`) | `Option<String>` | nome | — | Condicional (`storage=minio`) | chave `bucket` | `build_storage_config("minio")` | validação no filemanagement | `from_env()` | `config.rs` |
73
+ | `BACKUP_MINIO_REGION` / `SEEDGRID_BACKUP_MINIO_REGION` (Java `minio.region`) | `Option<String>` | região | — (Java: `us-east-1`) | Não | chave `region` | idem | — | `from_env()` | `config.rs` |
74
+ | 🔒 `BACKUP_MINIO_ACCESS_KEY` / `SEEDGRID_BACKUP_MINIO_ACCESS_KEY` | `Option<String>` | texto | — | Condicional | chave `access-key` | idem | — | `from_env()` | `config.rs` |
75
+ | 🔒 `BACKUP_MINIO_SECRET_KEY` / `SEEDGRID_BACKUP_MINIO_SECRET_KEY` | `Option<String>` | texto | — | Condicional | chave `secret-key` | idem | — | `from_env()` | `config.rs` |
76
+ | `BACKUP_MINIO_ENDPOINT` / `SEEDGRID_BACKUP_MINIO_ENDPOINT` | `Option<String>` | URL | — | Condicional | chave `endpoint` | idem | — | `from_env()` | `config.rs` |
77
+
78
+ ## Storages só por struct (sem env)
79
+ `s3` (`bucket`, `region`, `access_key` 🔒, `secret_key` 🔒, `endpoint`), `azure_blob` (`connection_string` 🔒, `container`, `account_name`, `account_key` 🔒), `google_drive` (`root_folder_id`, `credentials_file`, `credentials_json` 🔒), `onedrive` (`client_id`, `client_secret` 🔒, `tenant_id`, `root_folder_path` = `/seedgrid/files`), `gcs` (`bucket`, `project_id`, `credentials_file`, `credentials_json` 🔒). Todos `None` por padrão; `from_env()` **não** os lê (**Confirmado**). Viram mapa `kebab-case` em `build_storage_config` para a crate filemanagement.
80
+
81
+ ## Features Cargo
82
+ Nenhuma.
83
+
84
+ ## Somente testes / exemplos
85
+ | Variável | Onde |
86
+ |---|---|
87
+ | `BACKUP_TEST_DATABASE_URL` | `tests/common/mod.rs` (ITs `#[ignore]`) |
88
+ | `DATABASE_URL`, `RUST_LOG` | `examples/seedgrid-backup-example` (lidas pelo exemplo) |
89
+
90
+ ## Aliases de nome
91
+
92
+ - O Rust lê `BACKUP_*` primeiro e `SEEDGRID_BACKUP_*` como alias (exceto mailer).
93
+ - Base do filesystem: aceita `BACKUP_FILESYSTEM_BASE` e `SEEDGRID_BACKUP_FILESYSTEM_BASE_PATH`, **não** `SEEDGRID_BACKUP_FILESYSTEM_BASE`.
94
+ - `minio.region` não tem default no Rust.
95
+ - Sem equivalente no Rust: `seedgrid.backup.excluded-domain-entity-packages` e `seedgrid.backup.mailer.auth-methods` (`SEEDGRID_BACKUP_MAILER_AUTH_METHODS`).
96
+
97
+ ## Configuração mínima
98
+ ```dotenv
99
+ SEEDGRID_BACKUP_ENABLED=true # opt-in exigido por BackupPlatform::assemble
100
+ ```
101
+
102
+ ## Configuração completa comentada
103
+ ```dotenv
104
+ SEEDGRID_BACKUP_ENABLED=true
105
+ BACKUP_RETENTION_DAYS=7
106
+ BACKUP_MAX_CONCURRENT_EXPORTS=1
107
+ BACKUP_STORAGE=filesystem # filesystem|minio (s3/azure/gcs/drive/onedrive só via struct)
108
+ BACKUP_QUEUE_POLL_INTERVAL=30s
109
+ BACKUP_ASYNC_ENABLED=true
110
+ BACKUP_FILESYSTEM_BASE=/var/seedgrid/files
111
+ BACKUP_CSV_DELIMITER=,
112
+ BACKUP_CSV_QUOTE_CHAR='"'
113
+ BACKUP_NOTIFICATION_ENABLED=true
114
+ BACKUP_NOTIFICATION_POLL_INTERVAL=5m
115
+ BACKUP_NOTIFICATION_MAX_RETRIES=3
116
+ BACKUP_NOTIFICATION_RETRY_DELAY=PT15M
117
+ SEEDGRID_BACKUP_MAILER_FROM=<remetente@dominio>
118
+ SEEDGRID_BACKUP_MAILER_HOST=<smtp-host>
119
+ SEEDGRID_BACKUP_MAILER_PORT=587
120
+ SEEDGRID_BACKUP_MAILER_START_TLS=REQUIRED
121
+ SEEDGRID_BACKUP_MAILER_USERNAME=<usuario>
122
+ SEEDGRID_BACKUP_MAILER_PASSWORD=<SEGREDO:backup-smtp-password>
123
+ # MinIO (BACKUP_STORAGE=minio)
124
+ BACKUP_MINIO_ENDPOINT=http://<host>:9000
125
+ BACKUP_MINIO_BUCKET=<bucket>
126
+ BACKUP_MINIO_REGION=us-east-1
127
+ BACKUP_MINIO_ACCESS_KEY=<SEGREDO:minio-access-key>
128
+ BACKUP_MINIO_SECRET_KEY=<SEGREDO:minio-secret-key>
129
+ ```
130
+
131
+ ## Receitas
132
+ - **Filesystem local**: só `SEEDGRID_BACKUP_ENABLED=true` (+ `BACKUP_FILESYSTEM_BASE`).
133
+ - **MinIO**: `BACKUP_STORAGE=minio` + bloco `BACKUP_MINIO_*`.
134
+ - **S3/Azure/GCS/Drive/OneDrive**: montar `BackupConfig` no host preenchendo o sub-struct (não há env).
135
+ - **Sem e-mail**: `BACKUP_NOTIFICATION_ENABLED=false`.
136
+ - **Sem opt-in**: `BackupOverrides { require_opt_in: false, ..Default::default() }`.