WIP: Trabalhando no envio dos comentarios para o banco de dados
- Dados de comentarios GLPI estão sendo coletados - Resta envio para banco de dados
This commit is contained in:
parent
9df7e62cf5
commit
bbc618d496
@ -1,6 +1,6 @@
|
|||||||
// src/app.js
|
// src/app.js
|
||||||
const { snServices } = require('./controllers/servicenowController');
|
const { snServices } = require('./controllers/servicenowController');
|
||||||
const { glpiServices } = require('./controllers/glpiController'); // NOVO
|
const { glpiServices } = require('./controllers/glpiController');
|
||||||
const { logInfo } = require('./utils/logger');
|
const { logInfo } = require('./utils/logger');
|
||||||
|
|
||||||
logInfo('Aplicação iniciada', {
|
logInfo('Aplicação iniciada', {
|
||||||
@ -10,7 +10,7 @@ logInfo('Aplicação iniciada', {
|
|||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
try {
|
try {
|
||||||
await snServices();
|
//await snServices();
|
||||||
await glpiServices();
|
await glpiServices();
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@ -1,8 +1,10 @@
|
|||||||
// src/controllers/glpiController.js
|
// src/controllers/glpiController.js
|
||||||
const { syncTicketsToGlpi } = require('../services/glpiService');
|
const { syncTicketsToGlpi } = require('../services/glpiTicketService');
|
||||||
|
const { syncCommentsGlpi } = require('../services/glpiCommentService');
|
||||||
|
|
||||||
const glpiServices = async () => {
|
const glpiServices = async () => {
|
||||||
await syncTicketsToGlpi();
|
//await syncTicketsToGlpi();
|
||||||
|
await syncCommentsGlpi();
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|||||||
@ -265,6 +265,19 @@ class TicketGlpiModel {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Buscar followups (notas) de um ticket no GLPI
|
||||||
|
static async getFollowupsByItemId(itemId) {
|
||||||
|
try {
|
||||||
|
const query = 'SELECT content, date, date_creation, date_mod FROM glpi_itilfollowups WHERE items_id = ?';
|
||||||
|
const [rows] = await glpiPool.execute(query, [itemId]);
|
||||||
|
return rows;
|
||||||
|
} catch (error) {
|
||||||
|
logError(error, 'Erro ao buscar followups do ticket');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -182,6 +182,49 @@ class TicketSnModel {
|
|||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Buscar todos os tickets que estão na tabela de sincronização
|
||||||
|
static async getTicketsToSync() {
|
||||||
|
const query = 'SELECT id, glpi_ticket_id FROM ticket_sync ';
|
||||||
|
const { rows } = await pool.query(query);
|
||||||
|
return rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inserir um registro na tabela ticket_updates
|
||||||
|
static async insertTicketUpdate(updateData) {
|
||||||
|
const query = `
|
||||||
|
INSERT INTO ticket_updates (ticket_sync_id, update_type, source_system, content, author, created_at_source, sync_status, sync_date, created_at, updated_at, source_id)
|
||||||
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
|
||||||
|
RETURNING id;
|
||||||
|
`;
|
||||||
|
const values = [
|
||||||
|
updateData.ticket_sync_id,
|
||||||
|
'note',
|
||||||
|
'glpi',
|
||||||
|
updateData.content,
|
||||||
|
'Sothis',
|
||||||
|
updateData.created_at_source,
|
||||||
|
updateData.sync_status,
|
||||||
|
new Date(),
|
||||||
|
updateData.created_at,
|
||||||
|
updateData.updated_at,
|
||||||
|
updateData.source_id
|
||||||
|
];
|
||||||
|
try {
|
||||||
|
const { rows } = await pool.query(query, values);
|
||||||
|
return { success: true, newId: rows[0].id };
|
||||||
|
} catch (error) {
|
||||||
|
logError('Erro ao inserir ticket_update:', error);
|
||||||
|
return { success: false, error: error.message };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static async updateTicketSyncStatus(ticketSyncId, glpiStatus, snStatus) {
|
||||||
|
const query = 'UPDATE ticket_sync SET glpi_sync_status = $1, sn_sync_status = $2 WHERE id = $3';
|
||||||
|
await pool.query(query, [glpiStatus, snStatus, ticketSyncId]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -91,6 +91,7 @@ CREATE TABLE ticket_updates (
|
|||||||
sync_date TIMESTAMP, -- Data e hora da sincronização
|
sync_date TIMESTAMP, -- Data e hora da sincronização
|
||||||
created_at TIMESTAMP DEFAULT NOW(), -- Data e hora de criação do registro
|
created_at TIMESTAMP DEFAULT NOW(), -- Data e hora de criação do registro
|
||||||
updated_at TIMESTAMP DEFAULT NOW(), -- Data e hora da última atualização do registro
|
updated_at TIMESTAMP DEFAULT NOW(), -- Data e hora da última atualização do registro
|
||||||
|
source_id VARCHAR(64), -- ID da atualização no sistema de origem (ex: sys_id no ServiceNow)
|
||||||
|
|
||||||
-- Chaves estrangeiras
|
-- Chaves estrangeiras
|
||||||
CONSTRAINT fk_ticket_updates_sync
|
CONSTRAINT fk_ticket_updates_sync
|
||||||
@ -105,6 +106,8 @@ CREATE INDEX idx_ticket_updates_status ON ticket_updates(sync_status);
|
|||||||
CREATE INDEX idx_ticket_updates_source ON ticket_updates(source_system);
|
CREATE INDEX idx_ticket_updates_source ON ticket_updates(source_system);
|
||||||
CREATE INDEX idx_ticket_updates_type ON ticket_updates(update_type);
|
CREATE INDEX idx_ticket_updates_type ON ticket_updates(update_type);
|
||||||
CREATE INDEX idx_ticket_updates_created ON ticket_updates(created_at_source);
|
CREATE INDEX idx_ticket_updates_created ON ticket_updates(created_at_source);
|
||||||
|
CREATE INDEX idx_ticket_updates_source_id ON ticket_updates(source_id);
|
||||||
|
|
||||||
|
|
||||||
-- =============================================
|
-- =============================================
|
||||||
-- TABELA: location_mapping
|
-- TABELA: location_mapping
|
||||||
|
|||||||
30
src/services/glpiCommentService.js
Normal file
30
src/services/glpiCommentService.js
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// src/services/glpiCommentService.js
|
||||||
|
// src/services/glpiService.js
|
||||||
|
const TicketSnModel = require('../models/ticketSnModel');
|
||||||
|
const TicketGlpiModel = require('../models/ticketGlpiModel');
|
||||||
|
const TicketSyncModel = require('../models/ticketSyncModel');
|
||||||
|
const { logInfo, logError } = require('../utils/logger');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const syncCommentsGlpi = async () => {
|
||||||
|
try {
|
||||||
|
logInfo('🔄 Iniciando sincronização de comments do GLPI para o Service Now iniciada...');
|
||||||
|
// 1. Buscar tickets que foram criados com sucesso para sincronizar comentários
|
||||||
|
const effectiveTickets = await TicketSnModel.getTicketsToSync();
|
||||||
|
logInfo(`🔍 ${effectiveTickets.length} tickets encontrados para sincronização de comentários`, { step: 1 });
|
||||||
|
// 2. Para cada ticket, buscar comentários no GLPI e salvar no ServiceNow
|
||||||
|
for (const ticket of effectiveTickets) {
|
||||||
|
|
||||||
|
console.log(`Buscando comentários para o ticket GLPI ID: ${ticket.glpi_ticket_id}`);
|
||||||
|
const comments = await TicketGlpiModel.getFollowupsByItemId(ticket.glpi_ticket_id);
|
||||||
|
console.log(comments);
|
||||||
|
|
||||||
|
}
|
||||||
|
}catch (error) {
|
||||||
|
logError(error, 'GLPI Tickets');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
module.exports = {
|
||||||
|
syncCommentsGlpi
|
||||||
|
};
|
||||||
@ -1,3 +1,4 @@
|
|||||||
|
// src/services/servicenowService.js
|
||||||
const axios = require('axios');
|
const axios = require('axios');
|
||||||
const apiConfig = require('../../config/apiConfig');
|
const apiConfig = require('../../config/apiConfig');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user