@seedgrid/ai-toolkit 0.0.0-stage → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +151 -2
  3. package/dist/adapters/claude.js +114 -0
  4. package/dist/adapters/codex.js +108 -0
  5. package/dist/adapters/index.js +17 -0
  6. package/dist/adapters/shared.js +142 -0
  7. package/dist/adapters/types.js +1 -0
  8. package/dist/cli.js +203 -0
  9. package/dist/commands/common.js +98 -0
  10. package/dist/commands/doctor.js +290 -0
  11. package/dist/commands/init.js +9 -0
  12. package/dist/commands/install.js +107 -0
  13. package/dist/commands/remove.js +54 -0
  14. package/dist/commands/review.js +127 -0
  15. package/dist/commands/status.js +73 -0
  16. package/dist/commands/update.js +8 -0
  17. package/dist/commands/validate.js +27 -0
  18. package/dist/core/apply.js +181 -0
  19. package/dist/core/blocks.js +64 -0
  20. package/dist/core/content.js +528 -0
  21. package/dist/core/env.js +40 -0
  22. package/dist/core/frontmatter.js +29 -0
  23. package/dist/core/hash.js +14 -0
  24. package/dist/core/inspect.js +51 -0
  25. package/dist/core/lock.js +124 -0
  26. package/dist/core/paths.js +65 -0
  27. package/dist/core/plan.js +242 -0
  28. package/dist/core/tools.js +62 -0
  29. package/dist/core/types.js +11 -0
  30. package/dist/core/updates.js +121 -0
  31. package/docs/arquitetura.md +80 -0
  32. package/docs/compatibilidade.md +50 -0
  33. package/docs/formato.md +155 -0
  34. package/docs/instalacao.md +105 -0
  35. package/docs/manutencao.md +115 -0
  36. package/package.json +43 -4
  37. package/seedgridKB/SeedGrid/Extensions/Catalogo-de-enums.md +161 -0
  38. package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +971 -0
  39. package/seedgridKB/SeedGrid/Extensions/Indice.md +63 -0
  40. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +124 -0
  41. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Enums.md +40 -0
  42. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +97 -0
  43. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +114 -0
  44. package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao-Rust.md +69 -0
  45. package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao.md +88 -0
  46. package/seedgridKB/SeedGrid/Extensions/apikeys/Enums.md +33 -0
  47. package/seedgridKB/SeedGrid/Extensions/apikeys/Exemplos.md +121 -0
  48. package/seedgridKB/SeedGrid/Extensions/apikeys/Rust.md +126 -0
  49. package/seedgridKB/SeedGrid/Extensions/apikeys/Visao-geral.md +111 -0
  50. package/seedgridKB/SeedGrid/Extensions/audit/Configuracao-Rust.md +93 -0
  51. package/seedgridKB/SeedGrid/Extensions/audit/Configuracao.md +127 -0
  52. package/seedgridKB/SeedGrid/Extensions/audit/Enums.md +66 -0
  53. package/seedgridKB/SeedGrid/Extensions/audit/Exemplos.md +151 -0
  54. package/seedgridKB/SeedGrid/Extensions/audit/Rust.md +120 -0
  55. package/seedgridKB/SeedGrid/Extensions/audit/Visao-geral.md +114 -0
  56. package/seedgridKB/SeedGrid/Extensions/backup/Configuracao-Rust.md +136 -0
  57. package/seedgridKB/SeedGrid/Extensions/backup/Configuracao.md +319 -0
  58. package/seedgridKB/SeedGrid/Extensions/backup/Enums.md +131 -0
  59. package/seedgridKB/SeedGrid/Extensions/backup/Exemplos.md +210 -0
  60. package/seedgridKB/SeedGrid/Extensions/backup/Rust.md +135 -0
  61. package/seedgridKB/SeedGrid/Extensions/backup/Visao-geral.md +150 -0
  62. package/seedgridKB/SeedGrid/Extensions/billing/Configuracao-Rust.md +86 -0
  63. package/seedgridKB/SeedGrid/Extensions/billing/Configuracao.md +243 -0
  64. package/seedgridKB/SeedGrid/Extensions/billing/Enums.md +165 -0
  65. package/seedgridKB/SeedGrid/Extensions/billing/Exemplos.md +205 -0
  66. package/seedgridKB/SeedGrid/Extensions/billing/Rust.md +109 -0
  67. package/seedgridKB/SeedGrid/Extensions/billing/Visao-geral.md +181 -0
  68. package/seedgridKB/SeedGrid/Extensions/broker/Configuracao-Rust.md +40 -0
  69. package/seedgridKB/SeedGrid/Extensions/broker/Visao-geral.md +114 -0
  70. package/seedgridKB/SeedGrid/Extensions/cache/Configuracao-Rust.md +73 -0
  71. package/seedgridKB/SeedGrid/Extensions/cache/Configuracao.md +112 -0
  72. package/seedgridKB/SeedGrid/Extensions/cache/Enums.md +36 -0
  73. package/seedgridKB/SeedGrid/Extensions/cache/Exemplos.md +149 -0
  74. package/seedgridKB/SeedGrid/Extensions/cache/Rust.md +81 -0
  75. package/seedgridKB/SeedGrid/Extensions/cache/Visao-geral.md +90 -0
  76. package/seedgridKB/SeedGrid/Extensions/commons/Configuracao.md +107 -0
  77. package/seedgridKB/SeedGrid/Extensions/commons/Enums.md +105 -0
  78. package/seedgridKB/SeedGrid/Extensions/commons/Exemplos.md +141 -0
  79. package/seedgridKB/SeedGrid/Extensions/commons/Visao-geral.md +99 -0
  80. package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +122 -0
  81. package/seedgridKB/SeedGrid/Extensions/exchange/Enums.md +29 -0
  82. package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +82 -0
  83. package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +118 -0
  84. package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao-Rust.md +110 -0
  85. package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao.md +157 -0
  86. package/seedgridKB/SeedGrid/Extensions/filemanagement/Exemplos.md +157 -0
  87. package/seedgridKB/SeedGrid/Extensions/filemanagement/Rust.md +70 -0
  88. package/seedgridKB/SeedGrid/Extensions/filemanagement/Visao-geral.md +88 -0
  89. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao-Rust.md +124 -0
  90. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +195 -0
  91. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Enums.md +71 -0
  92. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Exemplos.md +149 -0
  93. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Rust.md +139 -0
  94. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +130 -0
  95. package/seedgridKB/SeedGrid/Extensions/notification/Configuracao.md +141 -0
  96. package/seedgridKB/SeedGrid/Extensions/notification/Enums.md +52 -0
  97. package/seedgridKB/SeedGrid/Extensions/notification/Exemplos.md +141 -0
  98. package/seedgridKB/SeedGrid/Extensions/notification/Visao-geral.md +113 -0
  99. package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao-Rust.md +67 -0
  100. package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao.md +94 -0
  101. package/seedgridKB/SeedGrid/Extensions/privacy/Enums.md +79 -0
  102. package/seedgridKB/SeedGrid/Extensions/privacy/Exemplos.md +172 -0
  103. package/seedgridKB/SeedGrid/Extensions/privacy/Rust.md +107 -0
  104. package/seedgridKB/SeedGrid/Extensions/privacy/Visao-geral.md +90 -0
  105. package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao-Rust.md +72 -0
  106. package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao.md +104 -0
  107. package/seedgridKB/SeedGrid/Extensions/realtime/Exemplos.md +104 -0
  108. package/seedgridKB/SeedGrid/Extensions/realtime/Rust.md +69 -0
  109. package/seedgridKB/SeedGrid/Extensions/realtime/Visao-geral.md +105 -0
  110. package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao-Rust.md +68 -0
  111. package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao.md +186 -0
  112. package/seedgridKB/SeedGrid/Extensions/resilience/Enums.md +96 -0
  113. package/seedgridKB/SeedGrid/Extensions/resilience/Exemplos.md +229 -0
  114. package/seedgridKB/SeedGrid/Extensions/resilience/Rust.md +80 -0
  115. package/seedgridKB/SeedGrid/Extensions/resilience/Visao-geral.md +112 -0
  116. package/seedgridKB/SeedGrid/Extensions/runtime/Configuracao-Rust.md +90 -0
  117. package/seedgridKB/SeedGrid/Extensions/runtime/Visao-geral.md +114 -0
  118. package/seedgridKB/SeedGrid/Extensions/security/Configuracao-Rust.md +327 -0
  119. package/seedgridKB/SeedGrid/Extensions/security/Configuracao.md +510 -0
  120. package/seedgridKB/SeedGrid/Extensions/security/Enums.md +95 -0
  121. package/seedgridKB/SeedGrid/Extensions/security/Exemplos.md +218 -0
  122. package/seedgridKB/SeedGrid/Extensions/security/Rust.md +203 -0
  123. package/seedgridKB/SeedGrid/Extensions/security/Visao-geral.md +131 -0
  124. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao-Rust.md +188 -0
  125. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +345 -0
  126. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Enums.md +117 -0
  127. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Exemplos.md +205 -0
  128. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Rust.md +161 -0
  129. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +142 -0
  130. package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao-Rust.md +75 -0
  131. package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao.md +152 -0
  132. package/seedgridKB/SeedGrid/Extensions/whatsapp/Enums.md +198 -0
  133. package/seedgridKB/SeedGrid/Extensions/whatsapp/Exemplos.md +173 -0
  134. package/seedgridKB/SeedGrid/Extensions/whatsapp/Rust.md +83 -0
  135. package/seedgridKB/SeedGrid/Extensions/whatsapp/Visao-geral.md +99 -0
  136. package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +112 -0
  137. package/seedgridKB/SeedGrid/SeedGrid-components/Indice.md +323 -0
  138. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/API.md +257 -0
  139. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Exemplos.md +307 -0
  140. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Visao-geral.md +51 -0
  141. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/API.md +174 -0
  142. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Exemplos.md +236 -0
  143. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Visao-geral.md +76 -0
  144. package/seedgridKB/SeedGrid/SeedGrid-components/digits/API.md +339 -0
  145. package/seedgridKB/SeedGrid/SeedGrid-components/digits/Exemplos.md +311 -0
  146. package/seedgridKB/SeedGrid/SeedGrid-components/digits/Visao-geral.md +57 -0
  147. package/seedgridKB/SeedGrid/SeedGrid-components/editor/API.md +125 -0
  148. package/seedgridKB/SeedGrid/SeedGrid-components/editor/Exemplos.md +116 -0
  149. package/seedgridKB/SeedGrid/SeedGrid-components/editor/Visao-geral.md +86 -0
  150. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/API.md +490 -0
  151. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Exemplos.md +544 -0
  152. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Visao-geral.md +69 -0
  153. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/API.md +113 -0
  154. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Exemplos.md +159 -0
  155. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Visao-geral.md +92 -0
  156. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/API.md +516 -0
  157. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Exemplos.md +629 -0
  158. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Visao-geral.md +80 -0
  159. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/API.md +615 -0
  160. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Exemplos.md +384 -0
  161. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral.md +111 -0
  162. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/API.md +661 -0
  163. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Exemplos.md +312 -0
  164. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Visao-geral.md +123 -0
  165. package/seedgridKB/SeedGrid/SeedGrid-components/layout/API.md +1090 -0
  166. package/seedgridKB/SeedGrid/SeedGrid-components/layout/Exemplos.md +1172 -0
  167. package/seedgridKB/SeedGrid/SeedGrid-components/layout/Visao-geral.md +98 -0
  168. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/Visao-geral.md +98 -0
  169. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-apikeys.md +118 -0
  170. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-audit.md +88 -0
  171. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-backup.md +131 -0
  172. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-platform.md +132 -0
  173. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-user.md +120 -0
  174. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-login-tenancy.md +119 -0
  175. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-security.md +427 -0
  176. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-self-enter.md +104 -0
  177. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-subdomain-tenancy.md +110 -0
  178. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/API.md +490 -0
  179. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Exemplos.md +561 -0
  180. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Visao-geral.md +82 -0
  181. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/Visao-geral.md +68 -0
  182. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-commons.md +61 -0
  183. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-core.md +140 -0
  184. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-playground.md +112 -0
  185. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-theme.md +97 -0
  186. package/seedgridKB/SeedGrid/SeedGrid-components/providers/API.md +177 -0
  187. package/seedgridKB/SeedGrid/SeedGrid-components/providers/Exemplos.md +332 -0
  188. package/seedgridKB/SeedGrid/SeedGrid-components/providers/Visao-geral.md +106 -0
  189. package/seedgridKB/SeedGrid/SeedGrid-components/showcase.md +70 -0
  190. package/seedgridKB/SeedGrid/Toolkit/agents/arquiteto.md +53 -0
  191. package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +45 -0
  192. package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +43 -0
  193. package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +41 -0
  194. package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +44 -0
  195. package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +40 -0
  196. package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +78 -0
  197. package/seedgridKB/SeedGrid/Toolkit/references/glossario.md +15 -0
  198. package/seedgridKB/SeedGrid/Toolkit/references/modos-shared-native.md +27 -0
  199. package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +54 -0
  200. package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +39 -0
  201. package/seedgridKB/SeedGrid/Toolkit/rules/formato-entrega.md +29 -0
  202. package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +47 -0
  203. package/seedgridKB/SeedGrid/Toolkit/rules/personalizacao-local.md +22 -0
  204. package/seedgridKB/SeedGrid/Toolkit/skills/planejar-mudanca/SKILL.md +38 -0
  205. package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/SKILL.md +33 -0
  206. package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/references/checklist.md +25 -0
  207. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-backend-crud/SKILL.md +29 -0
  208. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-bump/SKILL.md +26 -0
  209. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/SKILL.md +221 -0
  210. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/agents/openai.yaml +4 -0
  211. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/checklist.md +31 -0
  212. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/patterns.md +185 -0
  213. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/routing.md +66 -0
  214. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/SKILL.md +56 -0
  215. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +4 -0
  216. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/checklist.md +32 -0
  217. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/steps.md +114 -0
  218. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-review/SKILL.md +61 -0
  219. package/seedgridKB/SeedGrid/Toolkit/skills/validar-mudanca/SKILL.md +29 -0
  220. package/seedgridKB/SeedGrid/Toolkit/templates/decisao-arquitetura.md +29 -0
  221. package/seedgridKB/SeedGrid/Toolkit/templates/especificacao-tarefa.md +32 -0
  222. package/seedgridKB/SeedGrid/Toolkit/templates/relatorio-validacao.md +30 -0
  223. package/seedgridKB/SeedGrid/Versoes.md +64 -0
  224. package/seedgridKB/SeedGrid/Visao-geral.md +35 -0
  225. package/seedgridKB/manifest.json +142 -0
@@ -0,0 +1,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.