@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.
- package/LICENSE +21 -0
- package/README.md +162 -2
- package/dist/adapters/claude.js +114 -0
- package/dist/adapters/codex.js +108 -0
- package/dist/adapters/index.js +17 -0
- package/dist/adapters/shared.js +142 -0
- package/dist/adapters/types.js +1 -0
- package/dist/cli.js +209 -0
- package/dist/commands/common.js +98 -0
- package/dist/commands/doctor.js +290 -0
- package/dist/commands/init.js +9 -0
- package/dist/commands/install.js +107 -0
- package/dist/commands/remove.js +54 -0
- package/dist/commands/review.js +127 -0
- package/dist/commands/selfinstall.js +63 -0
- package/dist/commands/status.js +73 -0
- package/dist/commands/update.js +8 -0
- package/dist/commands/validate.js +27 -0
- package/dist/core/apply.js +181 -0
- package/dist/core/blocks.js +64 -0
- package/dist/core/content.js +528 -0
- package/dist/core/env.js +40 -0
- package/dist/core/frontmatter.js +29 -0
- package/dist/core/hash.js +14 -0
- package/dist/core/inspect.js +51 -0
- package/dist/core/lock.js +124 -0
- package/dist/core/paths.js +65 -0
- package/dist/core/plan.js +242 -0
- package/dist/core/tools.js +62 -0
- package/dist/core/types.js +11 -0
- package/dist/core/updates.js +121 -0
- package/docs/arquitetura.md +80 -0
- package/docs/compatibilidade.md +50 -0
- package/docs/formato.md +155 -0
- package/docs/instalacao.md +105 -0
- package/docs/manutencao.md +115 -0
- package/package.json +43 -4
- package/seedgridKB/SeedGrid/Extensions/Catalogo-de-enums.md +161 -0
- package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +971 -0
- package/seedgridKB/SeedGrid/Extensions/Indice.md +63 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +124 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Enums.md +40 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +97 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao-Rust.md +69 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao.md +88 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Enums.md +33 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Exemplos.md +121 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Rust.md +126 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Visao-geral.md +111 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Configuracao-Rust.md +93 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Configuracao.md +127 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Enums.md +66 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Exemplos.md +151 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Rust.md +120 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Configuracao-Rust.md +136 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Configuracao.md +319 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Enums.md +131 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Exemplos.md +210 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Rust.md +135 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Visao-geral.md +150 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Configuracao-Rust.md +86 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Configuracao.md +243 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Enums.md +165 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Exemplos.md +205 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Rust.md +109 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Visao-geral.md +181 -0
- package/seedgridKB/SeedGrid/Extensions/broker/Configuracao-Rust.md +40 -0
- package/seedgridKB/SeedGrid/Extensions/broker/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Configuracao-Rust.md +73 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Configuracao.md +112 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Enums.md +36 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Exemplos.md +149 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Rust.md +81 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Visao-geral.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Configuracao.md +107 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Enums.md +105 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Exemplos.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Visao-geral.md +99 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +122 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Enums.md +29 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +82 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +118 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao-Rust.md +110 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao.md +157 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Exemplos.md +157 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Rust.md +70 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Visao-geral.md +88 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao-Rust.md +124 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +195 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Enums.md +71 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Exemplos.md +149 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Rust.md +139 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +130 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Configuracao.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Enums.md +52 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Exemplos.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Visao-geral.md +113 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao-Rust.md +67 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao.md +94 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Enums.md +79 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Exemplos.md +172 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Rust.md +107 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Visao-geral.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao-Rust.md +72 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao.md +104 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Exemplos.md +104 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Rust.md +69 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Visao-geral.md +105 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao-Rust.md +68 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao.md +186 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Enums.md +96 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Exemplos.md +229 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Rust.md +80 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Visao-geral.md +112 -0
- package/seedgridKB/SeedGrid/Extensions/runtime/Configuracao-Rust.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/runtime/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/security/Configuracao-Rust.md +327 -0
- package/seedgridKB/SeedGrid/Extensions/security/Configuracao.md +510 -0
- package/seedgridKB/SeedGrid/Extensions/security/Enums.md +95 -0
- package/seedgridKB/SeedGrid/Extensions/security/Exemplos.md +218 -0
- package/seedgridKB/SeedGrid/Extensions/security/Rust.md +203 -0
- package/seedgridKB/SeedGrid/Extensions/security/Visao-geral.md +131 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao-Rust.md +188 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +345 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Enums.md +117 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Exemplos.md +205 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Rust.md +161 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +142 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao-Rust.md +75 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao.md +152 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Enums.md +198 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Exemplos.md +173 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Rust.md +83 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Visao-geral.md +99 -0
- package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +112 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/Indice.md +323 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/API.md +257 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Exemplos.md +307 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Visao-geral.md +51 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/API.md +174 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Exemplos.md +236 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Visao-geral.md +76 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/API.md +339 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/Exemplos.md +311 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/Visao-geral.md +57 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/API.md +125 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/Exemplos.md +116 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/Visao-geral.md +86 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/API.md +490 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Exemplos.md +544 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Visao-geral.md +69 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/API.md +113 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Exemplos.md +159 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Visao-geral.md +92 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/API.md +516 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Exemplos.md +629 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Visao-geral.md +80 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/API.md +615 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Exemplos.md +384 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral.md +111 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/API.md +661 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Exemplos.md +312 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Visao-geral.md +123 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/API.md +1090 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/Exemplos.md +1172 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/Visao-geral.md +98 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/Visao-geral.md +98 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-apikeys.md +118 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-audit.md +88 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-backup.md +131 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-platform.md +132 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-user.md +120 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-login-tenancy.md +119 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-security.md +427 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-self-enter.md +104 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-subdomain-tenancy.md +110 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/API.md +490 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Exemplos.md +561 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Visao-geral.md +82 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/Visao-geral.md +68 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-commons.md +61 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-core.md +140 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-playground.md +112 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-theme.md +97 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/API.md +177 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/Exemplos.md +332 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/Visao-geral.md +106 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/showcase.md +70 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/arquiteto.md +53 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +45 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +43 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +41 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +44 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +40 -0
- package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +78 -0
- package/seedgridKB/SeedGrid/Toolkit/references/glossario.md +15 -0
- package/seedgridKB/SeedGrid/Toolkit/references/modos-shared-native.md +27 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +54 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +39 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/formato-entrega.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +47 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/personalizacao-local.md +22 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/planejar-mudanca/SKILL.md +38 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/SKILL.md +33 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/references/checklist.md +25 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-backend-crud/SKILL.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-bump/SKILL.md +26 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/SKILL.md +221 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/checklist.md +31 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/patterns.md +185 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/routing.md +66 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/SKILL.md +56 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/checklist.md +32 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/steps.md +114 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-review/SKILL.md +61 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/validar-mudanca/SKILL.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/decisao-arquitetura.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/especificacao-tarefa.md +32 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/relatorio-validacao.md +30 -0
- package/seedgridKB/SeedGrid/Versoes.md +64 -0
- package/seedgridKB/SeedGrid/Visao-geral.md +35 -0
- package/seedgridKB/manifest.json +142 -0
|
@@ -0,0 +1,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]]).
|