diff --git a/src/main/java/com/seconectai/condocontab/integracao/EvolutionApiClient.java b/src/main/java/com/seconectai/condocontab/integracao/EvolutionApiClient.java index ca5ec4f..c73f1b7 100644 --- a/src/main/java/com/seconectai/condocontab/integracao/EvolutionApiClient.java +++ b/src/main/java/com/seconectai/condocontab/integracao/EvolutionApiClient.java @@ -135,6 +135,36 @@ public final class EvolutionApiClient { return resp; } + public void configurarWebhookRespostas(String baseUrl, String instanceName, String webhookUrl, String webhookSecret) throws IOException, InterruptedException { + if (baseUrl == null || baseUrl.isBlank()) { + baseUrl = defaultBaseUrl; + } + if (mockMode(baseUrl) || webhookUrl == null || webhookUrl.isBlank()) return; + Map headers = new LinkedHashMap<>(); + if (webhookSecret != null && !webhookSecret.isBlank()) headers.put("X-Webhook-Secret", webhookSecret); + Map webhook = new LinkedHashMap<>(); + webhook.put("enabled", true); + webhook.put("url", webhookUrl); + webhook.put("webhook_by_events", false); + webhook.put("webhook_base64", false); + webhook.put("byEvents", false); + webhook.put("base64", false); + webhook.put("events", java.util.List.of("MESSAGES_UPSERT")); + if (!headers.isEmpty()) webhook.put("headers", headers); + Map payload = new LinkedHashMap<>(); + payload.put("webhook", webhook); + HttpRequest req = HttpRequest.newBuilder(URI.create(clean(baseUrl) + "/webhook/set/" + instanceName)) + .timeout(Duration.ofSeconds(20)) + .header("Content-Type", "application/json") + .header("apikey", globalApiKey) + .POST(HttpRequest.BodyPublishers.ofString(Json.write(payload))) + .build(); + HttpResponse resp = httpClient.send(req, HttpResponse.BodyHandlers.ofString()); + if (resp.statusCode() < 200 || resp.statusCode() >= 300) { + throw new IOException("Evolution API retornou HTTP " + resp.statusCode() + ": " + resp.body()); + } + } + public String enviarTexto(String baseUrl, String instanceName, String token, String numero, String texto) throws IOException, InterruptedException { if (baseUrl == null || baseUrl.isBlank()) { baseUrl = defaultBaseUrl; diff --git a/src/main/java/com/seconectai/condocontab/integracao/ExternalBridgeHandler.java b/src/main/java/com/seconectai/condocontab/integracao/ExternalBridgeHandler.java index 9586cc3..8df0b9c 100644 --- a/src/main/java/com/seconectai/condocontab/integracao/ExternalBridgeHandler.java +++ b/src/main/java/com/seconectai/condocontab/integracao/ExternalBridgeHandler.java @@ -80,6 +80,7 @@ public final class ExternalBridgeHandler implements HttpHandler { List destinatarios = resolverDestinatarios(empresaId, destinatariosRaw); if (destinatarios.isEmpty()) throw new IllegalArgumentException("Nenhum destinatario encontrado."); String[] parts = String.valueOf(inst.get("instance_token_enc")).split(":", 2); + configurarWebhookEvolution(inst, parts[0]); List> resultados = new ArrayList<>(); try (Connection m = masterDs.getMasterConnection()) { for (Destinatario d : destinatarios) { @@ -198,6 +199,16 @@ public final class ExternalBridgeHandler implements HttpHandler { return URLEncoder.encode(value == null ? "" : value, StandardCharsets.UTF_8); } + private void configurarWebhookEvolution(Map inst, String instanceName) { + try { + String publicUrl = firstNonBlank(System.getenv("APP_PUBLIC_URL"), "https://condominio.seconectai.com.br"); + String url = publicUrl.replaceAll("/+$", "") + "/api/webhooks/evolution/respostas"; + evolutionApiClient.configurarWebhookRespostas(str(inst.get("instance_url")), instanceName, url, webhookSecret); + } catch (Exception e) { + System.err.println("Falha ao configurar webhook da Evolution: " + e.getMessage()); + } + } + private void validarWebhookEvolution(HttpExchange ex) { String recebido = ex.getRequestHeaders().getFirst("X-Webhook-Secret"); if (webhookSecret == null || webhookSecret.isBlank() || recebido == null || !MessageDigest.isEqual(webhookSecret.getBytes(StandardCharsets.UTF_8), recebido.getBytes(StandardCharsets.UTF_8))) {