From 80401bd92d99bb3860338f5979a6ece598d0e3b8 Mon Sep 17 00:00:00 2001 From: Tulio Castro Date: Tue, 7 Oct 2025 10:28:39 -0300 Subject: [PATCH] =?UTF-8?q?FEAT:=20Adiciona=20fun=C3=A7=C3=A3o=20para=20bu?= =?UTF-8?q?scar=20todos=20os=20coment=C3=A1rios=20de=20tickets=20no=20Serv?= =?UTF-8?q?iceNow=20com=20suporte=20=C3=A0=20pagina=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/servicenowCommentService.js | 12 +++++ src/services/servicenowService.js | 66 ++++++++++++++++++++++-- 2 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 src/services/servicenowCommentService.js diff --git a/src/services/servicenowCommentService.js b/src/services/servicenowCommentService.js new file mode 100644 index 0000000..c442c6d --- /dev/null +++ b/src/services/servicenowCommentService.js @@ -0,0 +1,12 @@ +const axios = require('axios'); +const apiConfig = require('../../config/apiConfig'); +const TicketSnModel = require('../models/ticketSnModel'); +const { logInfo, logError, logSync } = require('../utils/logger'); + +const syncCommentsInServiceNow = async () => { + try { + + } catch (error) { + + } +} \ No newline at end of file diff --git a/src/services/servicenowService.js b/src/services/servicenowService.js index 16fa377..dca2870 100644 --- a/src/services/servicenowService.js +++ b/src/services/servicenowService.js @@ -1,10 +1,8 @@ // src/services/servicenowService.js const axios = require('axios'); const apiConfig = require('../../config/apiConfig'); -const fs = require('fs'); const TicketSnModel = require('../models/ticketSnModel'); const { logInfo, logError, logSync } = require('../utils/logger'); -const TicketUpdateModel = require('../models/ticketUpdateModel'); const fetchTicketsFromServiceNow = async () => { try { @@ -199,6 +197,67 @@ const syncCommentToServiceNow = async (ticketId, comment) => { } } +// Função para buscar todos os comentários de tickets no ServiceNow a partir do ticket id no banco local +// Deve-se atentar para a paginação da API do ServiceNow + +const getAllCommentsFromServiceNow = async (ticketId) => { + try { + const sys_id = await getTicketSysId(ticketId); + if (!sys_id) { + logError('sys_id não encontrado para ticket', { ticketId }); + return []; + } + + const allComments = []; + const pageSize = 100; + let offset = 0; + let page = 0; + const internalMaxPages = 1000; // safeguard interno para evitar loop infinito + + while (true) { + page++; + const params = { + sysparm_query: `element_id=${encodeURIComponent(sys_id)}^element=comments`, + sysparm_fields: 'sys_id,element,value,sys_created_on,sys_created_by,element_id', + sysparm_limit: pageSize, + sysparm_offset: offset + }; + + logInfo(`Buscando página ${page} de comentários do ticket SN Ticket: ${ticketId}`, { ticketId, page }); + const response = await axios.get(apiConfig.snTableJournalConfig.baseUrl, { + auth: apiConfig.servicenowAuthentication.auth, + params + }); + + const comments = response?.data?.result || []; + + if (!Array.isArray(comments) || comments.length === 0) { + break; // não há mais comentários + } + + allComments.push(...comments); + + if (comments.length < pageSize) { + break; // última página + } + + // avançar para próxima página + offset += pageSize; + + // proteção extra para evitar loop infinito em caso de comportamento inesperado da API + if (page >= internalMaxPages) { + logError(new Error('Max pages reached while paginating comments'), { ticketId, page }); + break; + } + } + + return allComments; + } catch (error) { + logError(error, '🚨Falha ao buscar comentários do ServiceNow'); + return []; + } +}; + module.exports = { fetchTicketsFromServiceNow, fetchRequestsFromServiceNow, @@ -206,5 +265,6 @@ module.exports = { createCommentInServiceNow, getCommentId, existingCommentInServiceNow, - syncCommentToServiceNow + syncCommentToServiceNow, + getAllCommentsFromServiceNow } \ No newline at end of file