snglpi/src/services/servicenowService.js

132 lines
5.1 KiB
JavaScript
Raw Normal View History

// src/services/servicenowService.js
2025-08-30 19:04:35 -03:00
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');
2025-08-30 19:04:35 -03:00
const fetchTicketsFromServiceNow = async () => {
2025-08-30 19:04:35 -03:00
try {
logInfo('📡 Buscando incidentes do ServiceNow...', { service: 'servicenow' });
const ticketsResponse = await axios.get(apiConfig.snIncidentConfig.baseUrl, {
auth: apiConfig.servicenowAuthentication.auth
});
// comentado para evitar muitos arquivos
//fs.writeFileSync('servicenow_tickets.json', JSON.stringify(ticketsResponse.data, null, 2));
//logInfo('💾 Backup JSON de incidentes salvo', { count: ticketsResponse.data.result.length });
// Salvar os tickets no banco de dados
logInfo('💾 Iniciando salvamento de incidentes no banco...');
for (const ticket of ticketsResponse.data.result) {
await TicketSnModel.saveTicket(ticket, 'incidente');
}
logSync('ServiceNow', ticketsResponse.data.result.length, 'incidentes');
} catch (error) {
logError(error, 'SERVICE NOW Tickets');
}
}
const fetchRequestsFromServiceNow = async () => {
try {
logInfo('📡 Buscando requisições do ServiceNow...', { service: 'servicenow' });
const requestsResponse = await axios.get(apiConfig.snRequestConfig.baseUrl, {
auth: apiConfig.servicenowAuthentication.auth
});
// Comentado para evitar muitos arquivos
//fs.writeFileSync('servicenow_requests.json', JSON.stringify(requestsResponse.data, null, 2));
//logInfo('💾 Backup JSON de requisições salvo', { count: requestsResponse.data.result.length });
// Salvar as requisições no banco de dados
logInfo('💾 Iniciando salvamento de requisições no banco...');
for (const request of requestsResponse.data.result) {
await TicketSnModel.saveTicket(request, 'requisicao');
}
logSync('ServiceNow', requestsResponse.data.result.length, 'requisições');
2025-08-30 19:04:35 -03:00
} catch (error) {
logError(error, 'SERVICE NOW Requests');
2025-08-30 19:04:35 -03:00
}
}
2025-08-30 19:04:35 -03:00
// Função para obter o sys_id de um ticket pela tabela de sincronização do banco de dados local
const getTicketSysId = async (ticketNumber) => {
try {
const ticket = await TicketSnModel.findByTicketNumber(ticketNumber);
return ticket.sys_id;
} catch (error) {
logError(error, '🚨Falha ao obter sys_id do ticket');
return null;
}
}
// Função para obter o código de um comentário dentro de um ticket do ServiceNow
const getCommentId = async (sysId, comment) => {
try {
// Exemplo de requisição GET para buscar comentários:
// GET https://SEU_INSTANCE.service-now.com/api/now/table/sys_journal_field?sysparm_query=name=incident^element=comments^element_id={SYS_ID_DO_INCIDENTE}&sysparm_fields=sys_id,sys_created_on,sys_created_by,value&sysparm_orderby_desc=sys_created_on&sysparm_limit=1&sysparm_orderby_desc=sys_created_on&sysparm_limit=1
const url = `${apiConfig.snTableJournalConfig.baseUrl}?sysparm_query=name=incident^element=comments^element_id=${sysId}&sysparm_fields=sys_id,sys_created_on,sys_created_by,value&sysparm_orderby_desc=sys_created_on&sysparm_limit=1`;
const response = await axios.get(url, {
auth: apiConfig.servicenowAuthentication.auth
});
for (const entry of response.data.result) {
if (entry.value.includes(comment)) {
return entry.sys_id;
} else {
logInfo('Comentário não encontrado no ticket', { sysId });
}
}
} catch (error) {
logError(error, '🚨Falha ao obter ID do comentário no ServiceNow');
return null;
}
}
// Função para criar um comentário em um ticket no ServiceNow
const createCommentInServiceNow = async (sysId, comment) => {
try {
// Exemplo de requisição PATCH para atualizar um ticket:
// curl -u user:pass \
// -H "Content-Type: application/json" \
// -X PATCH "https://SEU_INSTANCE.service-now.com/api/now/table/incident/{SYS_ID_DO_INCIDENTE}" \
// -d '{"comments":"Estamos analisando seu chamado. Retorno em breve."}'
const url = `${apiConfig.snTableIncidentConfig.baseUrl}${sysId}`;
const payload = {
comments: comment
};
await axios.patch(url, payload, {
auth: apiConfig.servicenowAuthentication.auth
});
logInfo('💬 Comentário criado com sucesso no ServiceNow', { sysId, comment });
// retornar id do comentário criado
const commentId = await getCommentId(sysId, comment);
return commentId;
} catch (error) {
logError(error, '🚨Falha ao criar comentário no ServiceNow');
}
}
2025-08-30 19:04:35 -03:00
module.exports = {
fetchTicketsFromServiceNow,
fetchRequestsFromServiceNow,
getTicketSysId,
createCommentInServiceNow,
getCommentId,
}