FEAT: Adiciona função para buscar todos os comentários de tickets no ServiceNow com suporte à paginação

This commit is contained in:
Tulio Castro 2025-10-07 10:28:39 -03:00
parent 33e78e70c3
commit 80401bd92d
2 changed files with 75 additions and 3 deletions

View File

@ -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) {
}
}

View File

@ -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
}