@seedgrid/ai-toolkit 0.0.0-stage → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +151 -2
- package/dist/adapters/claude.js +114 -0
- package/dist/adapters/codex.js +108 -0
- package/dist/adapters/index.js +17 -0
- package/dist/adapters/shared.js +142 -0
- package/dist/adapters/types.js +1 -0
- package/dist/cli.js +203 -0
- package/dist/commands/common.js +98 -0
- package/dist/commands/doctor.js +290 -0
- package/dist/commands/init.js +9 -0
- package/dist/commands/install.js +107 -0
- package/dist/commands/remove.js +54 -0
- package/dist/commands/review.js +127 -0
- package/dist/commands/status.js +73 -0
- package/dist/commands/update.js +8 -0
- package/dist/commands/validate.js +27 -0
- package/dist/core/apply.js +181 -0
- package/dist/core/blocks.js +64 -0
- package/dist/core/content.js +528 -0
- package/dist/core/env.js +40 -0
- package/dist/core/frontmatter.js +29 -0
- package/dist/core/hash.js +14 -0
- package/dist/core/inspect.js +51 -0
- package/dist/core/lock.js +124 -0
- package/dist/core/paths.js +65 -0
- package/dist/core/plan.js +242 -0
- package/dist/core/tools.js +62 -0
- package/dist/core/types.js +11 -0
- package/dist/core/updates.js +121 -0
- package/docs/arquitetura.md +80 -0
- package/docs/compatibilidade.md +50 -0
- package/docs/formato.md +155 -0
- package/docs/instalacao.md +105 -0
- package/docs/manutencao.md +115 -0
- package/package.json +43 -4
- package/seedgridKB/SeedGrid/Extensions/Catalogo-de-enums.md +161 -0
- package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +971 -0
- package/seedgridKB/SeedGrid/Extensions/Indice.md +63 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +124 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Enums.md +40 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +97 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao-Rust.md +69 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao.md +88 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Enums.md +33 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Exemplos.md +121 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Rust.md +126 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Visao-geral.md +111 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Configuracao-Rust.md +93 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Configuracao.md +127 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Enums.md +66 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Exemplos.md +151 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Rust.md +120 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Configuracao-Rust.md +136 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Configuracao.md +319 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Enums.md +131 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Exemplos.md +210 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Rust.md +135 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Visao-geral.md +150 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Configuracao-Rust.md +86 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Configuracao.md +243 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Enums.md +165 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Exemplos.md +205 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Rust.md +109 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Visao-geral.md +181 -0
- package/seedgridKB/SeedGrid/Extensions/broker/Configuracao-Rust.md +40 -0
- package/seedgridKB/SeedGrid/Extensions/broker/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Configuracao-Rust.md +73 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Configuracao.md +112 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Enums.md +36 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Exemplos.md +149 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Rust.md +81 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Visao-geral.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Configuracao.md +107 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Enums.md +105 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Exemplos.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Visao-geral.md +99 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +122 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Enums.md +29 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +82 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +118 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao-Rust.md +110 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao.md +157 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Exemplos.md +157 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Rust.md +70 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Visao-geral.md +88 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao-Rust.md +124 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +195 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Enums.md +71 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Exemplos.md +149 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Rust.md +139 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +130 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Configuracao.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Enums.md +52 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Exemplos.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Visao-geral.md +113 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao-Rust.md +67 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao.md +94 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Enums.md +79 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Exemplos.md +172 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Rust.md +107 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Visao-geral.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao-Rust.md +72 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao.md +104 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Exemplos.md +104 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Rust.md +69 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Visao-geral.md +105 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao-Rust.md +68 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao.md +186 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Enums.md +96 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Exemplos.md +229 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Rust.md +80 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Visao-geral.md +112 -0
- package/seedgridKB/SeedGrid/Extensions/runtime/Configuracao-Rust.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/runtime/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/security/Configuracao-Rust.md +327 -0
- package/seedgridKB/SeedGrid/Extensions/security/Configuracao.md +510 -0
- package/seedgridKB/SeedGrid/Extensions/security/Enums.md +95 -0
- package/seedgridKB/SeedGrid/Extensions/security/Exemplos.md +218 -0
- package/seedgridKB/SeedGrid/Extensions/security/Rust.md +203 -0
- package/seedgridKB/SeedGrid/Extensions/security/Visao-geral.md +131 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao-Rust.md +188 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +345 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Enums.md +117 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Exemplos.md +205 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Rust.md +161 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +142 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao-Rust.md +75 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao.md +152 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Enums.md +198 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Exemplos.md +173 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Rust.md +83 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Visao-geral.md +99 -0
- package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +112 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/Indice.md +323 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/API.md +257 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Exemplos.md +307 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Visao-geral.md +51 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/API.md +174 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Exemplos.md +236 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Visao-geral.md +76 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/API.md +339 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/Exemplos.md +311 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/Visao-geral.md +57 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/API.md +125 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/Exemplos.md +116 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/Visao-geral.md +86 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/API.md +490 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Exemplos.md +544 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Visao-geral.md +69 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/API.md +113 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Exemplos.md +159 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Visao-geral.md +92 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/API.md +516 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Exemplos.md +629 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Visao-geral.md +80 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/API.md +615 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Exemplos.md +384 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral.md +111 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/API.md +661 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Exemplos.md +312 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Visao-geral.md +123 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/API.md +1090 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/Exemplos.md +1172 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/Visao-geral.md +98 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/Visao-geral.md +98 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-apikeys.md +118 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-audit.md +88 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-backup.md +131 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-platform.md +132 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-user.md +120 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-login-tenancy.md +119 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-security.md +427 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-self-enter.md +104 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-subdomain-tenancy.md +110 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/API.md +490 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Exemplos.md +561 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Visao-geral.md +82 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/Visao-geral.md +68 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-commons.md +61 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-core.md +140 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-playground.md +112 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-theme.md +97 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/API.md +177 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/Exemplos.md +332 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/Visao-geral.md +106 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/showcase.md +70 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/arquiteto.md +53 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +45 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +43 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +41 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +44 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +40 -0
- package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +78 -0
- package/seedgridKB/SeedGrid/Toolkit/references/glossario.md +15 -0
- package/seedgridKB/SeedGrid/Toolkit/references/modos-shared-native.md +27 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +54 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +39 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/formato-entrega.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +47 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/personalizacao-local.md +22 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/planejar-mudanca/SKILL.md +38 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/SKILL.md +33 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/references/checklist.md +25 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-backend-crud/SKILL.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-bump/SKILL.md +26 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/SKILL.md +221 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/checklist.md +31 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/patterns.md +185 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/routing.md +66 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/SKILL.md +56 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/checklist.md +32 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/steps.md +114 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-review/SKILL.md +61 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/validar-mudanca/SKILL.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/decisao-arquitetura.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/especificacao-tarefa.md +32 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/relatorio-validacao.md +30 -0
- package/seedgridKB/SeedGrid/Versoes.md +64 -0
- package/seedgridKB/SeedGrid/Visao-geral.md +35 -0
- package/seedgridKB/manifest.json +142 -0
|
@@ -0,0 +1,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() }`.
|