@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,319 @@
1
+ ---
2
+ tags: [seedgrid, extension, backup, configuracao]
3
+ fonte: java/seedgrid-quarkus-ext-backup
4
+ branch: main
5
+ commit: 3bed4075ea
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # Configuração — backup (Quarkus)
10
+
11
+ Voltar: [[SeedGrid/Extensions/backup/Visao-geral|Visão geral do backup]] · [[SeedGrid/Extensions/backup/Exemplos|Exemplos]] · [[SeedGrid/Extensions/backup/Enums|Enums]] · [[SeedGrid/Extensions/backup/Rust|Porte Rust]]
12
+
13
+ ## 1. Cabeçalho
14
+
15
+ | Item | Valor |
16
+ |---|---|
17
+ | Prefixo | `seedgrid.backup` |
18
+ | Classe de config | `BackupConfig` (`@ConfigMapping(prefix = "seedgrid.backup")`) com grupos `NotificationConfig`, `MailerConfig`, `CsvConfig`, `FilesystemConfig`, `S3Config`, `MinioConfig`, `AzureBlobConfig`, `GoogleDriveConfig`, `OnedriveConfig`, `GcsConfig` |
19
+ | Registro | `BackupProcessor#config()` → `ConfigMappingBuildItem(BackupConfig.class, "seedgrid.backup")` |
20
+ | Mecanismo | SmallRye `@ConfigMapping` + `@WithDefault`; dois intervalos lidos também por expressão `@Scheduled(every = "{...}")` |
21
+ | Fase | **Runtime** (ConfigMapping em módulo runtime; não há `@ConfigRoot` nem `*BuildTimeConfig`) |
22
+ | Valores pré-configurados | `runtime/src/main/resources/META-INF/microprofile-config.properties` (ordinal 100) define valores e **aliases de env var** para várias chaves; o `application.properties` do host (ordinal 250) e env vars (ordinal 300) sobrescrevem |
23
+ | Outros mecanismos procurados | `@ConfigProperty`, `ConfigProvider.getConfig()`, `getValue/getOptionalValue`, `Config` injetado, `@IfBuildProperty`/`@LookupIfProperty`/`@UnlessBuildProperty`: **nenhum encontrado** no runtime/deployment (Confirmado por grep) |
24
+
25
+ Abreviações de origem usadas nas tabelas (todas relativas a `seedgrid-platform`):
26
+ - **BC** = `java/seedgrid-quarkus-ext-backup/runtime/src/main/java/br/com/seedgrid/backup/configs/BackupConfig.java`
27
+ - **MP** = `java/seedgrid-quarkus-ext-backup/runtime/src/main/resources/META-INF/microprofile-config.properties`
28
+ - **buildStorageConfig** = método privado homônimo duplicado em `services/ExportService`, `controllers/ExportController`, `exporters/CsvZipExporter`, `exporters/SqlDumpZipExporter` (monta o `Map` passado ao `FileStorageRegistry` do filemanagement)
29
+
30
+ > **Padrão efetivo**: quando o MP define um valor, ele vale como padrão efetivo mesmo que a interface não tenha `@WithDefault` (ex.: `minio.region`, `mailer.*`). Na coluna Padrão indico ambos quando diferem. Valores vazios (`${ENV:}`) resultam em ausência (`Optional.empty()`) — **Inferência** (regra SmallRye: valor vazio = propriedade não definida).
31
+
32
+ ## 2. Propriedades da extensão
33
+
34
+ ### 2.1 Execução, fila e retenção
35
+
36
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
37
+ |---|---|---|---|---|---|---|---|---|---|
38
+ | `seedgrid.backup.storage` | String | `filesystem`, `s3`, `minio`, `azure-blob`, `google-drive`, `onedrive`, `gcs` (switch com `toLowerCase`) | `filesystem` (`@WithDefault`; MP: `${SEEDGRID_BACKUP_STORAGE:filesystem}`) | Não | Backend onde os ZIPs são gravados; outro valor → `IllegalArgumentException("Unknown storage type")` ao gravar. Na leitura/exclusão o tipo é re-derivado do `storageKey` (URI) do artefato, não desta chave | Gravação de artefatos | Exige o grupo de chaves do backend escolhido (2.5) | Runtime | BC `storage()`; consumo `ExportService#createStorageServiceAdapter`, `CsvZipExporter#storeExport`, `SqlDumpZipExporter` |
39
+ | `seedgrid.backup.async-enabled` | boolean | `true`/`false` | `true` | Não | `true`: ao criar o job dispara thread de plataforma daemon `seedgrid-backup-export-<jobId>`. `false`: job fica `QUEUED` até o scheduler de fila | Criação de job | `queue-poll-interval`, `max-concurrent-exports` | Runtime | BC `asyncEnabled()`; consumo `ExportService#createExportJob` |
40
+ | `seedgrid.backup.max-concurrent-exports` | int | inteiro ≥ 0 | `1` (BC e MP) | Não | Teto **global** (somando todos os tenants) de jobs `RUNNING` para o scheduler iniciar novos jobs `QUEUED`; slots divididos entre tenants (`max(1, slots/tenants)`). Não limita o caminho assíncrono direto (`async-enabled=true`) — **Confirmado** (só lido no scheduler) | Scheduler de fila | `queue-poll-interval` | Runtime | BC `maxConcurrentExports()`; consumo `BackupSchedulerService#processQueuedExports` |
41
+ | `seedgrid.backup.queue-poll-interval` | String (duração do Quarkus Scheduler) | ex.: `30s`, `5m`, `PT30S` | `30s` (BC e MP) | Não | Intervalo do `@Scheduled(every = "{seedgrid.backup.queue-poll-interval}")`. A interface só declara; a leitura efetiva é pela expressão do scheduler | Scheduler de fila | `async-enabled` | Runtime (startup do scheduler) | BC `queuePollInterval()` (sem chamada direta); consumo `BackupSchedulerService#processQueuedExports` (anotação) |
42
+ | `seedgrid.backup.retention-days` | int | inteiro (dias) | `7` (BC e MP) | Não | Ao concluir (`DONE`), `expiresAt = agora + N dias`. A limpeza diária (cron fixo `0 1 0 * * ?`) apaga job + artefatos com `expiresAt < agora`. Alterar não afeta jobs já concluídos | Retenção | — | Runtime | BC `retentionDays()`; consumo `ExportService#executeExport`; limpeza `BackupSchedulerService#cleanExpiredExports` |
43
+ | `seedgrid.backup.excluded-domain-entity-packages` | `Optional<List<String>>` (lista separada por vírgula) | prefixos de pacote Java | — (vazio) | Não | Entidades JPA cujo pacote começa com algum prefixo são puladas no escopo `DOMAIN` (evita consultar entidades de outra persistence unit, ex. `seedgrid-audit-postgresql` quando a estratégia ativa de auditoria é outra) | Export `DOMAIN` | escopo `DOMAIN` | Runtime | BC `excludedDomainEntityPackages()`; consumo `ExtractDataService` (construtor, `isExcludedFromDomainExport`) |
44
+
45
+ ### 2.2 Notificação
46
+
47
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
48
+ |---|---|---|---|---|---|---|---|---|---|
49
+ | `seedgrid.backup.notification.enabled` | boolean | `true`/`false` | `true` (BC e MP) | Não | Liga o scheduler de notificação e entra em `EmailExportNotificationService#isEnabled()` | Notificação | `mailer.from`, `mailer.host` | Runtime | BC `NotificationConfig#enabled()`; consumo `NotificationSchedulerService#processNotifications`, `EmailExportNotificationService#isEnabled` |
50
+ | `seedgrid.backup.notification.poll-interval` | String (duração do Quarkus Scheduler) | ex.: `5m`, `PT5M` | `5m` (BC e MP) | Não | Intervalo do `@Scheduled(every = "{seedgrid.backup.notification.poll-interval}")` | Notificação | — | Runtime | BC `NotificationConfig#pollInterval()` (sem chamada direta); consumo anotação em `NotificationSchedulerService#processNotifications` |
51
+ | `seedgrid.backup.notification.max-retries` | int | inteiro | `3` (BC e MP) | Não | Jobs `DONE` com `notificationAttempts < max-retries` são (re)notificados; sucesso → `DONE_NOTIFIED` | Notificação | `retry-delay` | Runtime | BC `NotificationConfig#maxRetries()`; consumo `NotificationSchedulerService#processTenant` → `ExportJobRepository#findReadyForNotification` |
52
+ | `seedgrid.backup.notification.retry-delay` | `java.time.Duration` | ISO-8601 (ex. `PT15M`) ou formato curto SmallRye (Inferência) | `PT15M` (BC e MP) | Não | Espera mínima desde `lastNotificationAttempt` antes de nova tentativa | Notificação | `max-retries` | Runtime | BC `NotificationConfig#retryDelay()`; consumo `NotificationSchedulerService#processTenant` |
53
+
54
+ ### 2.3 Mailer (notificação padrão por e-mail via Vert.x Mail)
55
+
56
+ O `EmailExportNotificationService` cria um `io.vertx.ext.mail.MailClient` próprio a partir destas chaves (`@PostConstruct init`) **se** `isEnabled()` = `notification.enabled && mailer.from presente && mailer.host presente`.
57
+
58
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
59
+ |---|---|---|---|---|---|---|---|---|---|
60
+ | `seedgrid.backup.mailer.from` | `Optional<String>` | e-mail | interface: —; MP: `${SEEDGRID_BACKUP_MAILER_FROM:noreply@example.com}` | Condicional (necessária para enviar; ausente → notificação desabilitada) | Remetente (From). Sem ela `notifyReady` lança `IllegalStateException` | E-mail | `mailer.host`, `notification.enabled` | Runtime | BC `MailerConfig#from()`; consumo `EmailExportNotificationService#notifyReady`, `#isEnabled` |
61
+ | `seedgrid.backup.mailer.host` | `Optional<String>` | hostname SMTP | interface: —; MP: `${SEEDGRID_BACKUP_MAILER_HOST:smtp.gmail.com}` | Condicional (idem) | Host SMTP (`MailConfig#setHostname`) | E-mail | `mailer.port` | Runtime | BC `MailerConfig#host()`; consumo `EmailExportNotificationService#init`, `#isEnabled` |
62
+ | `seedgrid.backup.mailer.port` | `Optional<Integer>` | porta | interface: —; MP: `${SEEDGRID_BACKUP_MAILER_PORT:587}` | Não | Porta SMTP | E-mail | `start-tls` | Runtime | BC `MailerConfig#port()`; consumo `EmailExportNotificationService#init` |
63
+ | `seedgrid.backup.mailer.start-tls` | `Optional<String>` | `REQUIRED`, `OPTIONAL`, `DISABLED` (case-insensitive; outro valor é ignorado silenciosamente) | interface: —; MP: `${SEEDGRID_BACKUP_MAILER_START_TLS:REQUIRED}` | Não | `MailConfig#setStarttls` | E-mail | `port` | Runtime | BC `MailerConfig#startTls()`; consumo `EmailExportNotificationService#init` |
64
+ | `seedgrid.backup.mailer.username` | `Optional<String>` | texto | interface: —; MP: `${SEEDGRID_BACKUP_MAILER_USERNAME:}` (vazio) | Não (depende do SMTP) | Usuário SMTP | E-mail | `password` | Runtime | BC `MailerConfig#username()`; consumo `EmailExportNotificationService#init` |
65
+ | 🔒 `seedgrid.backup.mailer.password` | `Optional<String>` | texto | interface: —; MP: `${SEEDGRID_BACKUP_MAILER_PASSWORD:}` (vazio) | Não (depende do SMTP) | Senha SMTP | E-mail | `username` | Runtime | BC `MailerConfig#password()`; consumo `EmailExportNotificationService#init` |
66
+ | `seedgrid.backup.mailer.auth-methods` | `Optional<String>` | métodos SMTP AUTH separados por espaço | interface: —; MP: `${SEEDGRID_BACKUP_MAILER_AUTH_METHODS:PLAIN LOGIN}`; código: ausente/branco → `PLAIN LOGIN` | Não | Fixa os métodos de AUTH (evita XOAUTH2 automático do Vert.x com Gmail, que derruba o socket com 535) | E-mail | — | Runtime | BC `MailerConfig#authMethods()`; consumo `EmailExportNotificationService#init` |
67
+
68
+ > ⚠️ **Confirmado pelo código + MP**: como `from` e `host` têm fallback no MP, `isEnabled()` é `true` por padrão — o mail client é criado contra `smtp.gmail.com` sem credenciais e o scheduler tentará enviar (e falhar, registrando `notificationError`) até `max-retries`. Para hosts sem SMTP: `seedgrid.backup.notification.enabled=false` ou fornecer um `ExportNotificationService` próprio.
69
+
70
+ ### 2.4 CSV (exporter `CSV_ZIP`)
71
+
72
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
73
+ |---|---|---|---|---|---|---|---|---|---|
74
+ | `seedgrid.backup.csv.delimiter` | String | só o 1º caractere é usado no CSV | `,` | Não | Delimitador (`charAt(0)`); string inteira gravada no manifest (`csvOptions.delimiter`) | `CSV_ZIP` | — | Runtime | BC `CsvConfig#delimiter()`; consumo `CsvZipExporter#generateCsv`, `#buildManifest` |
75
+ | `seedgrid.backup.csv.quote-char` | String | só o 1º caractere é usado | `"` | Não | Caractere de aspas; também gravado no manifest | `CSV_ZIP` | — | Runtime | BC `CsvConfig#quoteChar()`; consumo `CsvZipExporter#generateCsv`, `#buildManifest` |
76
+ | `seedgrid.backup.csv.encoding` | String | nome de charset Java (ex. `UTF-8`, `ISO-8859-1`) | `UTF-8` | Não | Encoding dos bytes de cada `data/<tabela>.csv` | `CSV_ZIP` | — | Runtime | BC `CsvConfig#encoding()`; consumo `CsvZipExporter#generateCsvFiles` |
77
+
78
+ ### 2.5 Storage (repassado ao `seedgrid-filemanagement`)
79
+
80
+ Cada chave é copiada para o `Map<String,String>` de config do storage (nome da chave do mapa entre parênteses) em **buildStorageConfig**, somente quando `storage` (ou o tipo do `storageKey`) corresponde ao backend. A validação/uso final é feita pelas factories do filemanagement (`java/seedgrid-quarkus-lib-filemanagement/src/main/java/br/com/seedgrid/filemanagement/factories/*StorageFactory#create`), que lançam `StorageConfigurationException` na primeira gravação/leitura quando falta chave obrigatória — **Confirmado**. Ver [[SeedGrid/Extensions/filemanagement/Configuracao|Configuração do filemanagement]].
81
+
82
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
83
+ |---|---|---|---|---|---|---|---|---|---|
84
+ | `seedgrid.backup.filesystem.base-path` | String | caminho de diretório | `/var/seedgrid/files` (BC; MP: `${SEEDGRID_BACKUP_FILESYSTEM_BASE:/var/seedgrid/files}`) | Não (tem padrão; vazio → erro) | (`base-path`) diretório raiz, criado se não existir (precisa ser gravável); artefatos vão em `<schema>/exports/` | `storage=filesystem` | `storage` | Runtime | BC `FilesystemConfig#basePath()`; consumo buildStorageConfig |
85
+ | `seedgrid.backup.s3.bucket` | `Optional<String>` | nome de bucket | — | Condicional (`storage=s3`) | (`bucket`) | `storage=s3` | `storage` | Runtime | BC `S3Config#bucket()`; consumo buildStorageConfig |
86
+ | `seedgrid.backup.s3.region` | `Optional<String>` | região AWS | — (factory: `us-east-1`) | Não | (`region`) | `storage=s3` | — | Runtime | BC `S3Config#region()`; consumo buildStorageConfig |
87
+ | 🔒 `seedgrid.backup.s3.access-key` | `Optional<String>` | texto | — | Não (sem o par access/secret usa a cadeia padrão de credenciais do AWS SDK) | (`access-key`) | `storage=s3` | `secret-key` | Runtime | BC `S3Config#accessKey()`; consumo buildStorageConfig |
88
+ | 🔒 `seedgrid.backup.s3.secret-key` | `Optional<String>` | texto | — | Não (idem) | (`secret-key`) | `storage=s3` | `access-key` | Runtime | BC `S3Config#secretKey()`; consumo buildStorageConfig |
89
+ | `seedgrid.backup.s3.endpoint` | `Optional<String>` | URL | — | Não | (`endpoint`) endpoint S3-compatível | `storage=s3` | — | Runtime | BC `S3Config#endpoint()`; consumo buildStorageConfig |
90
+ | `seedgrid.backup.minio.bucket` | `Optional<String>` | nome de bucket | — (MP: `${SEEDGRID_BACKUP_MINIO_BUCKET:}`) | Condicional (`storage=minio`) | (`bucket`) | `storage=minio` | `storage` | Runtime | BC `MinioConfig#bucket()`; consumo buildStorageConfig |
91
+ | `seedgrid.backup.minio.region` | `Optional<String>` | região | interface: —; MP: `${SEEDGRID_BACKUP_MINIO_REGION:us-east-1}` (factory também usa `us-east-1`) | Não | (`region`) | `storage=minio` | — | Runtime | BC `MinioConfig#region()`; consumo buildStorageConfig |
92
+ | 🔒 `seedgrid.backup.minio.access-key` | `Optional<String>` | texto | — (MP: `${SEEDGRID_BACKUP_MINIO_ACCESS_KEY:}`) | Condicional (`storage=minio`) | (`access-key`) | `storage=minio` | `secret-key` | Runtime | BC `MinioConfig#accessKey()`; consumo buildStorageConfig |
93
+ | 🔒 `seedgrid.backup.minio.secret-key` | `Optional<String>` | texto | — (MP: `${SEEDGRID_BACKUP_MINIO_SECRET_KEY:}`) | Condicional (`storage=minio`) | (`secret-key`) | `storage=minio` | `access-key` | Runtime | BC `MinioConfig#secretKey()`; consumo buildStorageConfig |
94
+ | `seedgrid.backup.minio.endpoint` | `Optional<String>` | URL | — (MP: `${SEEDGRID_BACKUP_MINIO_ENDPOINT:}`) | Condicional (`storage=minio`) | (`endpoint`) | `storage=minio` | — | Runtime | BC `MinioConfig#endpoint()`; consumo buildStorageConfig |
95
+ | 🔒 `seedgrid.backup.azure-blob.connection-string` | `Optional<String>` | connection string Azure | — | Condicional (opção 1, alternativa a account-name+key) | (`connection-string`) | `storage=azure-blob` | `account-name`/`account-key` | Runtime | BC `AzureBlobConfig#connectionString()`; consumo buildStorageConfig |
96
+ | `seedgrid.backup.azure-blob.container` | `Optional<String>` | nome de container | — | Condicional (`storage=azure-blob`) | (`container`) | `storage=azure-blob` | — | Runtime | BC `AzureBlobConfig#container()`; consumo buildStorageConfig |
97
+ | `seedgrid.backup.azure-blob.account-name` | `Optional<String>` | texto | — | Condicional (opção 2) | (`account-name`) | `storage=azure-blob` | `account-key` | Runtime | BC `AzureBlobConfig#accountName()`; consumo buildStorageConfig |
98
+ | 🔒 `seedgrid.backup.azure-blob.account-key` | `Optional<String>` | texto | — | Condicional (opção 2) | (`account-key`) | `storage=azure-blob` | `account-name` | Runtime | BC `AzureBlobConfig#accountKey()`; consumo buildStorageConfig |
99
+ | `seedgrid.backup.google-drive.root-folder-id` | `Optional<String>` | ID de pasta | — | Condicional (`storage=google-drive`) | (`root-folder-id`) | `storage=google-drive` | — | Runtime | BC `GoogleDriveConfig#rootFolderId()`; consumo buildStorageConfig |
100
+ | 🔒 `seedgrid.backup.google-drive.credentials-file` | `Optional<String>` | caminho de JSON de service account | — | Condicional (opção 1) | (`credentials-file`) | `storage=google-drive` | `credentials-json` | Runtime | BC `GoogleDriveConfig#credentialsFile()`; consumo buildStorageConfig |
101
+ | 🔒 `seedgrid.backup.google-drive.credentials-json` | `Optional<String>` | JSON | — | Condicional (opção 2) | (`credentials-json`) | `storage=google-drive` | `credentials-file` | Runtime | BC `GoogleDriveConfig#credentialsJson()`; consumo buildStorageConfig |
102
+ | `seedgrid.backup.onedrive.client-id` | `Optional<String>` | texto | — | Condicional (`storage=onedrive`) | (`client-id`) | `storage=onedrive` | — | Runtime | BC `OnedriveConfig#clientId()`; consumo buildStorageConfig |
103
+ | 🔒 `seedgrid.backup.onedrive.client-secret` | `Optional<String>` | texto | — | Condicional (`storage=onedrive`) | (`client-secret`) | `storage=onedrive` | — | Runtime | BC `OnedriveConfig#clientSecret()`; consumo buildStorageConfig |
104
+ | `seedgrid.backup.onedrive.tenant-id` | `Optional<String>` | tenant Azure AD | — | Condicional (`storage=onedrive`) | (`tenant-id`) | `storage=onedrive` | — | Runtime | BC `OnedriveConfig#tenantId()`; consumo buildStorageConfig |
105
+ | `seedgrid.backup.onedrive.root-folder-path` | String | caminho | `/seedgrid/files` | Não | (`root-folder-path`) sempre enviado | `storage=onedrive` | — | Runtime | BC `OnedriveConfig#rootFolderPath()`; consumo buildStorageConfig |
106
+ | `seedgrid.backup.gcs.bucket` | `Optional<String>` | bucket | — | Condicional (`storage=gcs`) | (`bucket`) | `storage=gcs` | — | Runtime | BC `GcsConfig#bucket()`; consumo buildStorageConfig |
107
+ | `seedgrid.backup.gcs.project-id` | `Optional<String>` | projeto GCP | — | Condicional (`storage=gcs`) | (`project-id`) | `storage=gcs` | — | Runtime | BC `GcsConfig#projectId()`; consumo buildStorageConfig |
108
+ | 🔒 `seedgrid.backup.gcs.credentials-file` | `Optional<String>` | caminho | — | Não (opcional; a factory não exige credenciais) | (`credentials-file`) | `storage=gcs` | `credentials-json` | Runtime | BC `GcsConfig#credentialsFile()`; consumo buildStorageConfig |
109
+ | 🔒 `seedgrid.backup.gcs.credentials-json` | `Optional<String>` | JSON | — | Não (opcional, alternativa a `credentials-file`) | (`credentials-json`) | `storage=gcs` | `credentials-file` | Runtime | BC `GcsConfig#credentialsJson()`; consumo buildStorageConfig |
110
+
111
+ Total de propriedades públicas: **46** (6 execução + 4 notificação + 7 mailer + 3 CSV + 26 storage).
112
+
113
+ ### 2.6 Variáveis de ambiente
114
+
115
+ | Fonte | Variável | Propriedade |
116
+ |---|---|---|
117
+ | Alias explícito no MP (Confirmado) | `SEEDGRID_BACKUP_STORAGE` | `seedgrid.backup.storage` |
118
+ | Alias explícito no MP (Confirmado) | `SEEDGRID_BACKUP_FILESYSTEM_BASE` (**sem** `_PATH`) | `seedgrid.backup.filesystem.base-path` |
119
+ | Alias explícito no MP (Confirmado) | `SEEDGRID_BACKUP_MINIO_BUCKET`, `_REGION`, `_ACCESS_KEY`, `_SECRET_KEY`, `_ENDPOINT` | `seedgrid.backup.minio.*` |
120
+ | Alias explícito no MP (Confirmado) | `SEEDGRID_BACKUP_MAILER_FROM`, `_HOST`, `_PORT`, `_START_TLS`, `_USERNAME`, `_PASSWORD`, `_AUTH_METHODS` | `seedgrid.backup.mailer.*` |
121
+ | Regra MicroProfile (Inferência) | ex.: `SEEDGRID_BACKUP_RETENTION_DAYS`, `SEEDGRID_BACKUP_MAX_CONCURRENT_EXPORTS`, `SEEDGRID_BACKUP_ASYNC_ENABLED` | chaves de um único segmento após o prefixo |
122
+
123
+ Para chaves com hífen em grupo (`azure-blob.*`, `google-drive.*`) a forma env (`SEEDGRID_BACKUP_AZURE_BLOB_ACCOUNT_KEY`) é ambígua entre `.` e `-`; a resolução depende do SmallRye casar com o nome do mapping — **Não confirmado**. O MP sugere (comentado) env vars de terceiros como `AWS_ACCESS_KEY_ID`, `AZURE_STORAGE_CONNECTION_STRING`, `GOOGLE_DRIVE_CREDENTIALS_JSON`, `ONEDRIVE_CLIENT_SECRET`, `GCS_CREDENTIALS_JSON`; elas **só valem se o host copiar** essas linhas (estão comentadas).
124
+
125
+ ## 3. Propriedades de frameworks / outras extensões
126
+
127
+ ### 3.1 Definidas pela extensão no `microprofile-config.properties` (ordinal 100 — o host pode sobrescrever)
128
+
129
+ | Propriedade | Valor definido | Observação |
130
+ |---|---|---|
131
+ | `quarkus.flyway.locations` | `db/migration/backup` | ⚠️ define a datasource Flyway **default**; num host com migrations próprias o `application.properties` do host prevalece e precisa incluir `db/migration/backup` — Inferência |
132
+ | `quarkus.flyway.table` | `flyway_schema_history_backup` | idem |
133
+ | `quarkus.flyway.migrate-at-start` | `true` | |
134
+ | `quarkus.flyway.baseline-on-migrate` | `true` | |
135
+ | `quarkus.flyway.baseline-version` | `0` | |
136
+ | `quarkus.hibernate-orm.database.generation` | `none` | |
137
+
138
+ ### 3.2 Exigidas/relacionadas
139
+
140
+ | Propriedade | Motivo |
141
+ |---|---|
142
+ | `quarkus.datasource.*` (PostgreSQL) | entidades `ExportJob`/`ExportArtifact`, `information_schema`; obrigatória no host |
143
+ | `seedgrid.ratelimit.export-create.enabled` / `.permits` / `.window` / `.min-spacing` (e demais chaves do rate limiter) | override do `@SeedGridRateLimit(configKey = "export-create", permits = 10, window = 1h)` do `POST /exports`; lidas por `RateLimitService` da extensão resilience — ver [[SeedGrid/Extensions/resilience/Configuracao|Configuração do resilience]] |
144
+ | `seedgrid.filemanagement.*` | config do storage subjacente (o teste define `seedgrid.filemanagement.filesystem.base-path`) — ver [[SeedGrid/Extensions/filemanagement/Configuracao|Configuração do filemanagement]] |
145
+
146
+ ## 4. Propriedades usadas só em testes
147
+
148
+ `runtime/src/test/resources/application.properties` e `ExportAsyncFlowIT.AsyncEnabledProfile#getConfigOverrides`:
149
+
150
+ | Propriedade | Valor | Finalidade |
151
+ |---|---|---|
152
+ | `quarkus.datasource.db-kind` | `postgresql` | DevServices |
153
+ | `quarkus.datasource.devservices.enabled` | `true` | |
154
+ | `quarkus.datasource.devservices.image-name` | `postgres:16-alpine` | |
155
+ | `quarkus.datasource.devservices.db-name` | `seedgrid_backup` | |
156
+ | `quarkus.datasource.username` / `password` | `<SEGREDO:test-db-credentials>` | credenciais locais de teste |
157
+ | `quarkus.hibernate-orm.database.generation` | `none` | |
158
+ | `quarkus.flyway.migrate-at-start` / `clean-at-start` | `true` / `true` | |
159
+ | `quarkus.flyway.locations` | `classpath:db/testdata/backup` | migrations de teste (V400, V402, V405 auditoria, V406 entidade de exemplo, V490 seed) |
160
+ | `quarkus.flyway.schemas` | `public` | |
161
+ | `quarkus.http.test-port` | `0` | |
162
+ | `quarkus.log.category."br.com.seedgrid".level` | `INFO` | |
163
+ | `seedgrid.filemanagement.filesystem.base-path` | `${java.io.tmpdir}/seedgrid-backup-tests` | |
164
+ | `seedgrid.backup.storage` | `filesystem` | |
165
+ | `seedgrid.backup.filesystem.base-path` | `${java.io.tmpdir}/seedgrid-backup-tests` | |
166
+ | `seedgrid.backup.async-enabled` | `false` (override `true` em `ExportAsyncFlowIT`) | execução determinística |
167
+ | `quarkus.index-dependency.seedgrid-filemanagement.group-id` / `.artifact-id` | `br.com.seedgrid` / `seedgrid-filemanagement` | indexar beans do filemanagement |
168
+ | `quarkus.arc.exclude-types` | storages cloud do filemanagement (+ `TestTenantProvider` em `ExportAsyncFlowIT`) | evitar dependências cloud |
169
+
170
+ ## 5. Aliases, obsoletas, renomeações
171
+
172
+ - Alias de env `SEEDGRID_BACKUP_FILESYSTEM_BASE` (nome diferente do padrão MicroProfile `..._BASE_PATH`). **Confirmado** (MP).
173
+ - Nenhuma propriedade obsoleta/renomeada encontrada.
174
+
175
+ ## 6. Configuração mínima (`application.properties`)
176
+
177
+ ```properties
178
+ # Datasource PostgreSQL do host (obrigatório)
179
+ quarkus.datasource.db-kind=postgresql
180
+ quarkus.datasource.jdbc.url=jdbc:postgresql://<host>:5432/<db>
181
+ quarkus.datasource.username=<usuario>
182
+ quarkus.datasource.password=<SEGREDO:db-password>
183
+
184
+ # Storage local (padrão filesystem)
185
+ seedgrid.backup.filesystem.base-path=/var/seedgrid/files
186
+
187
+ # Sem SMTP configurado: desligue a notificação para não tentar smtp.gmail.com
188
+ seedgrid.backup.notification.enabled=false
189
+ ```
190
+
191
+ ## 7. Configuração completa comentada
192
+
193
+ ```properties
194
+ # ---------- Execução ----------
195
+ # filesystem | s3 | minio | azure-blob | google-drive | onedrive | gcs
196
+ seedgrid.backup.storage=filesystem
197
+ # true: thread daemon por job; false: só o scheduler de fila executa
198
+ seedgrid.backup.async-enabled=true
199
+ # teto global de jobs RUNNING usado pelo scheduler de fila
200
+ seedgrid.backup.max-concurrent-exports=1
201
+ # intervalo do scheduler de fila (Quarkus Scheduler: 30s, 5m, PT30S...)
202
+ seedgrid.backup.queue-poll-interval=30s
203
+ # dias até expirar o artefato (limpeza diária às 00:01)
204
+ seedgrid.backup.retention-days=7
205
+ # prefixos de pacote de entidades fora do export DOMAIN (lista separada por vírgula)
206
+ seedgrid.backup.excluded-domain-entity-packages=<pacote.a>,<pacote.b>
207
+
208
+ # ---------- Notificação ----------
209
+ seedgrid.backup.notification.enabled=true
210
+ seedgrid.backup.notification.poll-interval=5m
211
+ seedgrid.backup.notification.max-retries=3
212
+ seedgrid.backup.notification.retry-delay=PT15M
213
+
214
+ # ---------- Mailer (Vert.x Mail) ----------
215
+ seedgrid.backup.mailer.from=<remetente@dominio>
216
+ seedgrid.backup.mailer.host=<smtp.host>
217
+ seedgrid.backup.mailer.port=587
218
+ # REQUIRED | OPTIONAL | DISABLED
219
+ seedgrid.backup.mailer.start-tls=REQUIRED
220
+ seedgrid.backup.mailer.username=<usuario-smtp>
221
+ seedgrid.backup.mailer.password=<SEGREDO:smtp-password>
222
+ seedgrid.backup.mailer.auth-methods=PLAIN LOGIN
223
+
224
+ # ---------- CSV ----------
225
+ seedgrid.backup.csv.delimiter=,
226
+ seedgrid.backup.csv.quote-char="
227
+ seedgrid.backup.csv.encoding=UTF-8
228
+
229
+ # ---------- Storage: filesystem ----------
230
+ seedgrid.backup.filesystem.base-path=/var/seedgrid/files
231
+
232
+ # ---------- Storage: s3 ----------
233
+ seedgrid.backup.s3.bucket=<bucket>
234
+ seedgrid.backup.s3.region=<regiao>
235
+ seedgrid.backup.s3.access-key=<SEGREDO:s3-access-key>
236
+ seedgrid.backup.s3.secret-key=<SEGREDO:s3-secret-key>
237
+ seedgrid.backup.s3.endpoint=<url-opcional>
238
+
239
+ # ---------- Storage: minio ----------
240
+ seedgrid.backup.minio.bucket=<bucket>
241
+ seedgrid.backup.minio.region=us-east-1
242
+ seedgrid.backup.minio.access-key=<SEGREDO:minio-access-key>
243
+ seedgrid.backup.minio.secret-key=<SEGREDO:minio-secret-key>
244
+ seedgrid.backup.minio.endpoint=<url-minio>
245
+
246
+ # ---------- Storage: azure-blob (connection-string OU account-name+account-key) ----------
247
+ seedgrid.backup.azure-blob.connection-string=<SEGREDO:azure-connection-string>
248
+ seedgrid.backup.azure-blob.container=<container>
249
+ seedgrid.backup.azure-blob.account-name=<conta>
250
+ seedgrid.backup.azure-blob.account-key=<SEGREDO:azure-account-key>
251
+
252
+ # ---------- Storage: google-drive (credentials-file OU credentials-json) ----------
253
+ seedgrid.backup.google-drive.root-folder-id=<folder-id>
254
+ seedgrid.backup.google-drive.credentials-file=<caminho/service-account.json>
255
+ seedgrid.backup.google-drive.credentials-json=<SEGREDO:google-drive-credentials-json>
256
+
257
+ # ---------- Storage: onedrive ----------
258
+ seedgrid.backup.onedrive.client-id=<client-id>
259
+ seedgrid.backup.onedrive.client-secret=<SEGREDO:onedrive-client-secret>
260
+ seedgrid.backup.onedrive.tenant-id=<tenant-id>
261
+ seedgrid.backup.onedrive.root-folder-path=/seedgrid/files
262
+
263
+ # ---------- Storage: gcs (credentials-file OU credentials-json) ----------
264
+ seedgrid.backup.gcs.bucket=<bucket>
265
+ seedgrid.backup.gcs.project-id=<projeto>
266
+ seedgrid.backup.gcs.credentials-file=<caminho/service-account.json>
267
+ seedgrid.backup.gcs.credentials-json=<SEGREDO:gcs-credentials-json>
268
+
269
+ # ---------- Rate limit do POST /exports (extensão resilience) ----------
270
+ seedgrid.ratelimit.export-create.permits=10
271
+ seedgrid.ratelimit.export-create.window=PT1H
272
+ ```
273
+
274
+ ## 8. Receitas
275
+
276
+ **Execução só pela fila (sem threads ad hoc), 2 jobs simultâneos no máximo**
277
+ ```properties
278
+ seedgrid.backup.async-enabled=false
279
+ seedgrid.backup.max-concurrent-exports=2
280
+ seedgrid.backup.queue-poll-interval=15s
281
+ ```
282
+
283
+ **MinIO via variáveis de ambiente (aliases do MP)**
284
+ ```
285
+ SEEDGRID_BACKUP_STORAGE=minio
286
+ SEEDGRID_BACKUP_MINIO_ENDPOINT=<url-minio>
287
+ SEEDGRID_BACKUP_MINIO_BUCKET=<bucket>
288
+ SEEDGRID_BACKUP_MINIO_ACCESS_KEY=<SEGREDO:minio-access-key>
289
+ SEEDGRID_BACKUP_MINIO_SECRET_KEY=<SEGREDO:minio-secret-key>
290
+ ```
291
+
292
+ **E-mail de "backup pronto" via SMTP corporativo**
293
+ ```properties
294
+ seedgrid.backup.mailer.from=<backup@dominio>
295
+ seedgrid.backup.mailer.host=<smtp.dominio>
296
+ seedgrid.backup.mailer.port=587
297
+ seedgrid.backup.mailer.start-tls=REQUIRED
298
+ seedgrid.backup.mailer.username=<usuario>
299
+ seedgrid.backup.mailer.password=<SEGREDO:smtp-password>
300
+ ```
301
+
302
+ **Auditoria em MongoDB, entidades JPA do audit-postgresql no classpath**
303
+ ```properties
304
+ seedgrid.backup.excluded-domain-entity-packages=br.com.seedgrid.audit.postgresql.entities
305
+ ```
306
+ (pacote das entidades JPA do módulo `seedgrid-audit-postgresql`: `AuditLogEntity`, `AuditLogEntitiesEntity`, `AuditLogUsersEntity`)
307
+
308
+ **Retenção de 30 dias e CSV para Excel pt-BR**
309
+ ```properties
310
+ seedgrid.backup.retention-days=30
311
+ seedgrid.backup.csv.delimiter=;
312
+ seedgrid.backup.csv.encoding=ISO-8859-1
313
+ ```
314
+
315
+ ## 9. Dúvidas e lacunas
316
+
317
+ - `queue-poll-interval`/`notification.poll-interval` são `String` sem validação na interface; formatos aceitos são os do Quarkus Scheduler (`every`). Aceitação de `off`/`disabled` para desligar o trigger: **Não confirmado** nesta versão.
318
+ - `max-concurrent-exports` não limita jobs disparados diretamente com `async-enabled=true` (Confirmado pela leitura; impacto em carga não testado).
319
+ - O MP da extensão define `quarkus.flyway.*` para a datasource default — interação com hosts que usam várias extensões SeedGrid com Flyway não verificada.
@@ -0,0 +1,131 @@
1
+ ---
2
+ tags: [seedgrid, extension, backup, enum]
3
+ fonte: java/seedgrid-quarkus-ext-backup
4
+ branch: main
5
+ commit: 3bed4075ea
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # Enums — backup (Quarkus)
10
+
11
+ Voltar: [[SeedGrid/Extensions/backup/Visao-geral|Visão geral do backup]] · [[SeedGrid/Extensions/backup/Configuracao|Configuração]] · [[SeedGrid/Extensions/backup/Exemplos|Exemplos]] · [[SeedGrid/Extensions/backup/Rust|Porte Rust]]
12
+
13
+ Nenhum enum desta extensão é tipo de propriedade de configuração (`BackupConfig` não usa enums; `mailer.start-tls` é `String`). Todos aparecem em DTOs REST e/ou colunas persistidas.
14
+
15
+ ## 1. Índice
16
+
17
+ | Enum | Pacote/arquivo (`runtime/src/main/java/br/com/seedgrid/backup/`) | Usado em | Público? |
18
+ |---|---|---|---|
19
+ | [[SeedGrid/Extensions/backup/Enums#ExportStatus\|ExportStatus]] | `domains/ExportStatus.java` | `ExportJob.status` (coluna `export_jobs.status`), `ExportResponse.status`, `ExportJobRepository` | Sim |
20
+ | [[SeedGrid/Extensions/backup/Enums#ExportScope\|ExportScope]] | `domains/ExportScope.java` | `ExportRequest.scope`, `ExportResponse.scope`, `ExportJob.scope` (`export_jobs.scope`), `ExportContext.getScope()` (SPI) | Sim |
21
+ | [[SeedGrid/Extensions/backup/Enums#BackupFormat\|BackupFormat]] | `domains/BackupFormat.java` | `ExportRequest.format`, `ExportResponse.format`, `ExportJob.format` (`export_jobs.format`), SPI `BackupExporter#format()` | Sim |
22
+ | [[SeedGrid/Extensions/backup/Enums#ExportArtifact.ArtifactType\|ExportArtifact.ArtifactType]] | `entities/ExportArtifact.java` | `ExportArtifact.artifactType` (`export_artifacts.artifact_type`), `ExportResponse.artifacts[].type` | Sim |
23
+ | [[SeedGrid/Extensions/backup/Enums#ExportResult.ArtifactType\|ExportResult.ArtifactType]] | `spi/ExportResult.java` | `ExportResult.ArtifactData.type` (retorno do SPI `BackupExporter#export`) | Sim |
24
+
25
+ ## ExportStatus
26
+
27
+ Arquivo: `domains/ExportStatus.java` — FQN `br.com.seedgrid.backup.domains.ExportStatus`.
28
+
29
+ | Valor | Significado | Efeito / onde é tratado | Observações |
30
+ |---|---|---|---|
31
+ | `REQUESTED` | Pedido recebido, ainda não enfileirado | `ExportJob#onCreate` atribui se `status` for nulo; `claimJob` aceita `REQUESTED`/`QUEUED`; conta como `isInProgress()` (permite cancelar) | **Confirmado**. O `createExportJob` já grava `QUEUED` (`ExportService:132`), então na prática o job nunca nasce `REQUESTED` pelo fluxo REST; o valor só aparece se algo persistir um job sem status |
32
+ | `QUEUED` | Na fila de processamento | Status inicial gravado por `createExportJob`; `BackupSchedulerService#processQueuedExports` (via `findQueuedJobs`) inicia; `claimJob` → `RUNNING` | **Confirmado** |
33
+ | `RUNNING` | Export em execução | Gravado em `claimJob`; conta para `max-concurrent-exports` (`ExportJobRepositoryImpl#countRunningJobs`); `isInProgress()` | **Confirmado** |
34
+ | `DONE` | Concluído, pronto para download | Gravado em `executeExport` (com `expiresAt = agora + retention-days`); download permitido; `findReadyForNotification` só seleciona jobs `DONE` | **Confirmado** |
35
+ | `DONE_NOTIFIED` | Concluído e solicitante notificado | Gravado por `NotificationSchedulerService` após `notifyReady` com sucesso; download permitido; terminal | **Confirmado** |
36
+ | `FAILED` | Falhou | `markJobFailed` (qualquer exceção do pipeline, inclusive `ExportValidationException` do exporter); terminal; `GET .../download` → `410` | **Confirmado** |
37
+ | `EXPIRED` | Artefato expirou | Existe no enum e conta como terminal não baixável (`410` no download), mas **nenhum código grava `EXPIRED`**: a limpeza por retenção (`BackupSchedulerService#cleanExpiredExports`) apaga job + artefatos em vez de marcar. Um job `DONE` com `expiresAt` vencido ainda não limpo fica `DONE`, mas `ExportJob#isDownloadable()` retorna `false` (`isExpired()`) | **Confirmado** (busca por `ExportStatus.EXPIRED` sem ocorrências fora do enum) |
38
+ | `CANCELLED` | Cancelado | Gravado por `cancelExportJob` (só se `isInProgress()`); terminal; `DELETE` posterior exclui job + artefatos | **Confirmado** |
39
+
40
+ **Campos e métodos** (construtor `(code, displayName, downloadable, terminal)`):
41
+
42
+ | Valor | `getCode()` | `getDisplayName()` | `isDownloadable()` | `isTerminal()` | `isInProgress()` |
43
+ |---|---|---|---|---|---|
44
+ | `REQUESTED` | `requested` | Export requested | não | não | sim |
45
+ | `QUEUED` | `queued` | Queued for processing | não | não | sim |
46
+ | `RUNNING` | `running` | Export in progress | não | não | sim |
47
+ | `DONE` | `done` | Ready for download | sim | não | não |
48
+ | `DONE_NOTIFIED` | `done-notified` | Ready for download and notified | sim | sim | não |
49
+ | `FAILED` | `failed` | Export failed | não | sim | não |
50
+ | `EXPIRED` | `expired` | Export expired | não | sim | não |
51
+ | `CANCELLED` | `cancelled` | Export cancelled | não | sim | não |
52
+
53
+ `fromCode(String)` compara `code` ignorando caixa e lança `IllegalArgumentException("Unknown export status code: ...")`; **nenhum código da extensão o chama** (Confirmado) — existe só como API do enum.
54
+
55
+ **Serialização**
56
+ - JSON: nome da constante (`"DONE_NOTIFIED"`); sem `@JsonValue`/`@JsonProperty` (Confirmado). `ExportResponse.status` sai assim.
57
+ - Banco: `@Enumerated(EnumType.STRING)` em `ExportJob.status`; coluna `status VARCHAR(20)` (V400). **Não há CHECK constraint** sobre os valores — só `chk_progress`. O comentário SQL da V400 lista `REQUESTED, QUEUED, RUNNING, DONE, FAILED, EXPIRED, CANCELLED` (**omite `DONE_NOTIFIED`**, só no comentário; o valor cabe em 20 caracteres e é gravado normalmente).
58
+
59
+ **Transições confirmadas no código**
60
+
61
+ ```mermaid
62
+ stateDiagram-v2
63
+ [*] --> QUEUED: createExportJob
64
+ REQUESTED --> RUNNING: claimJob
65
+ QUEUED --> RUNNING: claimJob
66
+ RUNNING --> DONE: executeExport ok
67
+ RUNNING --> FAILED: exceção
68
+ QUEUED --> FAILED: exceção
69
+ DONE --> DONE_NOTIFIED: notificação enviada
70
+ REQUESTED --> CANCELLED: cancelExportJob
71
+ QUEUED --> CANCELLED: cancelExportJob
72
+ RUNNING --> CANCELLED: cancelExportJob
73
+ ```
74
+
75
+ (O comentário do Javadoc do enum mostra `FAILED → EXPIRED`; esse caminho **não** existe no código.)
76
+
77
+ **Onde é usado**: endpoints `GET /exports`, `GET /exports/{jobId}`, `GET /exports/{jobId}/download` (`410` quando terminal e não baixável), `DELETE /exports/{jobId}`; propriedades que o influenciam: `async-enabled`, `max-concurrent-exports`, `retention-days`, `notification.*` — ver [[SeedGrid/Extensions/backup/Configuracao|Configuração]]; entidade `ExportJob`; evento `SgUserEvent` (`data.status`: `"DONE"` ou `"FAILED"`).
78
+
79
+ ## ExportScope
80
+
81
+ Arquivo: `domains/ExportScope.java` — FQN `br.com.seedgrid.backup.domains.ExportScope`.
82
+
83
+ | Valor | Significado | Efeito / onde é tratado | Observações |
84
+ |---|---|---|---|
85
+ | `DOMAIN` | Entidades de negócio (metamodel JPA) | `ExtractDataService` extrai entidades JPA, pulando pacotes de `seedgrid.backup.excluded-domain-entity-packages`; ambos exporters aceitam | **Confirmado**. Exporta `data/<entidade>.csv` / `.sql` |
86
+ | `RAW` | Tabelas do schema via `information_schema` | `ExtractDataService`; exclui `export_jobs`/`export_artifacts` | **Confirmado** |
87
+ | `CUSTOM` | Seleção de módulos (feature futura) | **Aceito pela API** (`POST /exports` retorna `201`), mas `validate()` dos dois exporters lança `ExportValidationException` e `switch` lança `ExportException`; como a validação ocorre em `executeExport`, o job termina `FAILED` com `errorMessage` ("CUSTOM scope not yet implemented for CSV/SQL dump export") | **Confirmado**. Existe no enum, mas nenhum código o trata com sucesso |
88
+
89
+ **Campos**: `(code, displayName, description)`; `getCode()` = `domain`/`raw`/`custom`; `fromCode(String)` ignora caixa e lança `IllegalArgumentException`, **não chamado** pela extensão.
90
+
91
+ **Serialização**: JSON pelo nome (`"DOMAIN"`); `ExportRequest.scope` é `@NotNull` (sem escopo → erro de validação). Banco: `@Enumerated(EnumType.STRING)` em `ExportJob.scope`, `scope VARCHAR(20)`, **sem CHECK constraint**; comentário SQL lista `DOMAIN, RAW, CUSTOM`.
92
+
93
+ **Onde é usado**: `POST /exports` (corpo), `ExportContext.getScope()`, manifest (`scope`), entidade `ExportJob`.
94
+
95
+ ## BackupFormat
96
+
97
+ Arquivo: `domains/BackupFormat.java` — FQN `br.com.seedgrid.backup.domains.BackupFormat`.
98
+
99
+ | Valor | Significado | Efeito / onde é tratado | Observações |
100
+ |---|---|---|---|
101
+ | `CSV_ZIP` | ZIP com CSVs por tabela/entidade (portabilidade) | `CsvZipExporter#format()`; usa `seedgrid.backup.csv.*` | **Confirmado** |
102
+ | `SQL_DUMP_ZIP` | ZIP com `INSERT`s por tabela (restore técnico) | `SqlDumpZipExporter#format()`; `csv.*` não se aplica | **Confirmado**. O Javadoc fala em "schema, constraints, indexes, sequences", mas o exporter gera apenas `data/<tabela>.sql` com INSERTs (Confirmado em `SqlDumpZipExporter`) |
103
+
104
+ **Campos**: `(code, displayName, mimeType)`; `getCode()` = `csv-zip` / `sql-dump-zip`; `getMimeType()` = `application/zip` nos dois (nenhum chamador encontrado: o `mimeType` do artefato vem de `ArtifactData`); `fromCode` ignora caixa, **não chamado**.
105
+
106
+ **Serialização**: JSON pelo nome (`"CSV_ZIP"`); `@NotNull` em `ExportRequest.format`; formato sem exporter registrado → `IllegalArgumentException("Unsupported export format: ...")` no `POST`. Banco: `@Enumerated(EnumType.STRING)`, `format VARCHAR(20)`, **sem CHECK**; `SQL_DUMP_ZIP` tem 12 caracteres, cabe.
107
+
108
+ **Onde é usado**: `BackupExporterRegistry` (1 exporter por valor; duplicata falha no startup), `POST /exports`, manifest.
109
+
110
+ ## ExportArtifact.ArtifactType
111
+
112
+ Arquivo: `entities/ExportArtifact.java` (enum aninhado) — FQN `br.com.seedgrid.backup.entities.ExportArtifact.ArtifactType`.
113
+
114
+ | Valor | Significado | Efeito / onde é tratado | Observações |
115
+ |---|---|---|---|
116
+ | `ZIP` | Arquivo principal do export | Único tipo que `ExportService#getDownloadArtifact` procura para o download; único tipo gerado pelos exporters embutidos | **Confirmado** |
117
+ | `MANIFEST` | `manifest.json` como artefato próprio | Só convertido em `mapArtifactType`; nenhum exporter embutido o produz (o manifest vai dentro do ZIP) | Existe no enum, mas nenhum código o produz; pode ser enviado por exporter customizado, que é gravado em `export_artifacts` mas não é baixável pela API |
118
+ | `CHECKSUMS` | `checksums.txt` como artefato próprio | idem | idem |
119
+ | `LOG` | Log de execução | idem | idem |
120
+
121
+ Sem campos. Serialização: JSON pelo nome (`ExportResponse.ArtifactInfo.type`); banco `@Enumerated(EnumType.STRING)`, `artifact_type VARCHAR(20)`, **sem CHECK** (comentário SQL lista os 4 valores).
122
+
123
+ ## ExportResult.ArtifactType
124
+
125
+ Arquivo: `spi/ExportResult.java` (enum aninhado) — FQN `br.com.seedgrid.backup.spi.ExportResult.ArtifactType`.
126
+
127
+ Valores: `ZIP`, `MANIFEST`, `CHECKSUMS`, `LOG` — espelho exato do enum de entidade; `ExportService#mapArtifactType` converte 1:1 por `switch` exaustivo (**Confirmado**). Usado por quem implementa `BackupExporter` (campo `type` de `ExportResult.ArtifactData`). Não é serializado nem persistido diretamente. Para o efeito de cada valor veja a seção anterior.
128
+
129
+ ## Internos
130
+
131
+ Nenhum enum privado ou interno encontrado em `runtime/src/main` além dos acima (Confirmado por busca de `enum`). Enums de testes ignorados.