Ajustes 2306
This commit is contained in:
@@ -148,7 +148,7 @@ class ChatController {
|
||||
const statusFilter = req.query.status || 'A,E';
|
||||
const filter = req.query.filter || ''; // 'mine', 'unassigned', 'all'
|
||||
|
||||
if (!req.user?.empresas?.includes(empresaId))
|
||||
if (!empresaId || !req.user?.empresas?.some(function(e) { return Number(e) === Number(empresaId); }))
|
||||
return res.status(403).json({ success: false, error: 'Sem permissão.' });
|
||||
|
||||
// Status via parâmetros (evita SQL injection). Aceita apenas A/E/F.
|
||||
@@ -260,7 +260,7 @@ class ChatController {
|
||||
var minhasEquipes = await db.query(alias,
|
||||
'SELECT EQU_EQUIPE_ID FROM CHATC2_USU_EQUIPES WHERE EQU_USUARIO_ID = ?', [userId]);
|
||||
if (minhasEquipes.length > 0) {
|
||||
var eqIds = minhasEquipes.map(function(e) { return e.EQU_EQUIPE_ID; }).join(',');
|
||||
var eqIds = minhasEquipes.map(function(e) { return "'" + e.EQU_EQUIPE_ID + "'"; }).join(',');
|
||||
var countEq = await db.query(alias,
|
||||
`SELECT COUNT(*) AS CT FROM CHATC2_CONVERSAS WHERE CON_EMPRESA_ID = ? AND CON_STATUS IN ('A','E') AND CON_SITUACAO = 'A' AND CON_EQUIPE_ID IN (${eqIds})`,
|
||||
[empresaId]);
|
||||
@@ -296,7 +296,7 @@ class ChatController {
|
||||
const row = result[0];
|
||||
const empresaId = row.CON_EMPRESA_ID;
|
||||
|
||||
if (!req.user?.empresas?.includes(empresaId))
|
||||
if (empresaId && !req.user?.empresas?.some(function(e) { return String(e) === String(empresaId); }))
|
||||
return res.status(403).json({ success: false, error: 'Sem permissão.' });
|
||||
|
||||
// Verifica se o número pertence a um dependente
|
||||
@@ -471,7 +471,7 @@ class ChatController {
|
||||
if (r.length === 0) return { status: 404 };
|
||||
const emp = r[0].CON_EMPRESA_ID;
|
||||
const minhas = (req.user && req.user.empresas) || [];
|
||||
if (emp && minhas.indexOf(emp) === -1) return { status: 403 };
|
||||
if (emp && !minhas.some(function(e) { return String(e) === String(emp); })) return { status: 403 };
|
||||
return { ok: true, empresaId: emp };
|
||||
}
|
||||
|
||||
@@ -542,7 +542,7 @@ class ChatController {
|
||||
|
||||
const conv = await db.query(alias, 'SELECT * FROM CHATC2_CONVERSAS WHERE CON_CODIGO_ID = ?', [id]);
|
||||
if (conv.length === 0) return res.status(404).json({ success: false, error: 'Conversa não encontrada.' });
|
||||
if (conv[0].CON_EMPRESA_ID && !((req.user && req.user.empresas) || []).includes(conv[0].CON_EMPRESA_ID))
|
||||
if (conv[0].CON_EMPRESA_ID && !((req.user && req.user.empresas) || []).some(function(e) { return String(e) === String(conv[0].CON_EMPRESA_ID); }))
|
||||
return res.status(403).json({ success: false, error: 'Sem permissão.' });
|
||||
|
||||
// Se a conversa estiver finalizada, reabre
|
||||
@@ -620,8 +620,8 @@ class ChatController {
|
||||
|
||||
// Insere mensagem no banco
|
||||
await db.execute(alias, `
|
||||
INSERT INTO CHATC2_CONVERSAS_MENSAGENS (CME_CODIGO_ID, CME_CONVERSA_ID, CME_REMETENTE, CME_USUARIO_ID, CME_TEXTO, CME_TIPO, CME_PRIVADA, CME_DT_ENVIO, CME_MIDIA_ID)
|
||||
VALUES (?, ?, 'U', ?, ?, ?, ?, CURRENT_TIMESTAMP, ?)
|
||||
INSERT INTO CHATC2_CONVERSAS_MENSAGENS (CME_CODIGO_ID, CME_CONVERSA_ID, CME_REMETENTE, CME_USUARIO_ID, CME_TEXTO, CME_TIPO, CME_PRIVADA, CME_SITUACAO, CME_DT_ENVIO, CME_MIDIA_ID)
|
||||
VALUES (?, ?, 'U', ?, ?, ?, ?, 'A', CURRENT_TIMESTAMP, ?)
|
||||
`, [newId, id, usuarioId, textoFinal, tipo || 'text', privada === 'S' ? 'S' : 'N', midiaId]);
|
||||
|
||||
// Atualiza data da última mensagem
|
||||
@@ -663,7 +663,7 @@ class ChatController {
|
||||
if (conv.length === 0) return res.status(404).json({ success: false, error: 'Conversa não encontrada.' });
|
||||
|
||||
const c = conv[0];
|
||||
if (c.CON_EMPRESA_ID && !((req.user && req.user.empresas) || []).includes(c.CON_EMPRESA_ID))
|
||||
if (c.CON_EMPRESA_ID && !((req.user && req.user.empresas) || []).some(function(e) { return String(e) === String(c.CON_EMPRESA_ID); }))
|
||||
return res.status(403).json({ success: false, error: 'Sem permissão.' });
|
||||
|
||||
// ===== Fluxo de Resolução: valida motivo/resolução conforme config =====
|
||||
@@ -781,7 +781,7 @@ class ChatController {
|
||||
|
||||
// Verifica permissão
|
||||
const userEmpresas = req.user?.empresas || [];
|
||||
if (!userEmpresas.includes(parseInt(empresaId))) {
|
||||
if (!userEmpresas.some(function(e) { return String(e) === String(empresaId); })) {
|
||||
return res.status(403).json({ success: false, error: 'Sem permissão para esta empresa.' });
|
||||
}
|
||||
|
||||
@@ -827,8 +827,8 @@ class ChatController {
|
||||
const maxMsgId = await db.query(alias, 'SELECT MAX(CME_CODIGO_ID) AS ID FROM CHATC2_CONVERSAS_MENSAGENS');
|
||||
const msgId = (maxMsgId[0]?.ID || 0) + 1;
|
||||
await db.execute(alias, `
|
||||
INSERT INTO CHATC2_CONVERSAS_MENSAGENS (CME_CODIGO_ID, CME_CONVERSA_ID, CME_REMETENTE, CME_USUARIO_ID, CME_TEXTO, CME_TIPO, CME_DT_ENVIO)
|
||||
VALUES (?, ?, 'U', ?, ?, 'text', CURRENT_TIMESTAMP)
|
||||
INSERT INTO CHATC2_CONVERSAS_MENSAGENS (CME_CODIGO_ID, CME_CONVERSA_ID, CME_REMETENTE, CME_USUARIO_ID, CME_TEXTO, CME_TIPO, CME_SITUACAO, CME_DT_ENVIO)
|
||||
VALUES (?, ?, 'U', ?, ?, 'text', 'A', CURRENT_TIMESTAMP)
|
||||
`, [msgId, conversaId, req.user?.id, mensagem]);
|
||||
|
||||
await db.execute(alias,
|
||||
@@ -860,8 +860,8 @@ class ChatController {
|
||||
// Insere conversa
|
||||
await db.execute(alias, `
|
||||
INSERT INTO CHATC2_CONVERSAS (CON_CODIGO_ID, CON_EMPRESA_ID, CON_INSTANCIA_ID, CON_NUMERO,
|
||||
CON_NOME_CONTATO, CON_CLIENTE_ID, CON_STATUS, CON_PRIMEIRA_MSG, CON_DT_ULTIMA_MSG)
|
||||
VALUES (?, ?, ?, ?, ?, ?, 'A', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
|
||||
CON_NOME_CONTATO, CON_CLIENTE_ID, CON_STATUS, CON_SITUACAO, CON_PRIMEIRA_MSG, CON_DT_ULTIMA_MSG)
|
||||
VALUES (?, ?, ?, ?, ?, ?, 'A', 'A', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
|
||||
`, [newId, empresaId, instId, numeroLimpo, nomeContato || numeroLimpo, clienteId || null]);
|
||||
|
||||
// Insere primeira mensagem
|
||||
@@ -869,8 +869,8 @@ class ChatController {
|
||||
const msgId = (maxMsgId[0]?.ID || 0) + 1;
|
||||
|
||||
await db.execute(alias, `
|
||||
INSERT INTO CHATC2_CONVERSAS_MENSAGENS (CME_CODIGO_ID, CME_CONVERSA_ID, CME_REMETENTE, CME_USUARIO_ID, CME_TEXTO, CME_TIPO, CME_DT_ENVIO)
|
||||
VALUES (?, ?, 'U', ?, ?, 'text', CURRENT_TIMESTAMP)
|
||||
INSERT INTO CHATC2_CONVERSAS_MENSAGENS (CME_CODIGO_ID, CME_CONVERSA_ID, CME_REMETENTE, CME_USUARIO_ID, CME_TEXTO, CME_TIPO, CME_SITUACAO, CME_DT_ENVIO)
|
||||
VALUES (?, ?, 'U', ?, ?, 'text', 'A', CURRENT_TIMESTAMP)
|
||||
`, [msgId, newId, req.user?.id, mensagem]);
|
||||
|
||||
// Envia via Evolution API
|
||||
@@ -1058,7 +1058,7 @@ class ChatController {
|
||||
mimeType = mimeType.split(';')[0].trim();
|
||||
const nomeArquivo = (m.MAT_NOME_ARQUIVO || '').trim() || 'arquivo.bin';
|
||||
|
||||
// MAT_ARQUIVO chega como Buffer (postgres bytea / firebird blob) ou string
|
||||
// MAT_ARQUIVO chega como Buffer (firebird blob) ou string
|
||||
let rawBuffer = m.MAT_ARQUIVO;
|
||||
if (rawBuffer == null) {
|
||||
return respond(404, { success: false, error: 'Mídia sem conteúdo.' });
|
||||
@@ -1179,7 +1179,7 @@ class ChatController {
|
||||
const cli = await db.query(alias,
|
||||
'SELECT CLI_EMPRESA_ID FROM CLIENTES WHERE CLI_CODIGO_ID = ?', [cid]);
|
||||
if (cli.length === 0) return { status: 404 };
|
||||
if (chk.empresaId && cli[0].CLI_EMPRESA_ID && cli[0].CLI_EMPRESA_ID !== chk.empresaId)
|
||||
if (chk.empresaId && cli[0].CLI_EMPRESA_ID && String(cli[0].CLI_EMPRESA_ID) !== String(chk.empresaId))
|
||||
return { status: 403 };
|
||||
return { ok: true, clienteId: cid };
|
||||
}
|
||||
@@ -1282,8 +1282,8 @@ class ChatController {
|
||||
const maxId = await db.query(alias, 'SELECT MAX(CME_CODIGO_ID) AS ID FROM CHATC2_CONVERSAS_MENSAGENS');
|
||||
const newId = (maxId[0]?.ID || 0) + 1;
|
||||
await db.execute(alias, `
|
||||
INSERT INTO CHATC2_CONVERSAS_MENSAGENS (CME_CODIGO_ID, CME_CONVERSA_ID, CME_REMETENTE, CME_USUARIO_ID, CME_TEXTO, CME_TIPO, CME_PRIVADA, CME_DT_ENVIO)
|
||||
VALUES (?, ?, 'U', ?, ?, 'text', 'N', CURRENT_TIMESTAMP)
|
||||
INSERT INTO CHATC2_CONVERSAS_MENSAGENS (CME_CODIGO_ID, CME_CONVERSA_ID, CME_REMETENTE, CME_USUARIO_ID, CME_TEXTO, CME_TIPO, CME_PRIVADA, CME_SITUACAO, CME_DT_ENVIO)
|
||||
VALUES (?, ?, 'U', ?, ?, 'text', 'N', 'A', CURRENT_TIMESTAMP)
|
||||
`, [newId, id, req.user?.id, texto]);
|
||||
await db.execute(alias,
|
||||
'UPDATE CHATC2_CONVERSAS SET CON_DT_ULTIMA_MSG = CURRENT_TIMESTAMP WHERE CON_CODIGO_ID = ?', [id]);
|
||||
|
||||
Reference in New Issue
Block a user