// 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 { 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'); } catch (error) { logError(error, 'SERVICE NOW Requests'); } } // 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'); } } module.exports = { fetchTicketsFromServiceNow, fetchRequestsFromServiceNow, getTicketSysId, createCommentInServiceNow, getCommentId, }