@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,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, library, cache, enum]
|
|
3
|
+
fonte: java/seedgrid-quarkus-lib-cache
|
|
4
|
+
branch: main
|
|
5
|
+
commit: 14bd916a09
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# SeedGrid Cache — Enums
|
|
10
|
+
|
|
11
|
+
Voltar: [[SeedGrid/Extensions/cache/Visao-geral|Visão geral do cache]] · [[SeedGrid/Extensions/cache/Configuracao|Configuração do cache]]
|
|
12
|
+
|
|
13
|
+
| Enum | Pacote/arquivo | Usado em | Público? |
|
|
14
|
+
|---|---|---|---|
|
|
15
|
+
| `CacheProviderFailSoft.Level` | `br.com.seedgrid.cache.core.commons.spi.CacheProviderFailSoft` | tipo lógico da propriedade `seedgrid.cache.if-provider-is-down` | Sim (enum aninhado `public`) |
|
|
16
|
+
|
|
17
|
+
## Level
|
|
18
|
+
|
|
19
|
+
Arquivo: `java/seedgrid-quarkus-lib-cache/seedgrid-cache-core/src/main/java/br/com/seedgrid/cache/core/commons/spi/CacheProviderFailSoft.java` — FQN `br.com.seedgrid.cache.core.commons.spi.CacheProviderFailSoft.Level`.
|
|
20
|
+
|
|
21
|
+
| Valor | Significado | Efeito / onde é tratado | Observações |
|
|
22
|
+
|---|---|---|---|
|
|
23
|
+
| `WARN` | Fail-soft: o backend distribuído falhou, a request continua. | `CacheProviderFailSoft#onFailure` loga WARN e retorna; `get` devolve o `fallback` (`Optional.empty()`, `0L`) e `run` vira no-op. **Confirmado.** | Padrão. Valor desconhecido ou ausente também resulta em `WARN`. |
|
|
24
|
+
| `ERROR` | Fail-closed: a request falha junto com o backend. | `onFailure` loga ERROR e relança a `RuntimeException` original. **Confirmado.** | Sem equivalente no Rust (lá ambos os níveis degradam). |
|
|
25
|
+
|
|
26
|
+
**Atributos/métodos:** sem campos; `static Level parse(String v)` — `null`/vazio/desconhecido → `WARN`; só `"ERROR"` (trim, case-insensitive) → `ERROR`.
|
|
27
|
+
|
|
28
|
+
**Leitura da configuração:** a propriedade é lida como `String` (`ConfigProvider.getConfig().getOptionalValue(PROP, String.class)`) e convertida por `Level.parse`, **não** pelo conversor de enum do SmallRye. Logo é **case-insensitive** e **valores inválidos não geram erro** (viram `WARN`). Relida a cada falha.
|
|
29
|
+
|
|
30
|
+
**Persistência / JSON:** não é persistido nem serializado.
|
|
31
|
+
|
|
32
|
+
**Onde é usado:** [[SeedGrid/Extensions/cache/Configuracao|seedgrid.cache.if-provider-is-down]]; consumido por `SeedGridCacheRedis`, `SeedGridCacheValkey` e `SeedGridCacheDragonfly` via `CacheProviderFailSoft.get/run`. Não se aplica ao `withLock` nem ao `DefaultSeedGridCache`.
|
|
33
|
+
|
|
34
|
+
## Internos
|
|
35
|
+
|
|
36
|
+
Nenhum.
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, library, cache, exemplos]
|
|
3
|
+
fonte: java/seedgrid-quarkus-lib-cache, java/examples/seedgrid-cache-example
|
|
4
|
+
branch: main
|
|
5
|
+
commit: 14bd916a09
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# SeedGrid Cache — Exemplos
|
|
10
|
+
|
|
11
|
+
Voltar: [[SeedGrid/Extensions/cache/Visao-geral|Visão geral do cache]] · [[SeedGrid/Extensions/cache/Configuracao|Configuração do cache]]
|
|
12
|
+
|
|
13
|
+
## Dependências (core + no máximo um provider)
|
|
14
|
+
|
|
15
|
+
```xml
|
|
16
|
+
<dependency>
|
|
17
|
+
<groupId>br.com.seedgrid</groupId>
|
|
18
|
+
<artifactId>seedgrid-cache-core</artifactId>
|
|
19
|
+
<version>2026.10.13</version>
|
|
20
|
+
</dependency>
|
|
21
|
+
<!-- opcional, escolha UM: seedgrid-cache-redis | seedgrid-cache-valkey | seedgrid-cache-dragonfly -->
|
|
22
|
+
<dependency>
|
|
23
|
+
<groupId>br.com.seedgrid</groupId>
|
|
24
|
+
<artifactId>seedgrid-cache-redis</artifactId>
|
|
25
|
+
<version>2026.10.13</version>
|
|
26
|
+
</dependency>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Fonte: `pom.xml` dos módulos (versão atual) + `README.md` (padrão de instalação).
|
|
30
|
+
|
|
31
|
+
## API básica
|
|
32
|
+
|
|
33
|
+
Fonte: `README.md` e assinaturas de `SeedGridCacheProvider`.
|
|
34
|
+
|
|
35
|
+
```java
|
|
36
|
+
@Inject
|
|
37
|
+
SeedGridCacheProvider cache;
|
|
38
|
+
|
|
39
|
+
cache.putString("user:42:name", "João", Duration.ofMinutes(10));
|
|
40
|
+
Optional<String> name = cache.getString("user:42:name");
|
|
41
|
+
|
|
42
|
+
cache.putBytes("img:42", bytes, Duration.ofHours(1));
|
|
43
|
+
Optional<byte[]> img = cache.getBytes("img:42");
|
|
44
|
+
|
|
45
|
+
cache.putLong("quota:42", 100L, null); // ttl null/zero/negativo = sem expiração
|
|
46
|
+
OptionalLong quota = cache.getLong("quota:42");
|
|
47
|
+
|
|
48
|
+
long hits = cache.increment("hits:42", Duration.ofMinutes(1)); // TTL só na 1ª chamada (janela)
|
|
49
|
+
cache.delete("user:42:name");
|
|
50
|
+
|
|
51
|
+
// Lock exclusivo por chave (distribuído nos providers RESP; JVM-local no default)
|
|
52
|
+
String result = cache.withLock("job:import", Duration.ofSeconds(30), () -> {
|
|
53
|
+
// seção crítica
|
|
54
|
+
return "ok";
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`withLock` lança `IllegalStateException` se o lock já estiver tomado (providers RESP) — não há espera.
|
|
59
|
+
|
|
60
|
+
## Cache-aside (exemplo real)
|
|
61
|
+
|
|
62
|
+
Fonte: `java/examples/seedgrid-cache-example/src/main/java/br/com/seedgrid/cacheexample/service/CatalogService.java` (trecho).
|
|
63
|
+
|
|
64
|
+
```java
|
|
65
|
+
@ApplicationScoped
|
|
66
|
+
public class CatalogService {
|
|
67
|
+
private static final String KEY_PREFIX = "catalog:item:";
|
|
68
|
+
private final SeedGridCacheProvider cache;
|
|
69
|
+
private final Duration ttl;
|
|
70
|
+
|
|
71
|
+
@Inject
|
|
72
|
+
public CatalogService(
|
|
73
|
+
SeedGridCacheProvider cache,
|
|
74
|
+
@ConfigProperty(name = "seedgrid.cache.example.item-ttl", defaultValue = "PT30S") Duration ttl) {
|
|
75
|
+
this.cache = cache;
|
|
76
|
+
this.ttl = ttl;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public ItemLookup get(String id) {
|
|
80
|
+
String key = KEY_PREFIX + id;
|
|
81
|
+
Optional<String> cached = cache.getString(key);
|
|
82
|
+
if (cached.isPresent()) {
|
|
83
|
+
return new ItemLookup(id, cached.get(), true, realExecutions.get());
|
|
84
|
+
}
|
|
85
|
+
String value = expensiveLookup(id);
|
|
86
|
+
cache.putString(key, value, ttl);
|
|
87
|
+
return new ItemLookup(id, value, false, realExecutions.get());
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public void evict(String id) {
|
|
91
|
+
cache.delete(KEY_PREFIX + id);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
O exemplo roda só com `seedgrid-cache-core` (in-memory). `seedgrid.cache.example.item-ttl` é propriedade **do exemplo**.
|
|
97
|
+
|
|
98
|
+
## Configuração por cenário
|
|
99
|
+
|
|
100
|
+
```properties
|
|
101
|
+
# Redis/Valkey/Dragonfly (mesmo esquema redis://)
|
|
102
|
+
seedgrid.cache.hosts=redis://<host>:6379
|
|
103
|
+
seedgrid.cache.password=<SEGREDO:cache-password>
|
|
104
|
+
|
|
105
|
+
# Falhar a request quando o backend cair, em vez de degradar
|
|
106
|
+
seedgrid.cache.if-provider-is-down=ERROR
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Detalhes e padrões: [[SeedGrid/Extensions/cache/Configuracao|Configuração do cache]].
|
|
110
|
+
|
|
111
|
+
## Teste com Testcontainers só via alias
|
|
112
|
+
|
|
113
|
+
Fonte: `seedgrid-cache-redis/src/test/java/.../RedisAliasTestResource.java` e `SeedGridCacheRedisConfigAliasIT.java`.
|
|
114
|
+
|
|
115
|
+
```java
|
|
116
|
+
public class RedisAliasTestResource implements QuarkusTestResourceLifecycleManager {
|
|
117
|
+
private final GenericContainer<?> redis =
|
|
118
|
+
new GenericContainer<>("redis:7-alpine").withExposedPorts(6379);
|
|
119
|
+
|
|
120
|
+
@Override
|
|
121
|
+
public Map<String, String> start() {
|
|
122
|
+
redis.start();
|
|
123
|
+
String hosts = "redis://" + redis.getHost() + ":" + redis.getMappedPort(6379);
|
|
124
|
+
return Map.of("seedgrid.cache.hosts", hosts);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@Override
|
|
128
|
+
public void stop() { redis.stop(); }
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
@QuarkusTest
|
|
132
|
+
@QuarkusTestResource(RedisAliasTestResource.class)
|
|
133
|
+
class SeedGridCacheRedisConfigAliasIT {
|
|
134
|
+
@Inject SeedGridCacheRedis cache;
|
|
135
|
+
|
|
136
|
+
@Test
|
|
137
|
+
void providerWorksThroughAliasConfiguredDataSource() {
|
|
138
|
+
cache.putString("k", "via-alias", Duration.ofSeconds(30));
|
|
139
|
+
assertEquals("via-alias", cache.getString("k").orElseThrow());
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Com `src/test/resources/application.properties`:
|
|
145
|
+
|
|
146
|
+
```properties
|
|
147
|
+
quarkus.redis.devservices.enabled=false
|
|
148
|
+
quarkus.arc.selected-alternatives=br.com.seedgrid.cache.redis.commons.spi.SeedGridCacheRedis
|
|
149
|
+
```
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, cache, rust]
|
|
3
|
+
fonte: rust/seedgrid-rust-crate-cache
|
|
4
|
+
branch: main
|
|
5
|
+
commit: be738a2d1e
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# cache — porte Rust (`seedgrid-rust-crate-cache`)
|
|
10
|
+
|
|
11
|
+
Porte da lib Java `seedgrid-quarkus-lib-cache` (módulos `cache-core`, `cache-redis`, `cache-valkey`, `cache-dragonfly`). Lado Java: [[SeedGrid/Extensions/cache/Visao-geral|Visão geral do cache (Java)]] · [[SeedGrid/Extensions/cache/Configuracao|Configuração do cache (Java)]]. Configuração Rust: [[SeedGrid/Extensions/cache/Configuracao-Rust|Configuração Rust do cache]].
|
|
12
|
+
|
|
13
|
+
Cache independente de provedor: uma API (`SeedGridCacheProvider`) sobre Redis, Valkey ou Dragonfly (todos via protocolo RESP, uma única implementação `RedisCache`) e um backend **in-memory**, que é o padrão. **Confirmado** (`src/lib.rs`, `src/factory.rs`).
|
|
14
|
+
|
|
15
|
+
## Identificação
|
|
16
|
+
| Item | Valor |
|
|
17
|
+
|---|---|
|
|
18
|
+
| Pacote Cargo | `seedgrid-rust-crate-cache` (lib `seedgrid_cache`) |
|
|
19
|
+
| Versão | workspace `2026.10.14` |
|
|
20
|
+
| Dependências SeedGrid | nenhuma |
|
|
21
|
+
| Consumidores (Cargo.toml) | runtime, backup, login-tenancy, resilience, security, subdomain-tenancy |
|
|
22
|
+
|
|
23
|
+
## API pública
|
|
24
|
+
| Símbolo | Papel | Fonte |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| trait `SeedGridCacheProvider` | `get_string`/`put_string`, `get_bytes`/`put_bytes`, `get_long`/`put_long`, `increment`, `increment_ttl`, `delete`, `acquire_lock`, `release_lock` (TTL opcional) | `src/provider.rs` |
|
|
27
|
+
| trait `SeedGridCacheProviderExt` | `with_lock(key, ttl, closure)` (libera o lock mesmo em panic) | `src/provider.rs` |
|
|
28
|
+
| `InMemoryCache::new()` | backend local (default) | `src/memory.rs` |
|
|
29
|
+
| `RedisCache::connect(&CacheConfig)`, `connect_url(url)`, `from_connection(conn)`, `with_provider_down_log(mode)` | backend RESP; aliases `ValkeyCache`, `DragonflyCache`; enum `DistributedFlavor` (informativo) | `src/redis_backend.rs` |
|
|
30
|
+
| `CacheBackend::{InMemory, Distributed{flavor, config}}`, `build(backend)`, `default_cache()` | fábrica | `src/factory.rs` |
|
|
31
|
+
| `CacheConfig`, `ProviderDownLog` | config | `src/config.rs` |
|
|
32
|
+
| `CacheError`, `CacheResult` | erros | `src/error.rs` |
|
|
33
|
+
|
|
34
|
+
## Comportamento
|
|
35
|
+
- Operações do backend distribuído são **fail-soft**: em falha, devolvem ausência/`0`/no-op e logam em `WARN` ou `ERROR` conforme `ProviderDownLog`. No Java, `ERROR` é fail-closed (relança); no Rust é sempre fail-soft.
|
|
36
|
+
- Só o primeiro host de `hosts` é usado.
|
|
37
|
+
- O lock in-memory não é reentrante (`tokio::Mutex`), ao contrário do `ReentrantLock` Java (intencional).
|
|
38
|
+
|
|
39
|
+
## Exemplo (de `rust/examples/seedgrid-cache-example/src/main.rs`)
|
|
40
|
+
```rust
|
|
41
|
+
let config = CacheConfig::from_env();
|
|
42
|
+
let cache = RedisCache::connect(&config).await?;
|
|
43
|
+
cache.put_string(&k_str, "olá seedgrid", None).await;
|
|
44
|
+
let got = cache.get_string(&k_str).await;
|
|
45
|
+
cache.put_string(&k_ttl, "efêmero", Some(Duration::from_secs(1))).await;
|
|
46
|
+
let a = cache.increment(&k_ctr).await;
|
|
47
|
+
```
|
|
48
|
+
Em memória (doc de `src/lib.rs`):
|
|
49
|
+
```rust
|
|
50
|
+
let cache = InMemoryCache::new();
|
|
51
|
+
let hits = cache.increment_ttl("hits:42", Some(Duration::from_secs(60))).await;
|
|
52
|
+
let out = cache.with_lock("job:import", Duration::from_secs(30), || async { 42 }).await.unwrap();
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Testes
|
|
56
|
+
- `tests/in_memory.rs`, `tests/java_behavior_parity.rs`, `tests/redis_backend.rs` (Redis real via `SEEDGRID_CACHE_TEST_URL`, `#[ignore]`); testes de alias em `src/config.rs` (porte de `SeedGridCacheConfigRelocateInterceptorTest`).
|
|
57
|
+
- E2E no exemplo: `rust/examples/seedgrid-cache-example/tests/redis_e2e.rs`.
|
|
58
|
+
- **Não executados.**
|
|
59
|
+
|
|
60
|
+
## Notas de comportamento
|
|
61
|
+
|
|
62
|
+
- `timeout` é aplicado à conexão e à resposta; durações `PTnS` são aceitas.
|
|
63
|
+
- Com URL com esquema, a senha é injetada na conexão.
|
|
64
|
+
- Operações do backend distribuído são sempre fail-soft (ver `ProviderDownLog`).
|
|
65
|
+
- Lock reentrante; o lock é liberado mesmo em panic.
|
|
66
|
+
- Com múltiplos hosts, só o primeiro é usado.
|
|
67
|
+
- A superfície de configuração é de 4 propriedades.
|
|
68
|
+
|
|
69
|
+
## Enums
|
|
70
|
+
Java: [[SeedGrid/Extensions/cache/Enums|Enums do cache (Java)]].
|
|
71
|
+
|
|
72
|
+
| Enum | Arquivo | Java equivalente |
|
|
73
|
+
|---|---|---|
|
|
74
|
+
| `ProviderDownLog` | `src/config.rs` | [[SeedGrid/Extensions/cache/Enums#Level\|Level]] (`seedgrid.cache.if-provider-is-down`) |
|
|
75
|
+
| `CacheBackend` (`InMemory`, `Distributed{flavor, config}`) | `src/factory.rs` | seleção por módulo no classpath |
|
|
76
|
+
| `DistributedFlavor` (`Redis`, `Valkey`, `Dragonfly`) | `src/redis_backend.rs` | módulos `cache-redis`/`-valkey`/`-dragonfly`; **informativo** (mesma implementação) |
|
|
77
|
+
| `LockGuard` (`InMemory`, `Distributed{lock_key, token}`) | `src/provider.rs` | interno (retorno de `acquire_lock`) |
|
|
78
|
+
| `CacheError` (`LockNotAcquired`, `Backend`, `Other`) | `src/error.rs` | — |
|
|
79
|
+
|
|
80
|
+
### ProviderDownLog
|
|
81
|
+
`Warn` (padrão), `Error`. `from_config_value`: trim, case-insensitive; `ERROR` → `Error`, **qualquer outro valor** → `Warn`. Lido de `SEEDGRID_CACHE_IF_PROVIDER_IS_DOWN` (sem fallback `QUARKUS_REDIS_*`). **Comportamento**: no Rust os dois valores degradam (fail-soft) e só mudam o nível do log; no Java `ERROR` é fail-closed e relança a exceção.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, library, cache]
|
|
3
|
+
fonte: java/seedgrid-quarkus-lib-cache
|
|
4
|
+
branch: main
|
|
5
|
+
commit: 14bd916a09
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# SeedGrid Cache — Visão geral
|
|
10
|
+
|
|
11
|
+
> [!info] Library, não extension Quarkus
|
|
12
|
+
> `seedgrid-quarkus-lib-cache` é uma **library Java** (jars comuns com índice Jandex), **não** uma extension Quarkus com módulos `runtime`/`deployment`. Não há `@ConfigRoot`, build steps nem processors. Está documentada nesta estrutura apenas por uniformidade.
|
|
13
|
+
|
|
14
|
+
Configuração: [[SeedGrid/Extensions/cache/Configuracao|Configuração do cache]] · Enums: [[SeedGrid/Extensions/cache/Enums|Enums do cache]] · Exemplos: [[SeedGrid/Extensions/cache/Exemplos|Exemplos do cache]] · [[SeedGrid/Extensions/cache/Rust|Porte Rust]]
|
|
15
|
+
|
|
16
|
+
## Objetivo
|
|
17
|
+
|
|
18
|
+
Cache **agnóstico de provider**: uma única API (`SeedGridCacheProvider`) sobre Redis, Valkey ou Dragonfly (todos falam RESP e usam o mesmo `quarkus-redis-client`), com fallback in-memory quando nenhum provider distribuído está no classpath. O backend é escolhido **pela dependência** adicionada, não por propriedade. **Confirmado** (`pom.xml` raiz, `README.md`).
|
|
19
|
+
|
|
20
|
+
Funcionalidades (**Confirmado** em `SeedGridCacheProvider`):
|
|
21
|
+
- key/value `String`, `byte[]` e `long` com TTL (`Duration`);
|
|
22
|
+
- contador atômico `increment(key)` e `increment(key, ttl)` (INCR + EXPIRE só na 1ª chamada, via Lua);
|
|
23
|
+
- `delete(key)`;
|
|
24
|
+
- lock exclusivo por chave `withLock(key, ttl, Supplier)` — JVM `ReentrantLock` no default, `SET NX PX` + unlock por token (Lua) nos providers RESP;
|
|
25
|
+
- política de falha do backend configurável (`seedgrid.cache.if-provider-is-down`, WARN fail-soft / ERROR fail-closed);
|
|
26
|
+
- fachada de configuração `seedgrid.cache.*` como alias de `quarkus.redis.*`.
|
|
27
|
+
|
|
28
|
+
## Módulos Maven e coordenadas
|
|
29
|
+
|
|
30
|
+
| Módulo | groupId:artifactId | Versão | Papel |
|
|
31
|
+
|---|---|---|---|
|
|
32
|
+
| (agregador, `pom`) | `br.com.seedgrid:seedgrid-cache` | `2026.10.13` | parent dos módulos; importa `quarkus-bom` 3.30.8; parent `seedgrid-parent` 2026.07.02 |
|
|
33
|
+
| `seedgrid-cache-core` | `br.com.seedgrid:seedgrid-cache-core` | `2026.10.13` | SPI, `DefaultSeedGridCache` (in-memory), `CacheProviderFailSoft`, `SeedGridCacheConfigRelocateInterceptor` |
|
|
34
|
+
| `seedgrid-cache-redis` | `br.com.seedgrid:seedgrid-cache-redis` | `2026.10.13` | `SeedGridCacheRedis` |
|
|
35
|
+
| `seedgrid-cache-valkey` | `br.com.seedgrid:seedgrid-cache-valkey` | `2026.10.13` | `SeedGridCacheValkey` |
|
|
36
|
+
| `seedgrid-cache-dragonfly` | `br.com.seedgrid:seedgrid-cache-dragonfly` | `2026.10.13` | `SeedGridCacheDragonfly` |
|
|
37
|
+
|
|
38
|
+
Fonte: `java/seedgrid-quarkus-lib-cache/pom.xml` e `*/pom.xml`. **Confirmado.**
|
|
39
|
+
|
|
40
|
+
Dependências relevantes: `core` → `quarkus-arc` (provided), `smallrye-config-core` (provided). Providers → `seedgrid-cache-core`, `quarkus-redis-client` (compile). Nenhuma dependência de outras libs/extensions SeedGrid. **Confirmado.**
|
|
41
|
+
|
|
42
|
+
## Arquitetura
|
|
43
|
+
|
|
44
|
+
```mermaid
|
|
45
|
+
flowchart LR
|
|
46
|
+
APP["App<br/>@Inject SeedGridCacheProvider"] --> SPI["SeedGridCacheProvider"]
|
|
47
|
+
SPI -->|"sem provider no classpath<br/>@DefaultBean"| MEM["DefaultSeedGridCache<br/>(ConcurrentHashMap)"]
|
|
48
|
+
SPI -->|"@Alternative @Priority(1)"| R["SeedGridCacheRedis / Valkey / Dragonfly"]
|
|
49
|
+
R --> FS["CacheProviderFailSoft<br/>(seedgrid.cache.if-provider-is-down)"]
|
|
50
|
+
FS --> DS["RedisDataSource (@Default)<br/>quarkus-redis-client"]
|
|
51
|
+
CFG["seedgrid.cache.*"] -. "RelocateConfigSourceInterceptor<br/>(ServiceLoader)" .-> QR["quarkus.redis.*"]
|
|
52
|
+
QR --> DS
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
- **Seleção do bean** (**Confirmado** pelas anotações): `DefaultSeedGridCache` é `@ApplicationScoped @DefaultBean`; cada provider é `@ApplicationScoped @Alternative @Priority(1)` (alternativa habilitada globalmente). Colocar **dois** providers no classpath gera resolução ambígua — **Confirmado** como aviso em `README.adoc` ("colocar mais de um simultaneamente causa resolução ambígua"); não há teste que comprove.
|
|
56
|
+
- **Fail-soft** (**Confirmado**, `CacheProviderFailSoft`): `get/put/increment/delete` dos providers RESP são envolvidos; em `RuntimeException` do backend, `WARN` loga e devolve fallback (`Optional.empty()`, `0L`, no-op), `ERROR` loga e relança. `withLock` **não** é envolvido: falha de conexão propaga sempre, e lock não adquirido lança `IllegalStateException("Could not acquire lock: ...")` (sem espera/retry).
|
|
57
|
+
- **Alias de config** (**Confirmado**, `SeedGridCacheConfigRelocateInterceptor` + `META-INF/services/io.smallrye.config.ConfigSourceInterceptor`): `@Priority(Priorities.LIBRARY + 200)`, reloca todo nome `quarkus.redis.<x>` para `seedgrid.cache.<x>` e só cai no nome original se o relocado não tiver valor.
|
|
58
|
+
- Chaves de lock: `<key>:lock`. TTL `null`/zero/negativo = sem expiração (SET em vez de SETEX). `getLong` devolve vazio se o valor não for numérico. **Confirmado.**
|
|
59
|
+
- `DefaultSeedGridCache`: TTL em milissegundos com limpeza preguiçosa na leitura; `getBytes`/`putBytes` fazem cópia defensiva; `withLock` ignora o `ttl` (lock JVM local). **Confirmado.**
|
|
60
|
+
|
|
61
|
+
## APIs públicas e pontos de integração
|
|
62
|
+
|
|
63
|
+
| Tipo | Símbolo | Observação |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| Interface SPI | `br.com.seedgrid.cache.core.commons.spi.SeedGridCacheProvider` | `getString/putString`, `getBytes/putBytes`, `getLong/putLong`, `increment(key)`, `increment(key, ttl)`, `delete`, `<T> withLock(key, ttl, Supplier<T>)` |
|
|
66
|
+
| Bean CDI default | `...core.commons.spi.impl.DefaultSeedGridCache` | in-memory, `@DefaultBean` |
|
|
67
|
+
| Beans CDI alternativos | `SeedGridCacheRedis`, `SeedGridCacheValkey`, `SeedGridCacheDragonfly` | injetam `RedisDataSource` padrão (`@Default`) |
|
|
68
|
+
| Utilitário público | `CacheProviderFailSoft` (`get`, `run`, `Level.parse`, constante `PROP`) | usado pelos providers; reutilizável por quem implementar outro provider |
|
|
69
|
+
| SmallRye `ConfigSourceInterceptor` | `...core.config.SeedGridCacheConfigRelocateInterceptor` | registrado via ServiceLoader |
|
|
70
|
+
|
|
71
|
+
Não há endpoints REST, eventos CDI, migrations nem anotações próprias.
|
|
72
|
+
|
|
73
|
+
## Testes existentes (não executados)
|
|
74
|
+
|
|
75
|
+
| Local | Tipo | Cobre |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| `seedgrid-cache-core/src/test/.../SeedGridCacheConfigRelocateInterceptorTest` | unit | alias `seedgrid.cache.*` → `quarkus.redis.*`, fallback e precedência |
|
|
78
|
+
| `seedgrid-cache-{redis,valkey,dragonfly}/src/test/.../*ConfigAliasIT` + `*AliasTestResource` | `@QuarkusTest` + Testcontainers | prova end-to-end que só `seedgrid.cache.hosts` configura o `RedisDataSource` |
|
|
79
|
+
| `seedgrid-cache-{redis,valkey,dragonfly}/src/test/.../*IT` | integração (Testcontainers) | operações reais contra o servidor |
|
|
80
|
+
| `SeedGridCacheValkeyTest`, `SeedGridCacheDragonflyTest` | unit (Mockito) | seleção set/setex, INCR vs EVAL |
|
|
81
|
+
|
|
82
|
+
Nenhum teste cobre `seedgrid.cache.if-provider-is-down` (busca por `FailSoft`/`if-provider` em `src/test` sem resultado). Testes **não executados** nesta análise.
|
|
83
|
+
|
|
84
|
+
## Limitações
|
|
85
|
+
|
|
86
|
+
- Só o `RedisDataSource` `@Default` é usado; clientes nomeados não são suportados pelos providers. **Confirmado** (injeção sem qualifier).
|
|
87
|
+
- `withLock` não é fail-soft e não tem espera; `DefaultSeedGridCache.withLock` é local à JVM.
|
|
88
|
+
- Não há API genérica de objetos (apenas `String`/`byte[]`/`long`); serialização fica a cargo do app. **Confirmado** (comentário em `CatalogService` do exemplo).
|
|
89
|
+
- No Java `ERROR` é fail-closed; no Rust ambos os níveis são fail-soft. Ver [[SeedGrid/Extensions/cache/Rust|Porte Rust]].
|
|
90
|
+
- Clientes nomeados: `quarkus.redis.<nome>.*` também é relocado para `seedgrid.cache.<nome>.*` (relocate por prefixo) — ver [[SeedGrid/Extensions/cache/Configuracao|Configuração do cache]].
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, library, commons, configuracao]
|
|
3
|
+
fonte: java/seedgrid-quarkus-lib-commons
|
|
4
|
+
branch: main
|
|
5
|
+
commit: fa49c344db
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# SeedGrid Commons — Configuração
|
|
10
|
+
|
|
11
|
+
Voltar: [[SeedGrid/Extensions/commons/Visao-geral|Visão geral do commons]] · [[SeedGrid/Extensions/commons/Exemplos|Exemplos do commons]]
|
|
12
|
+
|
|
13
|
+
## 1. Cabeçalho
|
|
14
|
+
|
|
15
|
+
| Item | Valor |
|
|
16
|
+
|---|---|
|
|
17
|
+
| Prefixos | `seedgrid.app.*`, `seedgrid.web.cors.*`, `seedgrid.show-dev-message`, `app.build.version` (sem prefixo `seedgrid`) |
|
|
18
|
+
| Classes de config | Nenhuma `@ConfigMapping`/`@ConfigRoot`. `@ConfigProperty` em beans CDI: `BusinessTimeZone`, `CorsConfig`, `ApiExceptionHandler`, `StartupBannerLogger`. `ConfigProvider` em `ValidEmailValidator` (só lê `quarkus.profile`) |
|
|
19
|
+
| Arquivos de config da lib | Nenhum (`src/main/resources` não existe; sem `microprofile-config.properties`) |
|
|
20
|
+
| Fase | Runtime — valores injetados na criação de cada bean (`@ApplicationScoped`: na primeira utilização; `StartupBannerLogger`: no `StartupEvent`). Não há releitura posterior |
|
|
21
|
+
|
|
22
|
+
Investigado: `@ConfigMapping`, `@ConfigRoot`, `@ConfigProperty`, `ConfigProvider`, `System.getenv/getProperty`, `@IfBuildProperty`/`@LookupIfProperty`, resources. Nenhum teste da lib define propriedades (testes unitários instanciam as classes diretamente).
|
|
23
|
+
|
|
24
|
+
## 2. Propriedades próprias
|
|
25
|
+
|
|
26
|
+
### 2.1 Fuso de negócio
|
|
27
|
+
|
|
28
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
|
|
29
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
30
|
+
| `seedgrid.app.business-timezone` | `String` → `ZoneId` | qualquer ID aceito por `ZoneId.of` (ex.: `America/Sao_Paulo`, `UTC`) | `America/Sao_Paulo` | Não | Valor vazio **ou inválido** cai silenciosamente para `America/Sao_Paulo` (sem log) | `BusinessTimeZone#zoneId()` — converter instantes em datas civis (ciclos de cobrança/consumo) | Consumido por extensions que injetam `BusinessTimeZone` (ex.: billing — **Inferência** pelo Javadoc) | Runtime (construtor do bean) | `java/seedgrid-quarkus-lib-commons/src/main/java/br/com/seedgrid/commons/core/time/BusinessTimeZone.java` → construtor + `resolve(String)` |
|
|
31
|
+
|
|
32
|
+
### 2.2 CORS (`CorsFilter`)
|
|
33
|
+
|
|
34
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
|
|
35
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
36
|
+
| `seedgrid.web.cors.allow-origins` | `List<String>` (separada por vírgula) | origens exatas (`esquema://host[:porta]`); comparação por igualdade exata, sem curinga | `http://localhost:3000,http://localhost:4200` | Não (mas em produção o padrão só libera localhost) | Preflight `OPTIONS` de origem fora da lista → **403**; requisição não-preflight de origem fora da lista segue sem headers CORS; origem `"null"` → 403 sempre | `CorsFilter#filter(request)` e `#filter(request, response)` via `CorsConfig#getAllowOrigins()` | Independente de `quarkus.http.cors.*` (interação não verificada) | Runtime | `.../commons/web/cors/CorsConfig.java` → campo `allowOrigins`; consumo `.../web/cors/CorsFilter.java` |
|
|
37
|
+
| `seedgrid.web.cors.allow-methods` | `String` | lista de métodos HTTP separada por vírgula (copiada literalmente no header) | `GET,POST,PUT,PATCH,DELETE,OPTIONS` | Não | Valor de `Access-Control-Allow-Methods` na resposta ao preflight; **não** é usado para bloquear métodos | `CorsFilter#filter(request)` (preflight) via `CorsConfig#getAllowMethods()` | — | Runtime | `CorsConfig.java` → campo `allowMethods` |
|
|
38
|
+
|
|
39
|
+
Headers fixos (não configuráveis): `Access-Control-Allow-Headers`, `Access-Control-Allow-Credentials: true`, `Access-Control-Max-Age: 0`, `Access-Control-Expose-Headers: Location,Link`. **Confirmado.**
|
|
40
|
+
|
|
41
|
+
### 2.3 Tratamento de exceções
|
|
42
|
+
|
|
43
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
|
|
44
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
45
|
+
| `seedgrid.show-dev-message` | `boolean` | `true`/`false` | `false` | Não | `true` preenche `devMessage` no Problem Details (mensagem técnica da exceção / violações); `false` devolve `devMessage` vazio. Valor é logado em INFO na criação do handler | `ApiExceptionHandler#resolveDevMessage` (todas as respostas do handler, inclusive via `ConstraintViolationExceptionMapper`) | Recomendado `false` em produção (evita vazar detalhes) — **Inferência** | Runtime | `.../commons/web/exceptions/ApiExceptionHandler.java` → construtor |
|
|
46
|
+
|
|
47
|
+
### 2.4 Banner de inicialização
|
|
48
|
+
|
|
49
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
|
|
50
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
51
|
+
| `app.build.version` | `String` | livre | `dev` | Não | Impresso em `System.out` como `Versao: <valor>` após o `banner.txt` do classpath (se existir) | `StartupBannerLogger#onStart(StartupEvent)` | Convenção dos hosts: `app.build.version=${APP_VERSION:dev}` (comentário no código) | Runtime (startup) | `.../commons/core/startup/StartupBannerLogger.java` → campo `buildVersion` |
|
|
52
|
+
|
|
53
|
+
Variáveis de ambiente pela regra MP (**Inferência**, nomes sem ambiguidade na leitura por nome exato): `SEEDGRID_APP_BUSINESS_TIMEZONE`, `SEEDGRID_WEB_CORS_ALLOW_ORIGINS`, `SEEDGRID_WEB_CORS_ALLOW_METHODS`, `SEEDGRID_SHOW_DEV_MESSAGE`, `APP_BUILD_VERSION`.
|
|
54
|
+
|
|
55
|
+
## 3. Propriedades de frameworks lidas
|
|
56
|
+
|
|
57
|
+
| Propriedade | Como é lida | Efeito | Origem |
|
|
58
|
+
|---|---|---|---|
|
|
59
|
+
| `quarkus.profile` | Ordem: system property `quarkus.profile` → env `QUARKUS_PROFILE` (lida diretamente via `System.getenv`) → `ConfigProvider` | `@ValidEmail` bloqueia domínios descartáveis (lista fixa no código: yopmail, mailinator, 10minutemail etc.) **somente** se `LaunchMode.current() == NORMAL` **e** o perfil for `prod` ou não estiver definido | `.../core/validators/ValidEmailValidator.java` → `shouldBlockDisposableDomains()`, `resolveNormalProfile()` |
|
|
60
|
+
|
|
61
|
+
A lib também precisa, no host, de Hibernate ORM configurado se usar `BaseEntity`/embeddables, e de `quarkus-rest-jackson` (dependência *optional* aqui) para `CorsFilter`/`ApiExceptionHandler` — **Inferência** pelo escopo `optional` no pom.
|
|
62
|
+
|
|
63
|
+
## 4. Propriedades só de testes/exemplos
|
|
64
|
+
|
|
65
|
+
Nenhuma (os testes não usam `application.properties`).
|
|
66
|
+
|
|
67
|
+
## 5. Aliases, obsoletas, renomeações
|
|
68
|
+
|
|
69
|
+
Nenhuma encontrada.
|
|
70
|
+
|
|
71
|
+
## 6. Configuração mínima
|
|
72
|
+
|
|
73
|
+
Nenhuma propriedade é obrigatória. Para produção, o mínimo sensato:
|
|
74
|
+
|
|
75
|
+
```properties
|
|
76
|
+
seedgrid.web.cors.allow-origins=https://<app.seudominio>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 7. Configuração completa comentada
|
|
80
|
+
|
|
81
|
+
```properties
|
|
82
|
+
# Fuso usado para converter instantes em datas civis (ZoneId válido; inválido volta ao padrão)
|
|
83
|
+
seedgrid.app.business-timezone=America/Sao_Paulo
|
|
84
|
+
|
|
85
|
+
# CORS do CorsFilter da lib (origens exatas, separadas por vírgula)
|
|
86
|
+
seedgrid.web.cors.allow-origins=https://<app.seudominio>,https://<admin.seudominio>
|
|
87
|
+
seedgrid.web.cors.allow-methods=GET,POST,PUT,PATCH,DELETE,OPTIONS
|
|
88
|
+
|
|
89
|
+
# Expor detalhes técnicos em devMessage do Problem Details (padrão false)
|
|
90
|
+
seedgrid.show-dev-message=false
|
|
91
|
+
|
|
92
|
+
# Versão exibida no banner de startup (padrão "dev")
|
|
93
|
+
app.build.version=${APP_VERSION:dev}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## 8. Receitas
|
|
97
|
+
|
|
98
|
+
- **Front em outro domínio**: liste a origem exata em `seedgrid.web.cors.allow-origins` (inclua porta em dev).
|
|
99
|
+
- **Depurar erros 500 em dev**: `%dev.seedgrid.show-dev-message=true` (perfil MP) e mantenha `false` em prod.
|
|
100
|
+
- **Operação fora do Brasil**: `seedgrid.app.business-timezone=<ZoneId>`.
|
|
101
|
+
- **Aceitar e-mails descartáveis em homologação**: rode com `quarkus.profile` ≠ `prod` (ex.: `QUARKUS_PROFILE=staging`).
|
|
102
|
+
|
|
103
|
+
## 9. Dúvidas e lacunas
|
|
104
|
+
|
|
105
|
+
- Valor inválido de `seedgrid.app.business-timezone` é ignorado sem aviso — risco de configuração silenciosa.
|
|
106
|
+
- Interação entre `CorsFilter` e `quarkus.http.cors` não documentada/testada.
|
|
107
|
+
- A lib depende de `seedgrid-privacy`; as propriedades `seedgrid.privacy.*` afetam `Address`/`Contact`, mas pertencem à lib privacy: [[SeedGrid/Extensions/privacy/Configuracao|Configuração do privacy]].
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, library, commons, enum]
|
|
3
|
+
fonte: java/seedgrid-quarkus-lib-commons
|
|
4
|
+
branch: main
|
|
5
|
+
commit: fa49c344db
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# SeedGrid Commons — Enums
|
|
10
|
+
|
|
11
|
+
Voltar: [[SeedGrid/Extensions/commons/Visao-geral|Visão geral do commons]] · [[SeedGrid/Extensions/commons/Configuracao|Configuração do commons]]
|
|
12
|
+
|
|
13
|
+
| Enum | Pacote/arquivo | Usado em | Público? |
|
|
14
|
+
|---|---|---|---|
|
|
15
|
+
| `StateEnum` | `br.com.seedgrid.commons.core.enums.StateEnum` | `Address.state` (coluna), DTOs de cadastro de outras extensions | Sim |
|
|
16
|
+
| `StateEnum.Regiao` | aninhado em `StateEnum.java` | atributo `regiao` de `StateEnum` | Sim |
|
|
17
|
+
| `ProblemType` | `br.com.seedgrid.commons.web.exceptions.ProblemType` | campo `type` do Problem Details | Sim |
|
|
18
|
+
|
|
19
|
+
## StateEnum
|
|
20
|
+
|
|
21
|
+
Arquivo: `java/seedgrid-quarkus-lib-commons/src/main/java/br/com/seedgrid/commons/core/enums/StateEnum.java`.
|
|
22
|
+
|
|
23
|
+
Os 27 valores são as UFs; cada um tem `sigla` (igual ao nome da constante), `nome`, `regiao` e `ibge` (código IBGE). **Confirmado** (código).
|
|
24
|
+
|
|
25
|
+
| Valor | Nome | Região | IBGE |
|
|
26
|
+
|---|---|---|---|
|
|
27
|
+
| `AC` | Acre | NORTE | 12 |
|
|
28
|
+
| `AL` | Alagoas | NORDESTE | 27 |
|
|
29
|
+
| `AP` | Amapá | NORTE | 16 |
|
|
30
|
+
| `AM` | Amazonas | NORTE | 13 |
|
|
31
|
+
| `BA` | Bahia | NORDESTE | 29 |
|
|
32
|
+
| `CE` | Ceará | NORDESTE | 23 |
|
|
33
|
+
| `DF` | Distrito Federal | CENTRO_OESTE | 53 |
|
|
34
|
+
| `ES` | Espírito Santo | SUDESTE | 32 |
|
|
35
|
+
| `GO` | Goiás | CENTRO_OESTE | 52 |
|
|
36
|
+
| `MA` | Maranhão | NORDESTE | 21 |
|
|
37
|
+
| `MT` | Mato Grosso | CENTRO_OESTE | 51 |
|
|
38
|
+
| `MS` | Mato Grosso do Sul | CENTRO_OESTE | 50 |
|
|
39
|
+
| `MG` | Minas Gerais | SUDESTE | 31 |
|
|
40
|
+
| `PA` | Pará | NORTE | 15 |
|
|
41
|
+
| `PB` | Paraíba | NORDESTE | 25 |
|
|
42
|
+
| `PR` | Paraná | SUL | 41 |
|
|
43
|
+
| `PE` | Pernambuco | NORDESTE | 26 |
|
|
44
|
+
| `PI` | Piauí | NORDESTE | 22 |
|
|
45
|
+
| `RJ` | Rio de Janeiro | SUDESTE | 33 |
|
|
46
|
+
| `RN` | Rio Grande do Norte | NORDESTE | 24 |
|
|
47
|
+
| `RS` | Rio Grande do Sul | SUL | 43 |
|
|
48
|
+
| `RO` | Rondônia | NORTE | 11 |
|
|
49
|
+
| `RR` | Roraima | NORTE | 14 |
|
|
50
|
+
| `SC` | Santa Catarina | SUL | 42 |
|
|
51
|
+
| `SP` | São Paulo | SUDESTE | 35 |
|
|
52
|
+
| `SE` | Sergipe | NORDESTE | 28 |
|
|
53
|
+
| `TO` | Tocantins | NORTE | 17 |
|
|
54
|
+
|
|
55
|
+
**Métodos:** `getSigla()`, `getNome()`, `getRegiao()`, `getIbge()`; `fromSigla(String)` (trim + maiúsculas; `Optional`); `fromNome(String)` (trim, ignora caixa; `Optional`); `toJson()`; `fromJson(String)` (tenta sigla, depois nome; `null` → `null`; desconhecido → `IllegalArgumentException("UF inválida: ...")`).
|
|
56
|
+
|
|
57
|
+
**Serialização:**
|
|
58
|
+
- **JSON:** `@JsonValue toJson()` → sempre a **sigla** (`"SP"`). Entrada via `@JsonCreator fromJson` aceita sigla (qualquer caixa) **ou** nome por extenso (`"São Paulo"`). **Confirmado.**
|
|
59
|
+
- **Persistência:** em `Address.state` é `@Enumerated(EnumType.STRING)` (grava o nome da constante, igual à sigla). A lib não traz migrations nem `CHECK`; a coluna e seus valores aceitos são do host. **Confirmado.**
|
|
60
|
+
- **Conversão fora do Jackson:** `valueOf(String)` aceita só a sigla exata (maiúscula); extensions que leem estado de config usam `StateEnum.valueOf(state.toUpperCase())` (security `CompanyService#parseState`, `FirstAdminBootstrapService#parseState`). Nome por extenso **não** funciona nesses pontos.
|
|
61
|
+
|
|
62
|
+
**Onde é usado:** `Address.state` (embeddable do commons); `InstitutionalSignupRequest.state` (login-tenancy); `TenantSignupRequest` (subdomain-tenancy); security (`CompanyService`, `FirstAdminBootstrapService`).
|
|
63
|
+
|
|
64
|
+
### StateEnum.Regiao
|
|
65
|
+
|
|
66
|
+
| Valor | Significado | Efeito / onde é tratado | Observações |
|
|
67
|
+
|---|---|---|---|
|
|
68
|
+
| `NORTE` | Região Norte | atributo informativo (`getRegiao()`) | nenhum código da lib decide por região |
|
|
69
|
+
| `NORDESTE` | Região Nordeste | idem | — |
|
|
70
|
+
| `CENTRO_OESTE` | Região Centro-Oeste | idem | — |
|
|
71
|
+
| `SUDESTE` | Região Sudeste | idem | — |
|
|
72
|
+
| `SUL` | Região Sul | idem | — |
|
|
73
|
+
|
|
74
|
+
Não é serializado isoladamente (o JSON de `StateEnum` é só a sigla).
|
|
75
|
+
|
|
76
|
+
## ProblemType
|
|
77
|
+
|
|
78
|
+
Arquivo: `java/seedgrid-quarkus-lib-commons/src/main/java/br/com/seedgrid/commons/web/exceptions/ProblemType.java`.
|
|
79
|
+
|
|
80
|
+
**Atributos (Lombok `@Getter`):** `uri` = `https://seedgrid.com.br` + caminho e `title`. Só `getUri()` é usado nas respostas (campo `type` do Problem Details); `getTitle()` não é lido por nenhum código do monorepo. O enum em si **não** é serializado.
|
|
81
|
+
|
|
82
|
+
| Valor | URI (`type`) | Significado | Efeito / onde é tratado | Observações |
|
|
83
|
+
|---|---|---|---|---|
|
|
84
|
+
| `DADOS_INVALIDOS` | `/dados-invalidos` | Dados de entrada inválidos | `ApiExceptionHandler`: `ConstraintViolationException` (400) e fallback de `WebApplicationException` sem outro mapeamento; usado também por billing e security | — |
|
|
85
|
+
| `ERRO_DE_SISTEMA` | `/erro-de-sistema` | Erro interno | `ApiExceptionHandler`: status ≥ 500 (inclui o 500 de exceção não tratada) | — |
|
|
86
|
+
| `PARAMETRO_INVALIDO` | `/parametro-invalido` | Parâmetro inválido | Nenhum código do monorepo usa este valor | Existe no enum; pode ser usado por hosts |
|
|
87
|
+
| `MENSAGEM_INCOMPREENSIVEL` | `/mensagem-incompreensivel` | Corpo ilegível/não processável | `ApiExceptionHandler`: `WebApplicationException` com 415 ou 422 | — |
|
|
88
|
+
| `RECURSO_NAO_ENCONTRADO` | `/recurso-nao-encontrado` | Recurso inexistente | `ApiExceptionHandler`: `NotFoundException` e status 404; usado por billing, security e login-tenancy | — |
|
|
89
|
+
| `ENTIDADE_EM_USO` | `/entidade-em-uso` | Conflito: entidade em uso | `ApiExceptionHandler`: status 409 de `WebApplicationException`; usado por billing (`PlanInUseException`) e security | `EntityInUseException` **não** usa este tipo (é `BusinessException` → `ERRO_NEGOCIO`, 400) |
|
|
90
|
+
| `ERRO_NEGOCIO` | `/erro-negocio` | Violação de regra de negócio | `ApiExceptionHandler`: `BusinessException` e subclasses (400) | — |
|
|
91
|
+
| `OBRIGATORIO_TROCA_DE_SENHA` | `/obrigatorio-troca-de-senha` | Troca de senha obrigatória | Nenhum código do monorepo usa este valor | Existe no enum; pode ser usado por hosts |
|
|
92
|
+
| `ACESSO_NEGADO` | `/acesso-negado` | Sem permissão (403) | `ApiExceptionHandler`: status 403; usado por security | — |
|
|
93
|
+
| `ERRO_AO_ENVIAR_O_EMAIL` | `/erro-ao-enviar-o-email` | Falha ao enviar e-mail | Nenhum código do monorepo usa este valor | Existe no enum; pode ser usado por hosts |
|
|
94
|
+
| `OPERACAO_NAO_PERMITIDA` | `/operacao-nao-permitida` | Operação bloqueada por regra | Usado por billing (exceções de plano/assinatura/quota) e security; não pelo handler do commons | — |
|
|
95
|
+
| `AUTENTICACAO_NEGADA` | `/autenticacao-negada` | Não autenticado (401) | `ApiExceptionHandler`: status 401; usado por security e billing | — |
|
|
96
|
+
| `SISTEMA_INDISPONIVEL` | `/sistema-indisponivel` | Serviço/provedor indisponível | Usado por billing (`ProviderOperationException`) e security | — |
|
|
97
|
+
| `RECURSO_NAO_SUPORTADO` | `/recurso-nao-suportado` | Recurso não suportado | Usado por billing (`CatalogNotSupportedException`, `UsageNotSupportedException`) | — |
|
|
98
|
+
|
|
99
|
+
Mapeamento por status no handler (`resolveProblemType`): 404→`RECURSO_NAO_ENCONTRADO`, 401→`AUTENTICACAO_NEGADA`, 403→`ACESSO_NEGADO`, 409→`ENTIDADE_EM_USO`, 415/422→`MENSAGEM_INCOMPREENSIVEL`, ≥500→`ERRO_DE_SISTEMA`, demais→`DADOS_INVALIDOS`. **Confirmado.**
|
|
100
|
+
|
|
101
|
+
**Onde é usado:** campo `type` das respostas `application/problem+json` — ver [[SeedGrid/Extensions/commons/Visao-geral|Visão geral do commons]] e as `ApiExceptionExtension` das demais extensions.
|
|
102
|
+
|
|
103
|
+
## Internos
|
|
104
|
+
|
|
105
|
+
Nenhum.
|