From bbc618d49616f87e9a3041c9caaadeb0ef611c05 Mon Sep 17 00:00:00 2001 From: Rafael Lopes Date: Tue, 23 Sep 2025 21:01:01 -0300 Subject: [PATCH] WIP: Trabalhando no envio dos comentarios para o banco de dados MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Dados de comentarios GLPI estão sendo coletados - Resta envio para banco de dados --- src/app.js | 4 +- src/controllers/glpiController.js | 6 ++- src/models/ticketGlpiModel.js | 13 ++++++ src/models/ticketSnModel.js | 43 +++++++++++++++++++ src/scripts/database/scriptBD.sql | 3 ++ src/services/databaseService.js | 0 src/services/glpiCommentService.js | 30 +++++++++++++ .../{glpiService.js => glpiTicketService.js} | 0 src/services/servicenowService.js | 1 + src/services/syncService.js | 0 10 files changed, 96 insertions(+), 4 deletions(-) delete mode 100644 src/services/databaseService.js create mode 100644 src/services/glpiCommentService.js rename src/services/{glpiService.js => glpiTicketService.js} (100%) delete mode 100644 src/services/syncService.js diff --git a/src/app.js b/src/app.js index bb7b453..21b0544 100644 --- a/src/app.js +++ b/src/app.js @@ -1,6 +1,6 @@ // src/app.js const { snServices } = require('./controllers/servicenowController'); -const { glpiServices } = require('./controllers/glpiController'); // NOVO +const { glpiServices } = require('./controllers/glpiController'); const { logInfo } = require('./utils/logger'); logInfo('Aplicação iniciada', { @@ -10,7 +10,7 @@ logInfo('Aplicação iniciada', { async function main() { try { - await snServices(); + //await snServices(); await glpiServices(); } catch (error) { diff --git a/src/controllers/glpiController.js b/src/controllers/glpiController.js index 546d0e5..7845e04 100644 --- a/src/controllers/glpiController.js +++ b/src/controllers/glpiController.js @@ -1,8 +1,10 @@ // src/controllers/glpiController.js -const { syncTicketsToGlpi } = require('../services/glpiService'); +const { syncTicketsToGlpi } = require('../services/glpiTicketService'); +const { syncCommentsGlpi } = require('../services/glpiCommentService'); const glpiServices = async () => { - await syncTicketsToGlpi(); + //await syncTicketsToGlpi(); + await syncCommentsGlpi(); } module.exports = { diff --git a/src/models/ticketGlpiModel.js b/src/models/ticketGlpiModel.js index 1f37001..6e204e4 100644 --- a/src/models/ticketGlpiModel.js +++ b/src/models/ticketGlpiModel.js @@ -265,6 +265,19 @@ class TicketGlpiModel { 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; + } + +} + } /** diff --git a/src/models/ticketSnModel.js b/src/models/ticketSnModel.js index 984204d..ef94628 100644 --- a/src/models/ticketSnModel.js +++ b/src/models/ticketSnModel.js @@ -182,6 +182,49 @@ class TicketSnModel { 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]); + } + + + } /** diff --git a/src/scripts/database/scriptBD.sql b/src/scripts/database/scriptBD.sql index ecddafa..18e7758 100644 --- a/src/scripts/database/scriptBD.sql +++ b/src/scripts/database/scriptBD.sql @@ -91,6 +91,7 @@ CREATE TABLE ticket_updates ( sync_date TIMESTAMP, -- Data e hora da sincronização 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 + source_id VARCHAR(64), -- ID da atualização no sistema de origem (ex: sys_id no ServiceNow) -- Chaves estrangeiras 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_type ON ticket_updates(update_type); 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 diff --git a/src/services/databaseService.js b/src/services/databaseService.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/services/glpiCommentService.js b/src/services/glpiCommentService.js new file mode 100644 index 0000000..1ac857f --- /dev/null +++ b/src/services/glpiCommentService.js @@ -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 +}; \ No newline at end of file diff --git a/src/services/glpiService.js b/src/services/glpiTicketService.js similarity index 100% rename from src/services/glpiService.js rename to src/services/glpiTicketService.js diff --git a/src/services/servicenowService.js b/src/services/servicenowService.js index d9ff417..3295cc0 100644 --- a/src/services/servicenowService.js +++ b/src/services/servicenowService.js @@ -1,3 +1,4 @@ +// src/services/servicenowService.js const axios = require('axios'); const apiConfig = require('../../config/apiConfig'); const fs = require('fs'); diff --git a/src/services/syncService.js b/src/services/syncService.js deleted file mode 100644 index e69de29..0000000