93 lines
2.9 KiB
JavaScript
93 lines
2.9 KiB
JavaScript
|
|
//src/modules/tickes/useCases/syncTickets.usecase.js
|
||
|
|
|
||
|
|
const notifyTicketCreated = require('../services/ticketNotifications.service.js')
|
||
|
|
const repository = require ('../repositories/ticket.repository.js')
|
||
|
|
const mundialeService = require('../services/mundiale.service.js')
|
||
|
|
const implantacaoService = require('../services/implantacao.service.js')
|
||
|
|
const cancelamentoService = require('../services/cancelamento.service.js')
|
||
|
|
//const sacService = require('../services/sac.service.js') //TODO
|
||
|
|
|
||
|
|
const getAuthToken = require('../../../infra/api/hubsoft.auth.js')
|
||
|
|
|
||
|
|
|
||
|
|
const ticketShared = require('../services/createTickets.service.js')
|
||
|
|
const { logInfo, logError } = require('../../../shared/utils/logger.js')
|
||
|
|
|
||
|
|
async function syncTicketsUseCase() {
|
||
|
|
|
||
|
|
|
||
|
|
logInfo('[USECASE] Buscando novos tickets no Hubsoft')
|
||
|
|
|
||
|
|
const waterMark = await repository.getWaterMark()
|
||
|
|
logInfo(`Buscando Tickets novos desde de: ${waterMark}`)
|
||
|
|
|
||
|
|
const mundiale = await mundialeService.fetchNew(waterMark)
|
||
|
|
logInfo(`[USECASE] ${mundiale.length} tickets Mundiale encontrados`)
|
||
|
|
|
||
|
|
const implantacao = await implantacaoService.fetchNew(waterMark)
|
||
|
|
logInfo(`[USECASE] ${implantacao.length} tickets Implantação encontrados`)
|
||
|
|
|
||
|
|
const cancelamento = await cancelamentoService.fetchNew(waterMark)
|
||
|
|
logInfo(`[USECASE] ${cancelamento.length} tickets Cancelamento encontrados`)
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
await mundialeService.saveHubGlpi(mundiale)
|
||
|
|
await implantacaoService.saveHubGlpi(implantacao)
|
||
|
|
await cancelamentoService.saveHubGlpi(cancelamento)
|
||
|
|
|
||
|
|
const allFetchedTickets = [
|
||
|
|
...mundiale,
|
||
|
|
...implantacao,
|
||
|
|
...cancelamento
|
||
|
|
]
|
||
|
|
|
||
|
|
const newWaterMark = resolveNewWatermark(allFetchedTickets, waterMark)
|
||
|
|
|
||
|
|
if (newWaterMark !== waterMark) {
|
||
|
|
await repository.updateWaterMark(newWaterMark)
|
||
|
|
logInfo(`[USECASE] Watermark atualizada para: ${newWaterMark}`)
|
||
|
|
}
|
||
|
|
|
||
|
|
const pendentes = await ticketShared.fetchPendingTickets()
|
||
|
|
logInfo(`[USECASE] ${pendentes.length} tickets pendentes para envio ao GLPI`)
|
||
|
|
|
||
|
|
for (const ticket of pendentes) {
|
||
|
|
try {
|
||
|
|
const service = resolveTicketService(ticket.ticket_type)
|
||
|
|
if (!service) continue
|
||
|
|
|
||
|
|
const glpiId = await service.sendToGlpi(ticket)
|
||
|
|
await notifyTicketCreated.notifyTicketCreated(ticket.id_atendimento, glpiId)
|
||
|
|
} catch (err) {
|
||
|
|
logError(err, `[USECASE] Falha ao processar ticket ${ticket.id_atendimento}`)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function resolveTicketService(type) {
|
||
|
|
const map = {
|
||
|
|
MUNDIALE: mundialeService,
|
||
|
|
IMPLANTACAO: implantacaoService,
|
||
|
|
CANCELAMENTO: cancelamentoService,
|
||
|
|
//SAC: sacService, //TODO
|
||
|
|
//TITULARIDADE: trocaTitularidadeService //TODO
|
||
|
|
}
|
||
|
|
|
||
|
|
return map[type]
|
||
|
|
}
|
||
|
|
function resolveNewWatermark(tickets, currentWatermark) {
|
||
|
|
if (!tickets?.length) return currentWatermark
|
||
|
|
|
||
|
|
return tickets.reduce((max, ticket) => {
|
||
|
|
if (!ticket.created_at) return max
|
||
|
|
return ticket.created_at > max ? ticket.created_at : max
|
||
|
|
}, currentWatermark)
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
module.exports = { syncTicketsUseCase }
|