diff --git a/src/main/java/com/seconectai/condocontab/Main.java b/src/main/java/com/seconectai/condocontab/Main.java index 2eb7911..dc81d2a 100644 --- a/src/main/java/com/seconectai/condocontab/Main.java +++ b/src/main/java/com/seconectai/condocontab/Main.java @@ -82,6 +82,7 @@ public final class Main { router.post("/api/webhooks/evolution/respostas", externalBridgeHandler); router.prefix("/api/webhooks/evolution/respostas/", externalBridgeHandler); router.post("/api/integracao/mensagens", authMiddleware.exigirApiKey(externalBridgeHandler)); + router.get("/api/integracao/respostas", authMiddleware.exigirApiKey(externalBridgeHandler)); router.prefix("/api/master/", authMiddleware.exigirMaster(masterHandlers)); router.prefix("/api/financeiro/", authMiddleware.exigirFuncionario(financeiroHandlers)); router.prefix("/api/", authMiddleware.exigirFuncionario(clienteHandlers)); diff --git a/src/main/java/com/seconectai/condocontab/integracao/ExternalBridgeHandler.java b/src/main/java/com/seconectai/condocontab/integracao/ExternalBridgeHandler.java index 6ef605b..f726ab2 100644 --- a/src/main/java/com/seconectai/condocontab/integracao/ExternalBridgeHandler.java +++ b/src/main/java/com/seconectai/condocontab/integracao/ExternalBridgeHandler.java @@ -60,6 +60,10 @@ public final class ExternalBridgeHandler implements HttpHandler { enviarMensagem(ex, (long) ex.getAttribute(AuthMiddleware.ATTR_EMPRESA_ID)); return; } + if ("/api/integracao/respostas".equals(path) && "GET".equals(method)) { + consultarResposta(ex, (long) ex.getAttribute(AuthMiddleware.ATTR_EMPRESA_ID)); + return; + } if ((path.equals("/api/webhooks/evolution/respostas") || path.startsWith("/api/webhooks/evolution/respostas/")) && "POST".equals(method)) { receberRespostaEvolution(ex); return; @@ -103,6 +107,41 @@ public final class ExternalBridgeHandler implements HttpHandler { HttpResponses.json(ex, 200, Map.of("ok", true, "resultados", resultados)); } + private void consultarResposta(HttpExchange ex, long empresaId) throws Exception { + String mid = queryParams(ex).get("mensagem_id"); + if (mid == null || mid.isBlank()) mid = queryParams(ex).get("id"); + if (mid == null || mid.isBlank()) { + HttpResponses.json(ex, 400, Map.of("erro", "mensagem_id_obrigatorio")); + return; + } + long mensagemId = Long.parseLong(mid); + try (Connection c = masterDs.getMasterConnection()) { + Map resp = one(c, """ + SELECT r.id resposta_id, + r.integracao_mensagem_id mensagem_id, + r.resposta_texto resposta, + r.recebido_em, + m.tipo_destinatario tipo, + m.destinatario_id, + m.destinatario_nome nome, + m.telefone, + m.mensagem mensagem_original, + 'recebida' status + FROM integracao_respostas r + JOIN integracao_mensagens m ON m.id = r.integracao_mensagem_id + WHERE m.empresa_id = ? + AND r.integracao_mensagem_id = ? + ORDER BY r.recebido_em DESC, r.id DESC + LIMIT 1 + """, empresaId, mensagemId); + if (resp == null) { + HttpResponses.json(ex, 200, Map.of("ok", true, "status", "pendente", "mensagem_id", mensagemId, "resposta", null)); + return; + } + HttpResponses.json(ex, 200, Map.of("ok", true, "status", "recebida", "resposta", resp)); + } + } + private void receberRespostaEvolution(HttpExchange ex) throws Exception { validarWebhookEvolution(ex); String raw = rawBody(ex); @@ -270,6 +309,8 @@ public final class ExternalBridgeHandler implements HttpHandler { private List> rows(Connection c,String sql,Object...params)throws SQLException{List> out=new ArrayList<>();try(PreparedStatement ps=c.prepareStatement(sql)){bind(ps,params);try(ResultSet rs=ps.executeQuery()){while(rs.next())out.add(map(rs));}}return out;} private Map map(ResultSet rs)throws SQLException{Mapm=new LinkedHashMap<>();ResultSetMetaData md=rs.getMetaData();for(int i=1;i<=md.getColumnCount();i++)m.put(md.getColumnLabel(i),rs.getObject(i));return m;} private void bind(PreparedStatement ps,Object...params)throws SQLException{for(int i=0;i queryParams(HttpExchange ex){Map out=new LinkedHashMap<>();String q=ex.getRequestURI().getRawQuery();if(q==null||q.isBlank())return out;for(String part:q.split("&")){if(part.isBlank())continue;String[] p=part.split("=",2);out.put(dec(p[0]),p.length>1?dec(p[1]):"");}return out;} + private String dec(String value){return java.net.URLDecoder.decode(value, StandardCharsets.UTF_8);} private String rawBody(HttpExchange ex)throws IOException{return new String(ex.getRequestBody().readAllBytes(), StandardCharsets.UTF_8);} private String required(Map m,String k){String v=m.get(k);if(v==null||v.isBlank())throw new IllegalArgumentException("Campo obrigatorio: "+k);return v;} private String telefoneWhatsapp(String raw){String d=EvolutionApiClient.onlyDigits(raw);if((d.length()==10||d.length()==11)&&!d.startsWith("55"))return "55"+d;return d;}