Преглед изворни кода

trazendo audio e img conversa completa

GabrielRamison пре 2 месеци
родитељ
комит
f08daa76f3
4 измењених фајлова са 22 додато и 2 уклоњено
  1. 2 0
      .env.example
  2. 2 0
      src/config/index.js
  3. 4 2
      src/controllers/Atendimentos.Controller.js
  4. 14 0
      src/utils/atendimentoFormat.js

+ 2 - 0
.env.example

@@ -85,4 +85,6 @@ RAG_HYDE=false
 IFBOT_BASE_URL=https://star.ifbot.com.br/api
 IFBOT_TOKEN=
 # IFBOT_AUTH_HEADER=Authorization
+# base pública dos arquivos de mídia (/data/img, /data/aud); padrão: IFBOT_BASE_URL sem o sufixo /api
+# IFBOT_MEDIA_BASE_URL=https://star.ifbot.com.br
 ATENDIMENTOS_SYNC_INTERVAL_MINUTES=30

+ 2 - 0
src/config/index.js

@@ -73,6 +73,8 @@ export const config = {
   },
   ifbot: {
     baseUrl: process.env.IFBOT_BASE_URL ?? "https://star.ifbot.com.br/api",
+    // arquivos de mídia (/data/img, /data/aud) são servidos na raiz do domínio, fora do /api
+    mediaBaseUrl: (process.env.IFBOT_MEDIA_BASE_URL ?? (process.env.IFBOT_BASE_URL ?? "https://star.ifbot.com.br/api").replace(/\/api\/?$/, "")).replace(/\/+$/, ""),
     token: process.env.IFBOT_TOKEN ?? "",
     authHeader: process.env.IFBOT_AUTH_HEADER ?? "Authorization",
     syncIntervalMinutes: Number(process.env.ATENDIMENTOS_SYNC_INTERVAL_MINUTES ?? 30)

+ 4 - 2
src/controllers/Atendimentos.Controller.js

@@ -13,7 +13,8 @@ import {
   listarAvaliacoes,
   estatisticasAvaliacoes
 } from "../services/atendimentoAvaliacaoService.js";
-import { estruturarMensagem } from "../utils/atendimentoFormat.js";
+import { estruturarMensagem, montarUrlMidia } from "../utils/atendimentoFormat.js";
+import { config } from "../config/index.js";
 
 export const AtendimentosController = {
   Ingerir: async function (req, res, next) {
@@ -94,7 +95,8 @@ export const AtendimentosController = {
             Transcricao: transcricao,
             Timestamp: m.Timestamp,
             Tipodemidia: m.Tipodemidia,
-            Midia: m.Midia
+            Midia: m.Midia,
+            MidiaUrl: montarUrlMidia(m, config.ifbot.mediaBaseUrl)
           };
         })
         .filter(Boolean);

+ 14 - 0
src/utils/atendimentoFormat.js

@@ -84,6 +84,20 @@ export function estruturarMensagem(m) {
   return { papel, autor, texto };
 }
 
+// URL pública do arquivo de mídia da mensagem. O caminho normalmente vem em Midia
+// (ex.: /data/img/xxx.jpg); em áudios antigos o Body é o próprio path e Midia é null.
+export function montarUrlMidia(m, baseUrl) {
+  let caminho = typeof m.Midia === "string" && m.Midia.trim() ? m.Midia.trim() : null;
+  if (!caminho) {
+    const body = typeof m.Body === "string" ? m.Body.trim() : "";
+    if (/^\/[\w./-]+$/.test(body)) caminho = body;
+  }
+  if (!caminho) return null;
+  if (/^https?:\/\//i.test(caminho)) return caminho;
+  if (!baseUrl) return null;
+  return `${baseUrl}${caminho.startsWith("/") ? "" : "/"}${caminho}`;
+}
+
 export function formatMensagem(m, clienteNome) {
   const { papel, autor, texto } = estruturarMensagem(m);
   if (!texto) return null;