FEAT: Adiciona função para buscar todos os comentários de tickets no ServiceNow com suporte à paginação
This commit is contained in:
parent
33e78e70c3
commit
80401bd92d
12
src/services/servicenowCommentService.js
Normal file
12
src/services/servicenowCommentService.js
Normal 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) {
|
||||
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user