snglpi/src/services/glpiCommentService.js

121 lines
6.2 KiB
JavaScript

// src/services/glpiCommentService.js
const TicketSnModel = require('../models/ticketSnModel');
const TicketGlpiModel = require('../models/ticketGlpiModel');
const TicketSyncModel = require('../models/ticketSyncModel');
const TicketUpdateModel = require('../models/ticketUpdateModel');
const { logInfo, logError } = require('../utils/logger');
const { existingCommentInServiceNow, syncCommentToServiceNow } = require('./servicenowService');
// Sincroniza comentários do GLPI para o Banco de Dados local
const syncCommentsGlpi = async () => {
try {
logInfo('🔄 Iniciando sincronização de comments do GLPI para o Service Now...');
const effectiveTickets = await TicketSyncModel.getTicketsToSync();
logInfo(`🔍 ${effectiveTickets.length} tickets encontrados para sincronização de comentários`, { step: 1 });
for (const ticket of effectiveTickets) {
logInfo(`Buscando comentários para o ticket GLPI ID: ${ticket.glpi_ticket_id}`);
const comments = await TicketGlpiModel.getFollowupsByItemId(ticket.glpi_ticket_id);
logInfo(`📝 ${comments.length} comentários encontrados para o ticket GLPI ID: ${ticket.glpi_ticket_id}`, { step: 2 });
for (const comment of comments) {
const existingComment = await TicketUpdateModel.getCommentSync(ticket.glpi_ticket_id, comment.id);
const commentExistsInSN = await existingCommentInServiceNow(
ticket.sn_ticket_id,
comment.content
)
if (existingComment && commentExistsInSN) {
logInfo(`Comentário ID ${comment.id} já sincronizado no banco de dados e no ServiceNow`, { step: 3 });
continue;
}
if (!existingComment && commentExistsInSN) {
// Só insere no banco, pois já está no ServiceNow
const sync_id = await TicketSyncModel.getIdSyncByGlpiId(ticket.glpi_ticket_id);
const commentData = {
ticket_sync_id: sync_id,
source_system: 'glpi',
content: comment.content,
created_at: new Date(comment.date_creation),
updated_at: new Date(comment.date_mod),
source_id: comment.id,
destiny_id: commentExistsInSN.destiny_id
};
const insertResult = await TicketUpdateModel.insert(commentData);
if (insertResult.success) {
logInfo(`✅ Comentário ID ${comment.id} inserido no banco! Novo ID: ${insertResult.newId}`, { step: 4 });
} else {
logError(`❌ Erro ao inserir comentário ID ${comment.id} no banco: ${insertResult.error}`, { step: 4 });
}
continue;
}
if (existingComment && !commentExistsInSN) {
logInfo(`Comentário ID ${comment.id} já existe no banco, mas não no ServiceNow. Sincronizando...`, { step: 3 });
// Só sincroniza no ServiceNow
const snCommentId = await syncCommentToServiceNow(ticket.sn_ticket_id, comment.content);
// Se quiser, pode atualizar o registro no banco com o id do ServiceNow aqui
logInfo(`✅ Comentário ID ${comment.id} sincronizado no ServiceNow!`, { step: 4 });
const updateData = await TicketUpdateModel.updateDestinyId(comment.id, snCommentId);
if (updateData && updateData.success) {
logInfo(`✅ ID do comentário de destino atualizado no banco: ${snCommentId}`, { step: 4 });
}
continue;
}
// Se não existe em nenhum dos dois, sincroniza nos dois normalmente
const snCommentId = await syncCommentToServiceNow(ticket.sn_ticket_id, comment);
const sync_id = await TicketSyncModel.getIdSyncByGlpiId(ticket.glpi_ticket_id);
const commentData = {
ticket_sync_id: sync_id,
source_system: 'glpi',
content: comment.content,
created_at: new Date(comment.date_creation),
updated_at: new Date(comment.date_mod),
source_id: comment.id,
destiny_id: snCommentId
};
const insertResult = await TicketUpdateModel.insert(commentData);
if (insertResult.success) {
logInfo(`✅ Comentário ID ${comment.id} sincronizado no banco e no ServiceNow! Novo ID: ${insertResult.newId}`, { step: 4 });
} else {
logError(`❌ Erro ao sincronizar comentário ID ${comment.id}: ${insertResult.error}`, { step: 4 });
}
const hasError = !insertResult.success;
const snStatus = 'pending';
const glpiStatus = hasError ? 'Error' :'updated';
await TicketSyncModel.updateStatus(ticket.id, glpiStatus, snStatus);
logInfo(`Status de sincronização para o ticket ID ${ticket.id} atualizado para GLPI: '${glpiStatus}', SN: '${snStatus}'.`);
}
}
logInfo('✅ Sincronização de comentários do GLPI -> ServiceNow concluída!');
}catch (error) {
logError(error, 'GLPI Tickets');
}
}
/**
* @module glpiCommentService
* @description Este módulo fornece serviços para sincronizar comentários do GLPI para o banco de dados local.
* A função syncCommentsGlpi busca tickets que foram criados com sucesso e sincroniza seus comentários,
* garantindo que apenas novos comentários sejam inseridos no banco de dados.
* Utiliza os modelos TicketSnModel, TicketGlpiModel, TicketSyncModel e TicketUpdateModel para interagir com o banco de dados.
* Atualiza o status de sincronização após cada comentário processado.
* Inclui logging detalhado para monitorar o progresso e identificar erros durante o processo de sincronização.
*/
module.exports = {
syncCommentsGlpi
};