@seedgrid/ai-toolkit 0.0.0-stage → 0.3.1

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 (226) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -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 +209 -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/selfinstall.js +63 -0
  16. package/dist/commands/status.js +73 -0
  17. package/dist/commands/update.js +8 -0
  18. package/dist/commands/validate.js +27 -0
  19. package/dist/core/apply.js +181 -0
  20. package/dist/core/blocks.js +64 -0
  21. package/dist/core/content.js +528 -0
  22. package/dist/core/env.js +40 -0
  23. package/dist/core/frontmatter.js +29 -0
  24. package/dist/core/hash.js +14 -0
  25. package/dist/core/inspect.js +51 -0
  26. package/dist/core/lock.js +124 -0
  27. package/dist/core/paths.js +65 -0
  28. package/dist/core/plan.js +242 -0
  29. package/dist/core/tools.js +62 -0
  30. package/dist/core/types.js +11 -0
  31. package/dist/core/updates.js +121 -0
  32. package/docs/arquitetura.md +80 -0
  33. package/docs/compatibilidade.md +50 -0
  34. package/docs/formato.md +155 -0
  35. package/docs/instalacao.md +105 -0
  36. package/docs/manutencao.md +115 -0
  37. package/package.json +43 -4
  38. package/seedgridKB/SeedGrid/Extensions/Catalogo-de-enums.md +161 -0
  39. package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +971 -0
  40. package/seedgridKB/SeedGrid/Extensions/Indice.md +63 -0
  41. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +124 -0
  42. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Enums.md +40 -0
  43. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +97 -0
  44. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +114 -0
  45. package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao-Rust.md +69 -0
  46. package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao.md +88 -0
  47. package/seedgridKB/SeedGrid/Extensions/apikeys/Enums.md +33 -0
  48. package/seedgridKB/SeedGrid/Extensions/apikeys/Exemplos.md +121 -0
  49. package/seedgridKB/SeedGrid/Extensions/apikeys/Rust.md +126 -0
  50. package/seedgridKB/SeedGrid/Extensions/apikeys/Visao-geral.md +111 -0
  51. package/seedgridKB/SeedGrid/Extensions/audit/Configuracao-Rust.md +93 -0
  52. package/seedgridKB/SeedGrid/Extensions/audit/Configuracao.md +127 -0
  53. package/seedgridKB/SeedGrid/Extensions/audit/Enums.md +66 -0
  54. package/seedgridKB/SeedGrid/Extensions/audit/Exemplos.md +151 -0
  55. package/seedgridKB/SeedGrid/Extensions/audit/Rust.md +120 -0
  56. package/seedgridKB/SeedGrid/Extensions/audit/Visao-geral.md +114 -0
  57. package/seedgridKB/SeedGrid/Extensions/backup/Configuracao-Rust.md +136 -0
  58. package/seedgridKB/SeedGrid/Extensions/backup/Configuracao.md +319 -0
  59. package/seedgridKB/SeedGrid/Extensions/backup/Enums.md +131 -0
  60. package/seedgridKB/SeedGrid/Extensions/backup/Exemplos.md +210 -0
  61. package/seedgridKB/SeedGrid/Extensions/backup/Rust.md +135 -0
  62. package/seedgridKB/SeedGrid/Extensions/backup/Visao-geral.md +150 -0
  63. package/seedgridKB/SeedGrid/Extensions/billing/Configuracao-Rust.md +86 -0
  64. package/seedgridKB/SeedGrid/Extensions/billing/Configuracao.md +243 -0
  65. package/seedgridKB/SeedGrid/Extensions/billing/Enums.md +165 -0
  66. package/seedgridKB/SeedGrid/Extensions/billing/Exemplos.md +205 -0
  67. package/seedgridKB/SeedGrid/Extensions/billing/Rust.md +109 -0
  68. package/seedgridKB/SeedGrid/Extensions/billing/Visao-geral.md +181 -0
  69. package/seedgridKB/SeedGrid/Extensions/broker/Configuracao-Rust.md +40 -0
  70. package/seedgridKB/SeedGrid/Extensions/broker/Visao-geral.md +114 -0
  71. package/seedgridKB/SeedGrid/Extensions/cache/Configuracao-Rust.md +73 -0
  72. package/seedgridKB/SeedGrid/Extensions/cache/Configuracao.md +112 -0
  73. package/seedgridKB/SeedGrid/Extensions/cache/Enums.md +36 -0
  74. package/seedgridKB/SeedGrid/Extensions/cache/Exemplos.md +149 -0
  75. package/seedgridKB/SeedGrid/Extensions/cache/Rust.md +81 -0
  76. package/seedgridKB/SeedGrid/Extensions/cache/Visao-geral.md +90 -0
  77. package/seedgridKB/SeedGrid/Extensions/commons/Configuracao.md +107 -0
  78. package/seedgridKB/SeedGrid/Extensions/commons/Enums.md +105 -0
  79. package/seedgridKB/SeedGrid/Extensions/commons/Exemplos.md +141 -0
  80. package/seedgridKB/SeedGrid/Extensions/commons/Visao-geral.md +99 -0
  81. package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +122 -0
  82. package/seedgridKB/SeedGrid/Extensions/exchange/Enums.md +29 -0
  83. package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +82 -0
  84. package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +118 -0
  85. package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao-Rust.md +110 -0
  86. package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao.md +157 -0
  87. package/seedgridKB/SeedGrid/Extensions/filemanagement/Exemplos.md +157 -0
  88. package/seedgridKB/SeedGrid/Extensions/filemanagement/Rust.md +70 -0
  89. package/seedgridKB/SeedGrid/Extensions/filemanagement/Visao-geral.md +88 -0
  90. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao-Rust.md +124 -0
  91. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +195 -0
  92. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Enums.md +71 -0
  93. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Exemplos.md +149 -0
  94. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Rust.md +139 -0
  95. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +130 -0
  96. package/seedgridKB/SeedGrid/Extensions/notification/Configuracao.md +141 -0
  97. package/seedgridKB/SeedGrid/Extensions/notification/Enums.md +52 -0
  98. package/seedgridKB/SeedGrid/Extensions/notification/Exemplos.md +141 -0
  99. package/seedgridKB/SeedGrid/Extensions/notification/Visao-geral.md +113 -0
  100. package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao-Rust.md +67 -0
  101. package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao.md +94 -0
  102. package/seedgridKB/SeedGrid/Extensions/privacy/Enums.md +79 -0
  103. package/seedgridKB/SeedGrid/Extensions/privacy/Exemplos.md +172 -0
  104. package/seedgridKB/SeedGrid/Extensions/privacy/Rust.md +107 -0
  105. package/seedgridKB/SeedGrid/Extensions/privacy/Visao-geral.md +90 -0
  106. package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao-Rust.md +72 -0
  107. package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao.md +104 -0
  108. package/seedgridKB/SeedGrid/Extensions/realtime/Exemplos.md +104 -0
  109. package/seedgridKB/SeedGrid/Extensions/realtime/Rust.md +69 -0
  110. package/seedgridKB/SeedGrid/Extensions/realtime/Visao-geral.md +105 -0
  111. package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao-Rust.md +68 -0
  112. package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao.md +186 -0
  113. package/seedgridKB/SeedGrid/Extensions/resilience/Enums.md +96 -0
  114. package/seedgridKB/SeedGrid/Extensions/resilience/Exemplos.md +229 -0
  115. package/seedgridKB/SeedGrid/Extensions/resilience/Rust.md +80 -0
  116. package/seedgridKB/SeedGrid/Extensions/resilience/Visao-geral.md +112 -0
  117. package/seedgridKB/SeedGrid/Extensions/runtime/Configuracao-Rust.md +90 -0
  118. package/seedgridKB/SeedGrid/Extensions/runtime/Visao-geral.md +114 -0
  119. package/seedgridKB/SeedGrid/Extensions/security/Configuracao-Rust.md +327 -0
  120. package/seedgridKB/SeedGrid/Extensions/security/Configuracao.md +510 -0
  121. package/seedgridKB/SeedGrid/Extensions/security/Enums.md +95 -0
  122. package/seedgridKB/SeedGrid/Extensions/security/Exemplos.md +218 -0
  123. package/seedgridKB/SeedGrid/Extensions/security/Rust.md +203 -0
  124. package/seedgridKB/SeedGrid/Extensions/security/Visao-geral.md +131 -0
  125. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao-Rust.md +188 -0
  126. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +345 -0
  127. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Enums.md +117 -0
  128. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Exemplos.md +205 -0
  129. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Rust.md +161 -0
  130. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +142 -0
  131. package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao-Rust.md +75 -0
  132. package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao.md +152 -0
  133. package/seedgridKB/SeedGrid/Extensions/whatsapp/Enums.md +198 -0
  134. package/seedgridKB/SeedGrid/Extensions/whatsapp/Exemplos.md +173 -0
  135. package/seedgridKB/SeedGrid/Extensions/whatsapp/Rust.md +83 -0
  136. package/seedgridKB/SeedGrid/Extensions/whatsapp/Visao-geral.md +99 -0
  137. package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +112 -0
  138. package/seedgridKB/SeedGrid/SeedGrid-components/Indice.md +323 -0
  139. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/API.md +257 -0
  140. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Exemplos.md +307 -0
  141. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Visao-geral.md +51 -0
  142. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/API.md +174 -0
  143. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Exemplos.md +236 -0
  144. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Visao-geral.md +76 -0
  145. package/seedgridKB/SeedGrid/SeedGrid-components/digits/API.md +339 -0
  146. package/seedgridKB/SeedGrid/SeedGrid-components/digits/Exemplos.md +311 -0
  147. package/seedgridKB/SeedGrid/SeedGrid-components/digits/Visao-geral.md +57 -0
  148. package/seedgridKB/SeedGrid/SeedGrid-components/editor/API.md +125 -0
  149. package/seedgridKB/SeedGrid/SeedGrid-components/editor/Exemplos.md +116 -0
  150. package/seedgridKB/SeedGrid/SeedGrid-components/editor/Visao-geral.md +86 -0
  151. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/API.md +490 -0
  152. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Exemplos.md +544 -0
  153. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Visao-geral.md +69 -0
  154. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/API.md +113 -0
  155. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Exemplos.md +159 -0
  156. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Visao-geral.md +92 -0
  157. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/API.md +516 -0
  158. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Exemplos.md +629 -0
  159. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Visao-geral.md +80 -0
  160. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/API.md +615 -0
  161. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Exemplos.md +384 -0
  162. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral.md +111 -0
  163. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/API.md +661 -0
  164. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Exemplos.md +312 -0
  165. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Visao-geral.md +123 -0
  166. package/seedgridKB/SeedGrid/SeedGrid-components/layout/API.md +1090 -0
  167. package/seedgridKB/SeedGrid/SeedGrid-components/layout/Exemplos.md +1172 -0
  168. package/seedgridKB/SeedGrid/SeedGrid-components/layout/Visao-geral.md +98 -0
  169. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/Visao-geral.md +98 -0
  170. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-apikeys.md +118 -0
  171. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-audit.md +88 -0
  172. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-backup.md +131 -0
  173. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-platform.md +132 -0
  174. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-user.md +120 -0
  175. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-login-tenancy.md +119 -0
  176. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-security.md +427 -0
  177. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-self-enter.md +104 -0
  178. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-subdomain-tenancy.md +110 -0
  179. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/API.md +490 -0
  180. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Exemplos.md +561 -0
  181. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Visao-geral.md +82 -0
  182. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/Visao-geral.md +68 -0
  183. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-commons.md +61 -0
  184. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-core.md +140 -0
  185. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-playground.md +112 -0
  186. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-theme.md +97 -0
  187. package/seedgridKB/SeedGrid/SeedGrid-components/providers/API.md +177 -0
  188. package/seedgridKB/SeedGrid/SeedGrid-components/providers/Exemplos.md +332 -0
  189. package/seedgridKB/SeedGrid/SeedGrid-components/providers/Visao-geral.md +106 -0
  190. package/seedgridKB/SeedGrid/SeedGrid-components/showcase.md +70 -0
  191. package/seedgridKB/SeedGrid/Toolkit/agents/arquiteto.md +53 -0
  192. package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +45 -0
  193. package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +43 -0
  194. package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +41 -0
  195. package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +44 -0
  196. package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +40 -0
  197. package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +78 -0
  198. package/seedgridKB/SeedGrid/Toolkit/references/glossario.md +15 -0
  199. package/seedgridKB/SeedGrid/Toolkit/references/modos-shared-native.md +27 -0
  200. package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +54 -0
  201. package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +39 -0
  202. package/seedgridKB/SeedGrid/Toolkit/rules/formato-entrega.md +29 -0
  203. package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +47 -0
  204. package/seedgridKB/SeedGrid/Toolkit/rules/personalizacao-local.md +22 -0
  205. package/seedgridKB/SeedGrid/Toolkit/skills/planejar-mudanca/SKILL.md +38 -0
  206. package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/SKILL.md +33 -0
  207. package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/references/checklist.md +25 -0
  208. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-backend-crud/SKILL.md +29 -0
  209. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-bump/SKILL.md +26 -0
  210. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/SKILL.md +221 -0
  211. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/agents/openai.yaml +4 -0
  212. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/checklist.md +31 -0
  213. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/patterns.md +185 -0
  214. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/routing.md +66 -0
  215. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/SKILL.md +56 -0
  216. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +4 -0
  217. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/checklist.md +32 -0
  218. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/steps.md +114 -0
  219. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-review/SKILL.md +61 -0
  220. package/seedgridKB/SeedGrid/Toolkit/skills/validar-mudanca/SKILL.md +29 -0
  221. package/seedgridKB/SeedGrid/Toolkit/templates/decisao-arquitetura.md +29 -0
  222. package/seedgridKB/SeedGrid/Toolkit/templates/especificacao-tarefa.md +32 -0
  223. package/seedgridKB/SeedGrid/Toolkit/templates/relatorio-validacao.md +30 -0
  224. package/seedgridKB/SeedGrid/Versoes.md +64 -0
  225. package/seedgridKB/SeedGrid/Visao-geral.md +35 -0
  226. package/seedgridKB/manifest.json +142 -0
