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