hubxglpi/src/modules/watchdog/job/job.js

58 lines
2.1 KiB
JavaScript
Raw Normal View History

// src/modules/watchdog/job/job.js
const logger = require('../../../shared/utils/logger')
const repository = require('../repository/watchdog.repository.js')
const model = require('../model/email.model.js')
async function runWatchdog() {
logger.info('[WATCHDOG] [JOB] Coletando chamados fechados há 31 minutos')
const thresholdDate = new Date(Date.now() - 31 * 60 * 1000)
const closedTickets = await repository.getClosedTicketsSince(thresholdDate)
logger.info(`[WATCHDOG] [JOB] Encontrados ${closedTickets.length} chamados fechados`)
for (const ticket of closedTickets) {
const hubGlpiTicket = await repository.checkTicketInHubGlpi(ticket.id_atendimento)
if (!hubGlpiTicket.exists) {
logger.info(`[WATCHDOG] [JOB] Chamado ${ticket.id_atendimento} não encontrado no HubGlpi. Ignorando.`)
continue
}
if (hubGlpiTicket.status === 'closed') {
logger.info(`[WATCHDOG] [JOB] Chamado ${ticket.id_atendimento} já está fechado no HubGlpi. Ignorando.`)
continue
}
if (await repository.notificationAlreadySent(ticket.id_atendimento)) {
logger.info(`[WATCHDOG] [JOB] Notificação já enviada para o chamado ${ticket.id_atendimento}.`)
continue
}
await repository.insertAsPending(ticket.id_atendimento)
}
const ticketsToNotify = await repository.getPendingTicketsForNotification()
logger.info(`[WATCHDOG] [JOB] ${ticketsToNotify.length} chamados pendentes para notificação.`)
const payload = await model.prepareNotificationPayload(ticketsToNotify)
if (!payload.length) {
logger.info('[WATCHDOG] [JOB] Nenhuma notificação para enviar')
return
}
try {
await repository.sendClosureNotifications(payload)
await repository.markNotificationsAsSent(ticketsToNotify)
} catch (err) {
logger.error('[WATCHDOG] Erro ao enviar notificações', err)
await repository.markNotificationsAsFailed(ticketsToNotify)
}
logger.info(`[WATCHDOG] [JOB] Enviadas ${payload.length} notificações`)
}
module.exports = { runWatchdog}