@@ -0,0 +1,152 @@
1
+ ---
2
+ tags: [seedgrid, extension, whatsapp, configuracao]
3
+ fonte: java/seedgrid-quarkus-ext-whatsapp
4
+ branch: main
5
+ commit: d8454f6313
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # Configuração — seedgrid-whatsapp (Quarkus)
10
+
11
+ Voltar: [[SeedGrid/Extensions/whatsapp/Visao-geral|Visão geral do whatsapp]] · [[SeedGrid/Extensions/whatsapp/Exemplos|Exemplos do whatsapp]] · [[SeedGrid/Extensions/whatsapp/Configuracao-Rust|Configuração do porte Rust]]
12
+
13
+ ## 1. Cabeçalho
14
+
15
+ | Item | Valor |
16
+ |---|---|
17
+ | Prefixo | `seedgrid.whatsapp` |
18
+ | Classes de config | `WhatsAppConfig` (só `api`) e `WhatsAppProviderConfig` (`evolution`, `cloud`, `rest-client`) — **duas** interfaces `@ConfigMapping` com o **mesmo** prefixo |
19
+ | Mecanismo | `@ConfigMapping` (SmallRye) + `@ConfigRoot(phase = ConfigPhase.RUN_TIME)` |
20
+ | Fase | Runtime (todas) |
21
+ | Defaults embutidos | `seedgrid-whatsapp-core/src/main/resources/META-INF/microprofile-config.properties` (ordinal 100; o `application.properties` do app sobrescreve) |
22
+ | Ponte para o Rest Client | `application.properties` dentro dos jars `seedgrid-whatsapp-evolution` e `seedgrid-whatsapp-whatsapp-cloud` mapeiam `quarkus.rest-client.<configKey>.url` para as propriedades `seedgrid.whatsapp.rest-client.*` |
23
+ | Seleção de bean | `@LookupIfProperty(name = "seedgrid.whatsapp.api", stringValue = ...)` em `EvolutionWhatsAppApi` e `OfficialCloudWhatsAppApi` + `WhatsAppApiProducer#produce()` |
24
+
25
+ Arquivos de declaração (caminhos relativos a `seedgrid-platform`):
26
+ - `java/seedgrid-quarkus-ext-whatsapp/seedgrid-whatsapp-core/src/main/java/br/com/seedgrid/whatsapp/configs/WhatsAppConfig.java`
27
+ - `java/seedgrid-quarkus-ext-whatsapp/seedgrid-whatsapp-core/src/main/java/br/com/seedgrid/whatsapp/configs/WhatsAppProviderConfig.java`
28
+ - `java/seedgrid-quarkus-ext-whatsapp/seedgrid-whatsapp-core/src/main/resources/META-INF/microprofile-config.properties`
29
+
30
+ Não há `*BuildTimeConfig` no deployment (`WhatsAppCoreProcessor` não lê config) nem `@ConfigProperty`/`ConfigProvider` no código de produção (**Confirmado** por busca).
31
+
32
+ ## 2. Propriedades da extension
33
+
34
+ Abreviações de origem: `core/…` = `java/seedgrid-quarkus-ext-whatsapp/seedgrid-whatsapp-core/src/main/…`; `evo/…` = `java/seedgrid-quarkus-ext-whatsapp/seedgrid-whatsapp-evolution/src/main/…`; `cloud/…` = `java/seedgrid-quarkus-ext-whatsapp/seedgrid-whatsapp-whatsapp-cloud/src/main/…`.
35
+
36
+ ### 2.1 Seleção do provider
37
+
38
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
39
+ |---|---|---|---|---|---|---|---|---|---|
40
+ | `seedgrid.whatsapp.api` | `String` | `default`, `evolution`, `whatsapp-cloud` (enum [[SeedGrid/Extensions/whatsapp/Enums#WhatsAppProvider\|WhatsAppProvider]]: `DEFAULT`, `EVOLUTION`, `OFFICIAL`) | `default` (`@WithDefault("default")`; também `${SEEDGRID_WHATSAPP_API:default}` no `microprofile-config.properties`) | Não | `WhatsAppProvider.fromConfig` faz `trim().toLowerCase()`; valor vazio ou desconhecido vira `DEFAULT`. `DEFAULT` → `DefaultWhatsAppApi` (só registra WARNING e devolve resultado vazio). `evolution`/`whatsapp-cloud` → bean do provider **se** resolvível via `Instance` (módulo no classpath e `@LookupIfProperty` casando); senão cai no `DefaultWhatsAppApi` silenciosamente (**Confirmado**). | Escolher o provider injetado em `WhatsAppApi` | Ativa `@LookupIfProperty` de `EvolutionWhatsAppApi` (`evolution`) e `OfficialCloudWhatsAppApi` (`whatsapp-cloud`). **Inferência:** `@LookupIfProperty` compara o texto exato, então `Evolution`/` evolution ` seria aceito pelo `fromConfig` mas não pelo lookup → fallback para Default. | Runtime | Decl.: `core/java/.../configs/WhatsAppConfig.java` → `WhatsAppConfig#api()`; consumo: `core/java/.../services/WhatsAppApiProducer.java` → `produce()`, `core/java/.../enums/WhatsAppProvider.java` → `fromConfig`, `evo/java/.../services/EvolutionWhatsAppApi.java` (`@LookupIfProperty`), `cloud/java/.../services/OfficialCloudWhatsAppApi.java` (`@LookupIfProperty`) |
41
+
42
+ ### 2.2 Provider Evolution API
43
+
44
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
45
+ |---|---|---|---|---|---|---|---|---|---|
46
+ | `seedgrid.whatsapp.evolution.api-key` 🔒 | `Optional<String>` | texto não vazio | — (no `microprofile-config.properties`: `${SEEDGRID_WHATSAPP_EVOLUTION_API_KEY:}`, ou seja vazio) | Condicional: obrigatória quando `api=evolution` | Lida a cada chamada por `requireApiKey()`; vazia/ausente → `IllegalStateException("Missing required config 'seedgrid.whatsapp.evolution.api-key' for provider 'evolution'.")` no momento da chamada (não no boot). Enviada no header HTTP `apikey`. | Autenticação na Evolution API | Só tem efeito com `seedgrid.whatsapp.api=evolution` (ou injeção direta de `EvolutionWhatsAppApi`) | Runtime | Decl.: `core/java/.../configs/WhatsAppProviderConfig.java` → `Evolution#apiKey()`; consumo: `evo/java/.../services/EvolutionWhatsAppApi.java` → `requireApiKey()`; header em `evo/java/.../clients/EvolutionRestClient.java` (`@HeaderParam("apikey")`) |
47
+ | `seedgrid.whatsapp.rest-client.evolution.url` | `Optional<String>` | URL base da Evolution (ex.: `https://<host-evolution>`) | — (no `microprofile-config.properties`: `${SEEDGRID_WHATSAPP_REST_CLIENT_EVOLUTION_URL:}`, vazio) | Condicional: obrigatória quando `api=evolution` | Funciona via ponte: é consumida pela expressão `quarkus.rest-client.evolution.url=${seedgrid.whatsapp.rest-client.evolution.url:}` do `application.properties` do jar evolution, que define a base do `EvolutionRestClient` (`configKey = "evolution"`). **Inferência:** sem URL, o Rest Client falha ao ser criado/usado (mensagem do Quarkus sobre base URL ausente). | URL base do `EvolutionRestClient` | Alimenta `quarkus.rest-client.evolution.url` (ver seção 3) | Runtime | Decl.: `core/java/.../configs/WhatsAppProviderConfig.java` → `RestClient.EvolutionRest#url()`; ponte: `evo/resources/application.properties`; consumo: `evo/java/.../clients/EvolutionRestClient.java` (`@RegisterRestClient(configKey = "evolution")`) |
48
+
49
+ ### 2.3 Provider WhatsApp Cloud API (Meta Graph API)
50
+
51
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
52
+ |---|---|---|---|---|---|---|---|---|---|
53
+ | `seedgrid.whatsapp.cloud.access-token` 🔒 | `Optional<String>` | token de acesso da Graph API | — (no `microprofile-config.properties`: `${SEEDGRID_WHATSAPP_CLOUD_ACCESS_TOKEN:}`, vazio) | Condicional: obrigatória quando `api=whatsapp-cloud` | Lida a cada chamada por `bearer()`; vazia/ausente → `IllegalStateException("Missing required config 'seedgrid.whatsapp.cloud.access-token' for provider 'whatsapp-cloud'.")`. Enviada como `Authorization: Bearer <token>`. | Autenticação na Graph API | Só com `seedgrid.whatsapp.api=whatsapp-cloud` | Runtime | Decl.: `core/java/.../configs/WhatsAppProviderConfig.java` → `Cloud#accessToken()`; consumo: `cloud/java/.../clients/services/OfficialCloudWhatsAppApi.java` → `bearer()`; header em `cloud/java/.../clients/CloudRestClient.java` (`@HeaderParam("Authorization")`) |
54
+ | `seedgrid.whatsapp.rest-client.cloud.url` | `String` | URL base da Graph API com versão | `https://graph.facebook.com/v21.0` (`@WithDefault` e `${SEEDGRID_WHATSAPP_REST_CLIENT_CLOUD_URL:https://graph.facebook.com/v21.0}`) | Não | Funciona via ponte: é consumida por `quarkus.rest-client.cloud.url=${seedgrid.whatsapp.rest-client.cloud.url:}` no jar cloud. Endpoints usados: `POST /{phoneNumberId}/messages` e `POST /{phoneNumberId}/media`. | URL base do `CloudRestClient` | Alimenta `quarkus.rest-client.cloud.url` (ver seção 3) | Runtime | Decl.: `core/java/.../configs/WhatsAppProviderConfig.java` → `RestClient.CloudRest#url()`; ponte: `cloud/resources/application.properties`; consumo: `cloud/java/.../clients/CloudRestClient.java` (`@RegisterRestClient(configKey = "cloud")`) |
55
+
56
+ ### Variáveis de ambiente
57
+
58
+ O `microprofile-config.properties` do core lê explicitamente estas variáveis (via expressão `${ENV:padrão}`) — **Confirmado**:
59
+
60
+ | Propriedade | Variável lida |
61
+ |---|---|
62
+ | `seedgrid.whatsapp.api` | `SEEDGRID_WHATSAPP_API` |
63
+ | `seedgrid.whatsapp.rest-client.evolution.url` | `SEEDGRID_WHATSAPP_REST_CLIENT_EVOLUTION_URL` |
64
+ | `seedgrid.whatsapp.evolution.api-key` 🔒 | `SEEDGRID_WHATSAPP_EVOLUTION_API_KEY` |
65
+ | `seedgrid.whatsapp.rest-client.cloud.url` | `SEEDGRID_WHATSAPP_REST_CLIENT_CLOUD_URL` |
66
+ | `seedgrid.whatsapp.cloud.access-token` 🔒 | `SEEDGRID_WHATSAPP_CLOUD_ACCESS_TOKEN` |
67
+
68
+ Os mesmos nomes também resultam da regra MicroProfile (env source, ordinal 300). Um `application.properties` do app (ordinal 250) que defina a propriedade explicitamente vence a expressão do `microprofile-config.properties` (ordinal 100), mas perde para a env var pela regra padrão.
69
+
70
+ ## 3. Propriedades de framework (quarkus.*)
71
+
72
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
73
+ |---|---|---|---|---|---|---|---|---|---|
74
+ | `quarkus.rest-client.evolution.url` | `String` | URL | `${seedgrid.whatsapp.rest-client.evolution.url:}` (definido pela lib) | Condicional (provider evolution) | Base URL do `EvolutionRestClient`. A lib define a ponte; o app pode sobrescrever diretamente. | Rest Client Evolution | Derivada de `seedgrid.whatsapp.rest-client.evolution.url` | Runtime | `evo/resources/application.properties`; `EvolutionRestClient` |
75
+ | `quarkus.rest-client.cloud.url` | `String` | URL | `${seedgrid.whatsapp.rest-client.cloud.url:}` (definido pela lib) | Não (herda default `https://graph.facebook.com/v21.0`) | Base URL do `CloudRestClient`. | Rest Client Cloud | Derivada de `seedgrid.whatsapp.rest-client.cloud.url` | Runtime | `cloud/resources/application.properties`; `CloudRestClient` |
76
+
77
+ Observações:
78
+ - **Inferência:** a ponte depende de o Quarkus carregar `application.properties` presentes em jars de dependência (o SmallRye carrega todos os recursos `application.properties` do classpath com ordinal 250). Se o app também tiver `quarkus.rest-client.evolution.url`, há duas fontes com o mesmo ordinal — prefira definir `seedgrid.whatsapp.rest-client.*` e não a chave `quarkus.*` diretamente, ou defina ambas com o mesmo valor. Não confirmado em execução.
79
+ - Demais chaves `quarkus.rest-client.evolution.*` / `quarkus.rest-client.cloud.*` (timeouts, `scope`, proxy etc.) são do Quarkus e não são definidas pela lib; o teste usa `quarkus.rest-client.evolution.scope=jakarta.inject.Singleton` (seção 4).
80
+ - O deployment (`WhatsAppCoreProcessor`) apenas registra a feature `seedgrid-whatsapp-core`, indexa `seedgrid-whatsapp-evolution` e `seedgrid-whatsapp-whatsapp-cloud` e registra `DefaultWhatsAppApi`/`WhatsAppApiProducer` como beans não removíveis — não lê config.
81
+
82
+ ## 4. Propriedades usadas só em testes
83
+
84
+ Fonte: `java/seedgrid-quarkus-ext-whatsapp/seedgrid-whatsapp-evolution/src/test/resources/application.properties` e testes em `seedgrid-whatsapp-evolution/src/test/java`. Valores reais (URL do servidor, chave, instância) existem commitados no repositório e **não** são reproduzidos aqui.
85
+
86
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
87
+ |---|---|---|---|---|---|---|---|---|---|
88
+ | `evolution.api.key` 🔒 | `String` | chave | — | Sim (nos ITs) | Injetada por `@ConfigProperty` | `EvolutionRestClientIT` chama o Rest Client diretamente com a chave | Duplicada de `seedgrid.whatsapp.evolution.api-key` | Runtime (teste) | `src/test/.../clients/EvolutionRestClientIT.java` |
89
+ | `evolution.instance.name` | `String` | nome de instância | — | Sim (nos ITs) | Injetada por `@ConfigProperty` | Instância alvo dos ITs | — | Runtime (teste) | `EvolutionRestClientIT`, `src/test/.../services/EvolutionWhatsAppApiIT.java` |
90
+ | `evolution.live` (system property) | `boolean` | `true` | — | Condicional | `@EnabledIfSystemProperty(named = "evolution.live", matches = "true")` habilita `EvolutionRestClientIT` | Liga testes contra servidor real | — | Execução de teste | `EvolutionRestClientIT` |
91
+ | `quarkus.rest-client.evolution.scope` | `String` | escopo CDI | — | Não | Define `jakarta.inject.Singleton` para o client nos testes | — | — | Runtime (teste) | `src/test/resources/application.properties` |
92
+ | `quarkus.log.level` | `String` | nível de log | — | Não | `INFO` nos testes | — | — | Runtime (teste) | idem |
93
+ | `quarkus.log.category."br.com.seedgrid.whatsapp".level` | `String` | nível de log | — | Não | `DEBUG` nos testes | — | — | Runtime (teste) | idem |
94
+
95
+ O mesmo arquivo de teste também define `seedgrid.whatsapp.api=evolution`, `seedgrid.whatsapp.rest-client.evolution.url` e `seedgrid.whatsapp.evolution.api-key` (propriedades públicas da seção 2). `EvolutionWhatsAppApiIT` lê `quarkus.rest-client.evolution.url` via `@ConfigProperty` e **não** tem guarda `@EnabledIf…`; como o surefire usa os includes padrão (`*Test`, `Test*`, `*Tests`, `*TestCase`), classes `*IT` não rodam em `mvn test` sem `-Dtest=...` (**Inferência** — o pom não customiza includes).
96
+
97
+ ## 5. Aliases, obsoletas, renomeações
98
+
99
+ - Nenhum alias declarado (sem `@WithName` alternativo nem fallback de chave).
100
+
101
+ ## 6. Configuração mínima
102
+
103
+ Evolution:
104
+ ```properties
105
+ seedgrid.whatsapp.api=evolution
106
+ seedgrid.whatsapp.rest-client.evolution.url=<URL-DA-EVOLUTION-API>
107
+ seedgrid.whatsapp.evolution.api-key=<SEGREDO:evolution-api-key>
108
+ ```
109
+
110
+ WhatsApp Cloud (Meta):
111
+ ```properties
112
+ seedgrid.whatsapp.api=whatsapp-cloud
113
+ seedgrid.whatsapp.cloud.access-token=<SEGREDO:whatsapp-cloud-access-token>
114
+ # seedgrid.whatsapp.rest-client.cloud.url já tem padrão https://graph.facebook.com/v21.0
115
+ ```
116
+
117
+ ## 7. Configuração completa comentada
118
+
119
+ ```properties
120
+ # Provider usado por WhatsAppApi: default | evolution | whatsapp-cloud
121
+ # default (padrão) = DefaultWhatsAppApi, que só loga WARNING e não envia nada.
122
+ seedgrid.whatsapp.api=evolution
123
+
124
+ # --- Evolution API (necessário o jar seedgrid-whatsapp-evolution) ---
125
+ # URL base; repassada para quarkus.rest-client.evolution.url pela própria lib. Sem padrão.
126
+ seedgrid.whatsapp.rest-client.evolution.url=<URL-DA-EVOLUTION-API>
127
+ # Enviada no header "apikey". Sem padrão; ausente => IllegalStateException na chamada.
128
+ seedgrid.whatsapp.evolution.api-key=<SEGREDO:evolution-api-key>
129
+
130
+ # --- WhatsApp Cloud API (necessário o jar seedgrid-whatsapp-whatsapp-cloud) ---
131
+ # URL base da Graph API. Padrão: https://graph.facebook.com/v21.0
132
+ seedgrid.whatsapp.rest-client.cloud.url=https://graph.facebook.com/v21.0
133
+ # Enviado como "Authorization: Bearer ...". Sem padrão; ausente => IllegalStateException na chamada.
134
+ seedgrid.whatsapp.cloud.access-token=<SEGREDO:whatsapp-cloud-access-token>
135
+
136
+ # --- Opcional: ajustes do Quarkus Rest Client (chaves do framework) ---
137
+ # quarkus.rest-client.evolution.scope=jakarta.inject.Singleton
138
+ ```
139
+
140
+ ## 8. Receitas
141
+
142
+ - **Desligar envio (dev/local):** não defina `seedgrid.whatsapp.api` (ou use `default`). Toda chamada de `WhatsAppApi` loga `DefaultWhatsAppApi invoked: ... Configure seedgrid.whatsapp.api to enable a provider.` e retorna `WhatsAppSendMessageResultDTO.empty()`.
143
+ - **Evolution self-hosted:** dependências `seedgrid-whatsapp-core` + `seedgrid-whatsapp-evolution`; configuração mínima Evolution acima. Use `channelId` = nome da instância Evolution. Gestão de instância/grupos/labels/chat via interfaces específicas (ver [[SeedGrid/Extensions/whatsapp/Exemplos|Exemplos]]).
144
+ - **Meta Cloud API:** dependências `seedgrid-whatsapp-core` + `seedgrid-whatsapp-whatsapp-cloud`; `channelId` = `PHONE_NUMBER_ID` (README). Para fixar outra versão da Graph API, altere `seedgrid.whatsapp.rest-client.cloud.url` (ex.: `https://graph.facebook.com/v<versão>`).
145
+ - **Segredos por ambiente:** exporte `SEEDGRID_WHATSAPP_EVOLUTION_API_KEY` / `SEEDGRID_WHATSAPP_CLOUD_ACCESS_TOKEN` em vez de gravar no `application.properties`.
146
+
147
+ ## 9. Dúvidas e lacunas
148
+
149
+ - As URLs `seedgrid.whatsapp.rest-client.*` chegam ao Rest Client exclusivamente pela ponte no `application.properties` dos jars de provider (o Quarkus carrega `application.properties` de todo o classpath; o próprio `EvolutionRestClientIT` configura só a chave `seedgrid.whatsapp.*`). Para sobrescrever, o host pode definir a chave `seedgrid.whatsapp.rest-client.*` ou diretamente `quarkus.rest-client.<configKey>.url`.
150
+ - Valores com maiúsculas/espaços em `seedgrid.whatsapp.api` são normalizados pelo producer mas não pelo `@LookupIfProperty` (Inferência) → fallback silencioso para `DefaultWhatsAppApi`.
151
+ - Não há validação no boot: credenciais ausentes só falham na primeira chamada (`IllegalStateException`).
152
+ - Mapeamento para o crate Rust: ver [[SeedGrid/Extensions/whatsapp/Configuracao-Rust|Configuração do porte Rust]].
@@ -0,0 +1,198 @@
1
+ ---
2
+ tags: [seedgrid, extension, whatsapp, enum]
3
+ fonte: java/seedgrid-quarkus-ext-whatsapp
4
+ branch: main
5
+ commit: d8454f6313
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # Enums — seedgrid-whatsapp (Quarkus)
10
+
11
+ Voltar: [[SeedGrid/Extensions/whatsapp/Visao-geral|Visão geral do whatsapp]] · [[SeedGrid/Extensions/whatsapp/Configuracao|Configuração]] · [[SeedGrid/Extensions/whatsapp/Rust|Porte Rust]]
12
+
13
+ Todos os enums ficam em `seedgrid-whatsapp-core/src/main/java/br/com/seedgrid/whatsapp/enums/` (pacote `br.com.seedgrid.whatsapp.enums`). São 12, todos públicos. Nenhum é persistido (a extension não tem entidades nem migrations) e só `WhatsAppProvider` é lido de config.
14
+
15
+ ## Índice
16
+
17
+ | Enum | Arquivo | Usado em | Público? |
18
+ |---|---|---|---|
19
+ | [[#WhatsAppProvider]] | `WhatsAppProvider.java` | propriedade `seedgrid.whatsapp.api` | Sim |
20
+ | [[#WhatsAppMediaType]] | `WhatsAppMediaType.java` | `WhatsAppMediaMessageFileDTO`, `WhatsAppMediaMessageURLDTO` | Sim |
21
+ | [[#WhatsAppPresence]] | `WhatsAppPresence.java` | `WhatsAppInstanceManagementApi#setPresence`, `WhatsAppChatApi#sendPresence` | Sim |
22
+ | [[#WhatsAppBlockAction]] | `WhatsAppBlockAction.java` | `WhatsAppChatApi#updateBlockStatus` | Sim |
23
+ | [[#WhatsAppLabelAction]] | `WhatsAppLabelAction.java` | `WhatsAppLabelApi#handleLabel` | Sim |
24
+ | [[#WhatsAppGroupParticipantAction]] | `WhatsAppGroupParticipantAction.java` | `WhatsAppGroupApi#updateParticipants` | Sim |
25
+ | [[#WhatsAppGroupSetting]] | `WhatsAppGroupSetting.java` | `WhatsAppGroupApi#updateGroupSetting` | Sim |
26
+ | [[#WhatsAppEphemeralExpiration]] | `WhatsAppEphemeralExpiration.java` | `WhatsAppGroupApi#toggleEphemeral` | Sim |
27
+ | [[#WhatsAppPrivacyValue]] | `WhatsAppPrivacyValue.java` | `WhatsAppPrivacySettings.profile/status/last` | Sim |
28
+ | [[#WhatsAppReadReceiptsValue]] | `WhatsAppReadReceiptsValue.java` | `WhatsAppPrivacySettings.readreceipts` | Sim |
29
+ | [[#WhatsAppOnlinePrivacyValue]] | `WhatsAppOnlinePrivacyValue.java` | `WhatsAppPrivacySettings.online` | Sim |
30
+ | [[#WhatsAppGroupAddPrivacyValue]] | `WhatsAppGroupAddPrivacyValue.java` | `WhatsAppPrivacySettings.groupadd` | Sim |
31
+
32
+ Padrão comum: cada constante guarda um texto (`value`/`configValue`) e há um `fromValue`/`fromConfig` com busca linear **case-sensitive** que lança `WhatsAppException("Unexpected value '<v>'")` quando não acha (exceto `WhatsAppProvider`, que cai em `DEFAULT`). Os enums de ação **não** têm `@JsonValue`: quem os serializa é a `EvolutionWhatsAppApi`, que põe `getValue()` no `Map` do payload.
33
+
34
+ ## WhatsAppProvider
35
+
36
+ `seedgrid-whatsapp-core/.../enums/WhatsAppProvider.java` · `br.com.seedgrid.whatsapp.enums.WhatsAppProvider`
37
+
38
+ | Valor | Significado | Efeito / onde é tratado | Observações |
39
+ |---|---|---|---|
40
+ | `DEFAULT` (`default`) | Provider no-op | `WhatsAppApiProducer#produce()` devolve `DefaultWhatsAppApi` | Também é o resultado para config vazia/desconhecida (**Confirmado**) |
41
+ | `EVOLUTION` (`evolution`) | Evolution API | `produce()` devolve o bean `@EvolutionProvider` se `Instance.isResolvable()`, senão `DefaultWhatsAppApi` | **Confirmado** |
42
+ | `OFFICIAL` (`whatsapp-cloud`) | WhatsApp Cloud (Meta) | `produce()` devolve o bean `@OfficialProvider` se resolvível, senão `DefaultWhatsAppApi` | O texto de config é `whatsapp-cloud`, **não** `official` (**Confirmado**) |
43
+
44
+ - Campo `configValue` (`getConfigValue()`); `static fromConfig(String)`: `null`/em branco → `DEFAULT`; senão `trim().toLowerCase()` e compara; sem match → `DEFAULT` (nunca lança).
45
+ - Config: lido de `seedgrid.whatsapp.api` (tipo `String` em `WhatsAppConfig`, convertido manualmente por `fromConfig`, logo tolerante a caixa e espaços). Sem JSON, sem persistência.
46
+ - `@LookupIfProperty` dos beans compara o texto exato; `Evolution` passa no `fromConfig` mas pode não casar o lookup e cair em Default (**Inferência**, ver [[SeedGrid/Extensions/whatsapp/Configuracao|Configuração]]).
47
+ - Usado em: [[SeedGrid/Extensions/whatsapp/Configuracao|seedgrid.whatsapp.api]].
48
+
49
+ ## WhatsAppMediaType
50
+
51
+ `.../enums/WhatsAppMediaType.java` · `br.com.seedgrid.whatsapp.enums.WhatsAppMediaType`
52
+
53
+ | Valor | Significado | Efeito / onde é tratado | Observações |
54
+ |---|---|---|---|
55
+ | `NONE` (`none`) | Sem mídia | Nenhum código o trata de forma especial; `getValue()` = `"none"` segue para o payload | Existe no enum, mas nenhum código trata esse valor. Enviado como `mediatype: "none"` (Evolution) / `type: "none"` (Cloud); provavelmente recusado pelo provider (**Inferência**) |
56
+ | `IMAGE` (`image`) | Imagem | `getValue()` vai em `EvolutionPayloads.media(...)` (`mediatype`) e em `OfficialCloudWhatsAppApi` (`type`) | **Confirmado** |
57
+ | `VIDEO` (`video`) | Vídeo | idem | **Confirmado** |
58
+ | `AUDIO` (`audio`) | Áudio | idem | **Confirmado** |
59
+ | `DOCUMENT` (`document`) | Documento | idem | **Confirmado** |
60
+
61
+ - Campo `value` (não-final), `getValue()`, `static fromValue(String)`.
62
+ - Serialização: **sem** `@JsonValue`/`@JsonCreator`. Se a aplicação serializar os DTOs (records) com Jackson, o JSON usa o nome da constante (`IMAGE`), não `image` (**Inferência**). A extension só usa `getValue()` ao montar payloads. `mediaType` nulo causa `NullPointerException` em `sendMediaFile`/`sendMediaUrl` (sem validação, **Confirmado**).
63
+ - Usado em: `WhatsAppMediaMessageFileDTO#mediaType`, `WhatsAppMediaMessageURLDTO#mediaType`; `EvolutionWhatsAppApi#sendMediaFile/sendMediaUrl`; `OfficialCloudWhatsAppApi`.
64
+
65
+ ## WhatsAppPresence
66
+
67
+ `.../enums/WhatsAppPresence.java`
68
+
69
+ | Valor | Significado | Efeito / onde é tratado | Observações |
70
+ |---|---|---|---|
71
+ | `UNAVAILABLE` (`unavailable`) | Offline | Enviado como `presence` | Valores fechados pelo `presenceOnlySchema` da Evolution (Javadoc) |
72
+ | `AVAILABLE` (`available`) | Online | idem | |
73
+ | `COMPOSING` (`composing`) | "Digitando…" | idem | Mais útil em `sendPresence` (chat) |
74
+ | `RECORDING` (`recording`) | "Gravando áudio…" | idem | idem |
75
+ | `PAUSED` (`paused`) | Parou de digitar/gravar | idem | idem |
76
+
77
+ - `getValue()`, `fromValue(String)` (lança se desconhecido). Sem anotações Jackson.
78
+ - Tratado em `EvolutionWhatsAppApi#setPresence` (`Map.of("presence", ...)`) e `#sendPresence` (`presence` + `delay` opcional). `null` → `WhatsAppException("presence is required")`. Não há `switch`: todos os valores seguem o mesmo caminho (**Confirmado**). O módulo cloud não referencia presença (**Inferência**: provider Cloud não a implementa).
79
+
80
+ ## WhatsAppBlockAction
81
+
82
+ `.../enums/WhatsAppBlockAction.java`
83
+
84
+ | Valor | Significado | Efeito | Observações |
85
+ |---|---|---|---|
86
+ | `BLOCK` (`block`) | Bloquear contato | `payload.status = "block"` em `updateBlockStatus` | **Confirmado** |
87
+ | `UNBLOCK` (`unblock`) | Desbloquear | `payload.status = "unblock"` | **Confirmado** |
88
+
89
+ - `getValue()`, `fromValue`. `null` → `"status is required"`. O campo do payload chama-se `status`, não `action`.
90
+
91
+ ## WhatsAppLabelAction
92
+
93
+ `.../enums/WhatsAppLabelAction.java`
94
+
95
+ | Valor | Significado | Efeito | Observações |
96
+ |---|---|---|---|
97
+ | `ADD` (`add`) | Aplica etiqueta ao contato | `payload.action = "add"` em `handleLabel` | **Confirmado** |
98
+ | `REMOVE` (`remove`) | Remove etiqueta | `payload.action = "remove"` | **Confirmado** |
99
+
100
+ - `getValue()`, `fromValue`. `null` → `"action is required"`.
101
+
102
+ ## WhatsAppGroupParticipantAction
103
+
104
+ `.../enums/WhatsAppGroupParticipantAction.java`
105
+
106
+ | Valor | Significado | Efeito | Observações |
107
+ |---|---|---|---|
108
+ | `ADD` (`add`) | Adiciona participantes | `payload.action` em `updateParticipants` | **Confirmado** |
109
+ | `REMOVE` (`remove`) | Remove participantes | idem | |
110
+ | `PROMOTE` (`promote`) | Promove a admin | idem | |
111
+ | `DEMOTE` (`demote`) | Rebaixa de admin | idem | |
112
+
113
+ - `getValue()`, `fromValue`. `null` → `"action is required"`; lista de participantes vazia → `"participants is required"`.
114
+
115
+ ## WhatsAppGroupSetting
116
+
117
+ `.../enums/WhatsAppGroupSetting.java`
118
+
119
+ | Valor | Significado | Efeito | Observações |
120
+ |---|---|---|---|
121
+ | `ANNOUNCEMENT` (`announcement`) | Só administradores enviam mensagens | `payload.action` em `updateGroupSetting` | Javadoc |
122
+ | `NOT_ANNOUNCEMENT` (`not_announcement`) | Todos enviam | idem | Javadoc |
123
+ | `LOCKED` (`locked`) | Só administradores editam dados do grupo | idem | Javadoc |
124
+ | `UNLOCKED` (`unlocked`) | Todos editam | idem | Javadoc |
125
+
126
+ - `getValue()`, `fromValue`. `null` → mensagem `"action is required"`.
127
+
128
+ ## WhatsAppEphemeralExpiration
129
+
130
+ `.../enums/WhatsAppEphemeralExpiration.java`
131
+
132
+ | Valor | Significado | Efeito | Observações |
133
+ |---|---|---|---|
134
+ | `OFF` (0) | Desliga mensagens temporárias | `payload.expiration = 0` | |
135
+ | `ONE_DAY` (86 400) | 24 h | `payload.expiration = 86400` | |
136
+ | `SEVEN_DAYS` (604 800) | 7 dias | idem | |
137
+ | `NINETY_DAYS` (7 776 000) | 90 dias | idem | |
138
+
139
+ - Campo `seconds` (`int`), `getSeconds()`, `static fromSeconds(int)` (lança se não for um dos 4). Único enum com valor **numérico** no payload. Javadoc: a Evolution só aceita estes 4 valores.
140
+ - Tratado em `EvolutionWhatsAppApi#toggleEphemeral`; `null` → `"expiration is required"`.
141
+
142
+ ## WhatsAppPrivacyValue
143
+
144
+ `.../enums/WhatsAppPrivacyValue.java` · espelha `WAPrivacyValue` do Baileys.
145
+
146
+ | Valor | Significado | Efeito | Observações |
147
+ |---|---|---|---|
148
+ | `ALL` (`all`) | Todos | Serializado/lido no JSON de `WhatsAppPrivacySettings` | Javadoc |
149
+ | `CONTACTS` (`contacts`) | Apenas contatos | idem | |
150
+ | `CONTACT_BLACKLIST` (`contact_blacklist`) | Contatos, exceto os selecionados | idem | |
151
+ | `NONE` (`none`) | Ninguém | idem | |
152
+
153
+ - Serialização: `@JsonValue getValue()` e `@JsonCreator fromValue(String)`; o JSON usa o texto (`"contacts"`). Valor desconhecido vindo da Evolution lança `WhatsAppException` na desserialização (`@JsonIgnoreProperties(ignoreUnknown)` cobre propriedades, não valores; **Inferência**).
154
+ - Usado em: `WhatsAppPrivacySettings.profile`, `.status`, `.last`; `fetchPrivacySettings`/`updatePrivacySettings`.
155
+
156
+ ## WhatsAppReadReceiptsValue
157
+
158
+ | Valor | Significado | Observações |
159
+ |---|---|---|
160
+ | `ALL` (`all`) | Confirmação de leitura ligada | |
161
+ | `NONE` (`none`) | Desligada | `contacts` **não** é aceito aqui |
162
+
163
+ - `@JsonValue`/`@JsonCreator`. Usado em `WhatsAppPrivacySettings.readreceipts`.
164
+
165
+ ## WhatsAppOnlinePrivacyValue
166
+
167
+ | Valor | Significado | Observações |
168
+ |---|---|---|
169
+ | `ALL` (`all`) | Todos veem o "online" | |
170
+ | `MATCH_LAST_SEEN` (`match_last_seen`) | Segue a regra do "visto por último" | |
171
+
172
+ - `@JsonValue`/`@JsonCreator`. Usado em `WhatsAppPrivacySettings.online`.
173
+
174
+ ## WhatsAppGroupAddPrivacyValue
175
+
176
+ | Valor | Significado | Observações |
177
+ |---|---|---|
178
+ | `ALL` (`all`) | Qualquer um adiciona | |
179
+ | `CONTACTS` (`contacts`) | Só contatos | |
180
+ | `CONTACT_BLACKLIST` (`contact_blacklist`) | Contatos, exceto selecionados | Não existe `none` aqui |
181
+
182
+ - `@JsonValue`/`@JsonCreator`. Usado em `WhatsAppPrivacySettings.groupadd`.
183
+
184
+ ## Persistência
185
+
186
+ Nenhum enum é persistido: a extension não tem entidades JPA, `@Enumerated`, converters nem migrations (ver [[SeedGrid/Extensions/whatsapp/Visao-geral|Visão geral]]). Não há CHECK constraints a comparar.
187
+
188
+ ## Notas Rust
189
+
190
+ Os 12 enums existem no crate Rust (`src/enums.rs`/`src/dtos.rs`) com as mesmas constantes e textos de wire.
191
+ - Nomes em PascalCase (`Official`, `ContactBlacklist`...), mesmos textos.
192
+ - `from_seconds`/`seconds()` usam `i64`.
193
+ - `WhatsAppMediaType`, `WhatsAppPresence` e `WhatsAppEphemeralExpiration` são serializados por serde manual (texto/número do wire).
194
+ - `WhatsAppMediaType` (`None`), os 4 de privacidade (`All`) e `EphemeralExpiration` (`Off`) têm `Default`; `WhatsAppPrivacySettings` usa campos não opcionais com `#[serde(default)]`.
195
+
196
+ ## Internos
197
+
198
+ Nenhum enum interno ou privado em `src/main`.
@@ -0,0 +1,173 @@
1
+ ---
2
+ tags: [seedgrid, extension, whatsapp, exemplos]
3
+ fonte: java/seedgrid-quarkus-ext-whatsapp
4
+ branch: main
5
+ commit: d8454f6313
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # Exemplos — seedgrid-whatsapp (Quarkus)
10
+
11
+ Links: [[SeedGrid/Extensions/whatsapp/Visao-geral|Visão geral do whatsapp]] · [[SeedGrid/Extensions/whatsapp/Configuracao|Configuração do whatsapp]]
12
+
13
+ Assinaturas conferidas no código (`seedgrid-whatsapp-core/src/main/java/br/com/seedgrid/whatsapp/...`). Os métodos de envio retornam `WhatsAppSendMessageResultDTO`.
14
+
15
+ ## 1. Dependências (Maven)
16
+
17
+ ```xml
18
+ <dependency>
19
+ <groupId>br.com.seedgrid</groupId>
20
+ <artifactId>seedgrid-whatsapp-core</artifactId>
21
+ <version>2026.08.16</version>
22
+ </dependency>
23
+ <!-- um (ou os dois) providers -->
24
+ <dependency>
25
+ <groupId>br.com.seedgrid</groupId>
26
+ <artifactId>seedgrid-whatsapp-evolution</artifactId>
27
+ <version>2026.08.16</version>
28
+ </dependency>
29
+ <dependency>
30
+ <groupId>br.com.seedgrid</groupId>
31
+ <artifactId>seedgrid-whatsapp-whatsapp-cloud</artifactId>
32
+ <version>2026.08.16</version>
33
+ </dependency>
34
+ ```
35
+
36
+ Configuração: ver [[SeedGrid/Extensions/whatsapp/Configuracao|Configuração do whatsapp]] (seções 6 e 7).
37
+
38
+ ## 2. Enviar texto pela interface comum (fonte: README + `WhatsAppApi`)
39
+
40
+ ```java
41
+ import br.com.seedgrid.whatsapp.dtos.WhatsAppSendMessageResultDTO;
42
+ import br.com.seedgrid.whatsapp.dtos.WhatsAppTextMessageDTO;
43
+ import br.com.seedgrid.whatsapp.services.WhatsAppApi;
44
+ import jakarta.enterprise.context.ApplicationScoped;
45
+
46
+ @ApplicationScoped
47
+ public class NotificadorWhatsApp {
48
+
49
+ private final WhatsAppApi api; // produzido por WhatsAppApiProducer conforme seedgrid.whatsapp.api
50
+
51
+ public NotificadorWhatsApp(WhatsAppApi api) {
52
+ this.api = api;
53
+ }
54
+
55
+ public String avisar(String canal, String telefone, String texto) {
56
+ // canal: nome da instância (Evolution) ou PHONE_NUMBER_ID (Cloud)
57
+ WhatsAppSendMessageResultDTO r =
58
+ api.sendTextMessage(canal, new WhatsAppTextMessageDTO(telefone, texto));
59
+ return r.messageId();
60
+ }
61
+ }
62
+ ```
63
+
64
+ `telefone` aceita formatos BR com 11 dígitos após remover não-dígitos (ex.: `"(11) 99999-9999"`) ou 13 começando com `55`.
65
+
66
+ ## 3. Opções de mensagem (resposta, preview, atraso)
67
+
68
+ ```java
69
+ import br.com.seedgrid.whatsapp.dtos.WhatsAppMessageOptionsDTO;
70
+ import br.com.seedgrid.whatsapp.dtos.WhatsAppTextMessageDTO;
71
+
72
+ // responder citando uma mensagem
73
+ api.sendTextMessage(canal, new WhatsAppTextMessageDTO(
74
+ "11999999999", "Recebido!", WhatsAppMessageOptionsDTO.quoting("<id-da-mensagem>")));
75
+
76
+ // desligar preview de link (na Cloud o padrão de preview_url é true)
77
+ api.sendTextMessage(canal, new WhatsAppTextMessageDTO(
78
+ "11999999999", "Veja https://exemplo.com", WhatsAppMessageOptionsDTO.linkPreview(false)));
79
+ ```
80
+
81
+ ## 4. Mídia, áudio, localização, template
82
+
83
+ ```java
84
+ import br.com.seedgrid.whatsapp.dtos.*;
85
+ import br.com.seedgrid.whatsapp.enums.WhatsAppMediaType;
86
+ import java.util.List;
87
+
88
+ api.sendMediaUrl(canal, new WhatsAppMediaMessageURLDTO(
89
+ "11999999999", WhatsAppMediaType.DOCUMENT,
90
+ "https://exemplo.com/contrato.pdf", "contrato.pdf", "Segue o contrato"));
91
+
92
+ api.sendMediaFile(canal, new WhatsAppMediaMessageFileDTO(
93
+ "11999999999", WhatsAppMediaType.IMAGE,
94
+ "<conteudo-base64>", "foto.jpg", "foto.jpg", "Legenda"));
95
+
96
+ api.sendAudioUrl(canal, new WhatsAppAudioMessageURLDTO("11999999999", "https://exemplo.com/audio.mp3"));
97
+ api.sendAudioFile(canal, new WhatsAppAudioMessageFileDTO("11999999999", "/caminho/local/audio.ogg")); // lido do disco
98
+
99
+ api.sendLocation(canal, new WhatsAppLocationMessageDTO(
100
+ "11999999999", -23.5505, -46.6333, "Escritório", "Av. Exemplo, 100"));
101
+
102
+ api.sendTemplate(canal, new WhatsAppTemplateMessageDTO(
103
+ "11999999999", "<nome-do-template>", "pt_BR", List.of()));
104
+ ```
105
+
106
+ ## 5. Reação (alvo é a mensagem, não um número)
107
+
108
+ ```java
109
+ api.sendReaction(canal, new WhatsAppReactionMessageDTO(
110
+ "<id-da-mensagem>", "5511999999999@s.whatsapp.net", false, "👍"));
111
+ ```
112
+
113
+ ## 6. Recursos exclusivos da Evolution
114
+
115
+ Inferência (CDI): o bean `EvolutionWhatsAppApi` tem qualificador `@EvolutionProvider`, então as interfaces específicas são injetadas com esse qualificador.
116
+
117
+ ```java
118
+ import br.com.seedgrid.whatsapp.qualifiers.EvolutionProvider;
119
+ import br.com.seedgrid.whatsapp.services.*;
120
+ import br.com.seedgrid.whatsapp.dtos.WhatsAppPollMessageDTO;
121
+ import br.com.seedgrid.whatsapp.enums.WhatsAppPresence;
122
+ import jakarta.inject.Inject;
123
+ import java.util.List;
124
+
125
+ @Inject @EvolutionProvider WhatsAppInstanceManagementApi instancias;
126
+ @Inject @EvolutionProvider WhatsAppEvolutionMessagingApi mensagensEvolution;
127
+ @Inject @EvolutionProvider WhatsAppChatApi chat;
128
+ @Inject @EvolutionProvider WhatsAppGroupApi grupos;
129
+
130
+ void exemplo() {
131
+ String instanceId = instancias.createInstance("cliente-abc");
132
+ String qrBase64 = instancias.connectInstance("cliente-abc"); // PNG em base64 sem prefixo data:
133
+ String estado = instancias.getConnectionState("cliente-abc");
134
+
135
+ // webhook (fonte: README)
136
+ WebhookConfig cfg = new WebhookConfig();
137
+ cfg.enabled = true;
138
+ cfg.url = "https://meu-servidor.example/webhook";
139
+ cfg.byEvents = true;
140
+ cfg.base64 = false;
141
+ cfg.events = List.of("MESSAGES_UPSERT", "MESSAGES_UPDATE", "CONNECTION_UPDATE");
142
+ instancias.setWebHook("cliente-abc", cfg);
143
+
144
+ mensagensEvolution.sendPoll("cliente-abc", new WhatsAppPollMessageDTO(
145
+ "11999999999", "Melhor horário?", 1, List.of("Manhã", "Tarde")));
146
+
147
+ List<WhatsAppNumberCheck> existentes = chat.whatsappNumbers("cliente-abc", List.of("11999999999"));
148
+ chat.sendPresence("cliente-abc", "11999999999", WhatsAppPresence.COMPOSING, 1500);
149
+ Object contatos = chat.findContacts("cliente-abc", WhatsAppQuery.all());
150
+
151
+ WhatsAppGroup g = grupos.createGroup("cliente-abc", "Equipe", List.of("11999999999"), "Grupo da equipe", false);
152
+ }
153
+ ```
154
+
155
+ ## 7. Tratamento de erros
156
+
157
+ ```java
158
+ import br.com.seedgrid.whatsapp.exceptions.WhatsAppException;
159
+
160
+ try {
161
+ api.sendTextMessage(canal, new WhatsAppTextMessageDTO("123", "Teste"));
162
+ } catch (WhatsAppException e) {
163
+ // número inválido, channelId vazio, falha lendo arquivo...
164
+ // em endpoints REST, o seedgrid-commons converte para HTTP 422 (WhatsAppExceptionExtension)
165
+ } catch (IllegalStateException e) {
166
+ // credencial do provider ausente (api-key / access-token)
167
+ }
168
+ ```
169
+
170
+ ## 8. Testes como referência
171
+
172
+ - `seedgrid-whatsapp-evolution/src/test/java/br/com/seedgrid/whatsapp/services/EvolutionWhatsAppApiTest.java` — payloads esperados para cada operação (Mockito sobre `EvolutionRestClient`).
173
+ - `seedgrid-whatsapp-whatsapp-cloud/src/test/java/br/com/seedgrid/whatsapp/services/OfficialCloudWhatsAppApiTest.java` — payloads da Graph API e upload multipart.
@@ -0,0 +1,83 @@
1
+ ---
2
+ tags: [seedgrid, extension, whatsapp, rust]
3
+ fonte: rust/seedgrid-rust-crate-whatsapp
4
+ branch: main
5
+ commit: be738a2d1e
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # whatsapp — porte Rust (`seedgrid-rust-crate-whatsapp`)
10
+
11
+ Porte da extensão Quarkus `seedgrid-quarkus-ext-whatsapp`. Lado Java: [[SeedGrid/Extensions/whatsapp/Visao-geral|Visão geral do whatsapp (Java)]] · [[SeedGrid/Extensions/whatsapp/Configuracao|Configuração do whatsapp (Java)]]. Configuração Rust: [[SeedGrid/Extensions/whatsapp/Configuracao-Rust|Configuração Rust do whatsapp]].
12
+
13
+ Biblioteca **só de saída** (sem webhooks de entrada) para enviar mensagens WhatsApp por vários provedores, escolhidos por configuração. **Confirmado** (`src/lib.rs`).
14
+
15
+ | Provider (`seedgrid.whatsapp.api`) | Implementação | Capacidades |
16
+ |---|---|---|
17
+ | `default` (ou vazio/desconhecido) | `DefaultWhatsAppApi` | no-op: só loga WARNING; `is_configured()` sempre `false` |
18
+ | `evolution` | `EvolutionWhatsAppApi` | Evolution API (Baileys): envio + mensagens Evolution + grupos, chat, labels, gestão de instâncias |
19
+ | `whatsapp-cloud` | `OfficialCloudWhatsAppApi` | WhatsApp Cloud oficial (Meta Graph API): só envio |
20
+
21
+ ## Identificação
22
+ | Item | Valor |
23
+ |---|---|
24
+ | Pacote Cargo | `seedgrid-rust-crate-whatsapp` (lib `seedgrid_whatsapp`) |
25
+ | Versão | workspace `2026.10.14` |
26
+ | Features | nenhuma (todos os providers sempre compilados) |
27
+ | Dependências SeedGrid | nenhuma |
28
+ | Consumidor | security (2FA por WhatsApp: `rust/seedgrid-rust-crate-security/src/state.rs` chama `WhatsAppConfig::from_env()`) |
29
+
30
+ ## API pública
31
+ | Símbolo | Papel | Fonte |
32
+ |---|---|---|
33
+ | `WhatsAppConfig` (`from_env`, `Default`), `DEFAULT_CLOUD_URL` | config | `src/config.rs` |
34
+ | `create_whatsapp_api(&WhatsAppConfig) -> Arc<dyn WhatsAppApi>` | fábrica por provider (`WhatsAppProvider::from_config`: `trim` + minúsculas) | `src/factory.rs`, `src/enums.rs` |
35
+ | trait `WhatsAppApi` | `send_text_message`, `send_media_file/url`, `send_audio_file/url`, `send_location`, `send_contact`, `send_reaction`, `send_sticker`, `send_template`…, `provider()`, `is_configured()` | `src/api.rs` |
36
+ | traits `WhatsAppEvolutionMessaging` (`send_ptv`, `send_poll`, `send_list`, `send_buttons`, `send_status`, `offer_call`), `WhatsAppLabels`, `WhatsAppGroups`, `WhatsAppChat`, `WhatsAppInstanceManagement` (`create_instance`, `delete_instance`, `get_instances`, `connect_instance`, `get_connection_state`, `restart_instance`, `set_webhook`, `get_webhook`) | capacidades Evolution | `src/api.rs` |
37
+ | DTOs (`WhatsAppTextMessage`, `WhatsAppMedia*`, `WhatsAppSendMessageResult`, `WhatsAppInstance`, `WebhookConfig`…) e enums | modelo | `src/dtos.rs`, `src/enums.rs` |
38
+ | `WhatsAppError` (`IllegalState` quando falta credencial), `Result` | erros | `src/error.rs` |
39
+
40
+ As credenciais não são validadas na construção: a falta de `api-key`/`access-token` vira `WhatsAppError::IllegalState` na primeira chamada que precisa dela (`require_api_key` em `src/evolution.rs`; header Bearer em `src/cloud.rs`), como no Java.
41
+
42
+ ## Exemplo (doc de `src/lib.rs`)
43
+ ```rust
44
+ use seedgrid_whatsapp::{WhatsAppConfig, create_whatsapp_api, WhatsAppTextMessage};
45
+
46
+ let config = WhatsAppConfig::from_env();
47
+ let api = create_whatsapp_api(&config);
48
+ let res = api
49
+ .send_text_message("meu-channel-id", WhatsAppTextMessage::new("11999999999", "Seu codigo: 1234"))
50
+ .await?;
51
+ println!("message_id = {}", res.message_id);
52
+ ```
53
+ Não há app em `rust/examples/` para whatsapp.
54
+
55
+ ## Testes
56
+ Unitários extensos em `src/evolution.rs`, `src/cloud.rs`, `src/factory.rs`; `tests/http_integration_test.rs` (servidor falso `wiremock`, valida path/header/corpo). **Não executados.**
57
+
58
+ ## Notas de comportamento
59
+
60
+ - `WhatsAppExceptionExtension` (HTTP 422) não existe; o host mapeia os erros.
61
+ - O trait tem `provider()` e `is_configured()` extras.
62
+ - A fábrica não tem fallback `isResolvable`.
63
+
64
+ ## Enums
65
+ Java: [[SeedGrid/Extensions/whatsapp/Enums|Enums do whatsapp (Java)]]. Todos em `src/enums.rs`; cada um tem `value()` (texto) e `from_value()` (erro `WhatsAppError::WhatsApp("Unexpected value '…'")` se desconhecido) e `Serialize`/`Deserialize` manuais pelo texto (como o `@JsonValue`/`@JsonCreator` do Java). Variantes e textos **iguais** aos do Java.
66
+
67
+ | Enum | Variantes → texto | Java equivalente |
68
+ |---|---|---|
69
+ | `WhatsAppProvider` | `Default` → `default`, `Evolution` → `evolution`, `Official` → `whatsapp-cloud` | [[SeedGrid/Extensions/whatsapp/Enums#WhatsAppProvider\|WhatsAppProvider]] |
70
+ | `WhatsAppMediaType` | `None`, `Image`, `Video`, `Audio`, `Document` → minúsculas | [[SeedGrid/Extensions/whatsapp/Enums#WhatsAppMediaType\|WhatsAppMediaType]] |
71
+ | `WhatsAppPresence` | `Unavailable`, `Available`, `Composing`, `Recording`, `Paused` → minúsculas | [[SeedGrid/Extensions/whatsapp/Enums#WhatsAppPresence\|WhatsAppPresence]] |
72
+ | `WhatsAppLabelAction` | `Add`, `Remove` | [[SeedGrid/Extensions/whatsapp/Enums#WhatsAppLabelAction\|WhatsAppLabelAction]] |
73
+ | `WhatsAppGroupParticipantAction` | `Add`, `Remove`, `Promote`, `Demote` | [[SeedGrid/Extensions/whatsapp/Enums#WhatsAppGroupParticipantAction\|WhatsAppGroupParticipantAction]] |
74
+ | `WhatsAppGroupSetting` | `Announcement`, `NotAnnouncement` → `not_announcement`, `Locked`, `Unlocked` | [[SeedGrid/Extensions/whatsapp/Enums#WhatsAppGroupSetting\|WhatsAppGroupSetting]] |
75
+ | `WhatsAppEphemeralExpiration` | `Off` 0, `OneDay` 86400, `SevenDays` 604800, `NinetyDays` 7776000 (segundos, sem texto) | [[SeedGrid/Extensions/whatsapp/Enums#WhatsAppEphemeralExpiration\|WhatsAppEphemeralExpiration]] |
76
+ | `WhatsAppBlockAction` | `Block`, `Unblock` | [[SeedGrid/Extensions/whatsapp/Enums#WhatsAppBlockAction\|WhatsAppBlockAction]] |
77
+ | `WhatsAppPrivacyValue` | `All`, `Contacts`, `ContactBlacklist` → `contact_blacklist`, `None` | [[SeedGrid/Extensions/whatsapp/Enums#WhatsAppPrivacyValue\|WhatsAppPrivacyValue]] |
78
+ | `WhatsAppReadReceiptsValue` | `All`, `None` | [[SeedGrid/Extensions/whatsapp/Enums#WhatsAppReadReceiptsValue\|WhatsAppReadReceiptsValue]] |
79
+ | `WhatsAppOnlinePrivacyValue` | `All`, `MatchLastSeen` → `match_last_seen` | [[SeedGrid/Extensions/whatsapp/Enums#WhatsAppOnlinePrivacyValue\|WhatsAppOnlinePrivacyValue]] |
80
+ | `WhatsAppGroupAddPrivacyValue` | `All`, `Contacts`, `ContactBlacklist` | [[SeedGrid/Extensions/whatsapp/Enums#WhatsAppGroupAddPrivacyValue\|WhatsAppGroupAddPrivacyValue]] |
81
+ | `WhatsAppError` | `WhatsApp`, `IllegalState` (credencial ausente), `Unsupported` | exceções do módulo |
82
+
83
+ `WhatsAppProvider::from_config` (config `seedgrid.whatsapp.api`): vazio, `default` ou valor desconhecido → `Default`; trim + minúsculas; `evolution` → `Evolution`; `whatsapp-cloud` → `Official` ([[SeedGrid/Extensions/whatsapp/Configuracao-Rust|Configuração Rust]]).