Registra respostas da Evolution nos condominios
This commit is contained in:
@@ -132,10 +132,11 @@ public final class ExternalBridgeHandler implements HttpHandler {
|
||||
}
|
||||
long mensagemId = ((Number)envio.get("id")).longValue();
|
||||
long respostaId = registrarResposta(c, mensagemId, raw, texto);
|
||||
int respostasTenant = registrarRespostaTenant(envio, raw, numero, texto);
|
||||
registrarEventoWebhook(c, raw, numero, remoteJid, remoteJidAlt, messageId, texto, mensagemId, "resposta_registrada");
|
||||
boolean encaminhado = encaminharCallback(envio, respostaId, numero, texto);
|
||||
System.out.println("Webhook Evolution resposta registrada. mensagem_id=" + envio.get("id") + ", resposta_id=" + respostaId + ", numero=" + numero + ", encaminhado=" + encaminhado);
|
||||
HttpResponses.json(ex, 200, Map.of("ok", true, "encaminhado", encaminhado, "mensagem_id", envio.get("id"), "resposta_id", respostaId));
|
||||
System.out.println("Webhook Evolution resposta registrada. mensagem_id=" + envio.get("id") + ", resposta_id=" + respostaId + ", respostas_tenant=" + respostasTenant + ", numero=" + numero + ", encaminhado=" + encaminhado);
|
||||
HttpResponses.json(ex, 200, Map.of("ok", true, "encaminhado", encaminhado, "mensagem_id", envio.get("id"), "resposta_id", respostaId, "respostas_tenant", respostasTenant));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -260,7 +261,9 @@ public final class ExternalBridgeHandler implements HttpHandler {
|
||||
private void addIfPresent(List<Destinatario> out, Destinatario d){if(d!=null)out.add(d);}
|
||||
private long registrarMensagem(Connection c,long emp,ApiKeyConfig cfg,String ref,Destinatario d,String tel,String msg,String status,String detalhe,String evolutionMessageId,String remoteJid,String remoteJidAlt)throws SQLException{try(PreparedStatement ps=c.prepareStatement("INSERT INTO integracao_mensagens (empresa_id,sistema_externo,referencia_externa,callback_url,callback_secret,tipo_destinatario,destinatario_id,destinatario_nome,telefone,mensagem,status,evolution_response,evolution_message_id,evolution_remote_jid,evolution_remote_jid_alt) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) RETURNING id")){ps.setLong(1,emp);ps.setString(2,cfg.sistemaExterno());ps.setString(3,ref);ps.setString(4,emptyToNull(cfg.callbackUrl()));ps.setString(5,emptyToNull(cfg.callbackSecret()));ps.setString(6,d.tipo());ps.setLong(7,d.id());ps.setString(8,d.nome());ps.setString(9,tel);ps.setString(10,msg);ps.setString(11,status);ps.setString(12,detalhe);ps.setString(13,emptyToNull(evolutionMessageId));ps.setString(14,emptyToNull(remoteJid));ps.setString(15,emptyToNull(remoteJidAlt));try(ResultSet rs=ps.executeQuery()){rs.next();return rs.getLong(1);}}}
|
||||
private long registrarResposta(Connection c,long msgId,String raw,String texto)throws SQLException{try(PreparedStatement ps=c.prepareStatement("INSERT INTO integracao_respostas (integracao_mensagem_id,resposta_texto,payload) VALUES (?,?,?) RETURNING id")){ps.setLong(1,msgId);ps.setString(2,texto);ps.setString(3,raw);try(ResultSet rs=ps.executeQuery()){rs.next();return rs.getLong(1);}}}
|
||||
private Map<String,Object> buscarEnvioResposta(Connection c,String numero,String remoteJid,String remoteJidAlt)throws SQLException{Map<String,Object> envio=null;if(!isBlank(remoteJid)||!isBlank(remoteJidAlt)){envio=one(c,"SELECT * FROM integracao_mensagens WHERE callback_url IS NOT NULL AND status='enviado' AND (evolution_remote_jid IN (?,?) OR evolution_remote_jid_alt IN (?,?)) ORDER BY criado_em DESC,id DESC LIMIT 1",remoteJid,remoteJidAlt,remoteJid,remoteJidAlt);}if(envio==null&&!isBlank(numero)){envio=one(c,"SELECT * FROM integracao_mensagens WHERE telefone=? AND callback_url IS NOT NULL AND status='enviado' ORDER BY criado_em DESC,id DESC LIMIT 1",numero);}if(envio==null&&!isBlank(numero)){envio=one(c,"SELECT * FROM integracao_mensagens WHERE telefone=? AND callback_url IS NOT NULL AND criado_em >= now() - interval '24 hours' ORDER BY criado_em DESC,id DESC LIMIT 1",numero);}return envio;}
|
||||
private Map<String,Object> buscarEnvioResposta(Connection c,String numero,String remoteJid,String remoteJidAlt)throws SQLException{Map<String,Object> envio=null;if(!isBlank(remoteJid)||!isBlank(remoteJidAlt)){envio=one(c,"SELECT * FROM integracao_mensagens WHERE status='enviado' AND (evolution_remote_jid IN (?,?) OR evolution_remote_jid_alt IN (?,?)) ORDER BY criado_em DESC,id DESC LIMIT 1",remoteJid,remoteJidAlt,remoteJid,remoteJidAlt);}if(envio==null&&!isBlank(numero)){envio=one(c,"SELECT * FROM integracao_mensagens WHERE telefone=? AND status='enviado' ORDER BY criado_em DESC,id DESC LIMIT 1",numero);}if(envio==null&&!isBlank(numero)){envio=one(c,"SELECT * FROM integracao_mensagens WHERE telefone=? AND criado_em >= now() - interval '24 hours' ORDER BY criado_em DESC,id DESC LIMIT 1",numero);}return envio;}
|
||||
private int registrarRespostaTenant(Map<String,Object> envio,String raw,String numero,String texto)throws SQLException{long emp=((Number)envio.get("empresa_id")).longValue();String tipo=str(envio.get("tipo_destinatario"));long dest=((Number)envio.get("destinatario_id")).longValue();try(Connection t=tenantDs.getConnection(emp)){List<Map<String,Object>> links=linksRespostaTenant(t,tipo,dest);int count=0;for(Map<String,Object> link:links){Long cond=num(link.get("condominio_id"));if(cond==null)continue;Long contato=Set.of("sindico","subsindico","conselheiro","contato").contains(tipo)?dest:null;try(PreparedStatement ps=t.prepareStatement("INSERT INTO respostas (condominio_id,contato_id,mensagem_id,tipo_origem,nome_origem,telefone_origem,resposta_texto,mensagem_original,payload,origem,status) VALUES (?,?,?,?,?,?,?,?,?,?,?)")){ps.setLong(1,cond);if(contato==null)ps.setNull(2,Types.BIGINT);else ps.setLong(2,contato);ps.setLong(3,((Number)envio.get("id")).longValue());ps.setString(4,tipo);ps.setString(5,firstNonBlank(str(link.get("nome")),str(envio.get("destinatario_nome"))));ps.setString(6,firstNonBlank(numero,str(link.get("telefone")),str(envio.get("telefone"))));ps.setString(7,texto);ps.setString(8,str(envio.get("mensagem")));ps.setString(9,raw);ps.setString(10,"evolution");ps.setString(11,"recebida");count+=ps.executeUpdate();}}return count;}}
|
||||
private List<Map<String,Object>> linksRespostaTenant(Connection c,String tipo,long dest)throws SQLException{if(Set.of("sindico","subsindico","conselheiro","contato").contains(tipo))return rows(c,"SELECT cc.condominio_id,c.nome,c.telefone FROM contato_condominio cc JOIN contatos c ON c.id=cc.contato_id WHERE cc.contato_id=? AND cc.status='ativo' ORDER BY cc.condominio_id",dest);if("funcionario".equals(tipo))return rows(c,"SELECT fc.condominio_id, NULL AS nome, NULL AS telefone FROM funcionario_condominio fc WHERE fc.funcionario_id=? ORDER BY fc.condominio_id",dest);if("extra".equals(tipo))return rows(c,"SELECT a.condominio_id,e.nome,e.telefone FROM aviso_destinatarios ad JOIN avisos a ON a.id=ad.aviso_id JOIN destinatarios_extra e ON e.id=ad.destinatario_id WHERE ad.tipo_destinatario='extra' AND ad.destinatario_id=? ORDER BY a.criado_em DESC,a.id DESC LIMIT 1",dest);return List.of();}
|
||||
private void registrarEventoWebhook(Connection c,String raw,String numero,String remoteJid,String remoteJidAlt,String messageId,String texto,Long mensagemId,String status)throws SQLException{try(PreparedStatement ps=c.prepareStatement("INSERT INTO integracao_webhook_eventos (telefone,remote_jid,remote_jid_alt,message_id,texto,integracao_mensagem_id,status,payload) VALUES (?,?,?,?,?,?,?,?)")){ps.setString(1,emptyToNull(numero));ps.setString(2,emptyToNull(remoteJid));ps.setString(3,emptyToNull(remoteJidAlt));ps.setString(4,emptyToNull(messageId));ps.setString(5,texto);if(mensagemId==null)ps.setNull(6,Types.BIGINT);else ps.setLong(6,mensagemId);ps.setString(7,status);ps.setString(8,raw);ps.executeUpdate();}}
|
||||
private Map<String,Object> evolutionAprovada(long emp)throws SQLException{try(Connection m=masterDs.getMasterConnection();PreparedStatement ps=m.prepareStatement("SELECT * FROM evolution_instancias WHERE empresa_id=? AND status='aprovada' ORDER BY aprovado_em DESC,id DESC LIMIT 1")){ps.setLong(1,emp);try(ResultSet rs=ps.executeQuery()){return rs.next()?map(rs):null;}}}
|
||||
private Map<String,Object> one(Connection c,String sql,Object...params)throws SQLException{try(PreparedStatement ps=c.prepareStatement(sql)){bind(ps,params);try(ResultSet rs=ps.executeQuery()){return rs.next()?map(rs):null;}}}
|
||||
@@ -270,6 +273,7 @@ public final class ExternalBridgeHandler implements HttpHandler {
|
||||
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;}
|
||||
private String str(Object v){return v==null?"":String.valueOf(v);}
|
||||
private Long num(Object v){return v instanceof Number n?n.longValue():null;}
|
||||
private String emptyToNull(String v){return v==null||v.isBlank()?null:v;}
|
||||
private String firstNonBlank(String... values){for(String v:values)if(v!=null&&!v.isBlank())return v;return "";}
|
||||
private String extract(String raw,String key){String value=extractValue(raw,key);return value==null?null:value.split("@")[0];}
|
||||
|
||||
Reference in New Issue
Block a user