Adiciona consulta de respostas por API key

This commit is contained in:
Tiago
2026-10-06 17:18:48 -03:00
parent 6394c3e28b
commit 8ca59a2b41
2 changed files with 42 additions and 0 deletions
@@ -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));
@@ -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<String,Object> 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<Map<String,Object>> rows(Connection c,String sql,Object...params)throws SQLException{List<Map<String,Object>> 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<String,Object> map(ResultSet rs)throws SQLException{Map<String,Object>m=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<params.length;i++)ps.setObject(i+1,params[i]);}
private Map<String,String> queryParams(HttpExchange ex){Map<String,String> 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<String,String> 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;}