hubxglpi/src/infra/db/repositories/hubglpi/sync.repository.js

160 lines
3.5 KiB
JavaScript

// src/infra/db/repositories/hubglpi/sync.repository.js
const db = require('../../connections/hubglpi.pg.js');
const { logError } = require('../../../../shared/utils/logger');
/**
* Insere registros em sync_data para tickets novos vindos do HubSoft
* @param {number[]} hubsoftIds
*/
async function insertSyncData(hubsoftIds) {
if (!hubsoftIds?.length) return [];
const query = `
INSERT INTO sync_data (hubsoft_ticket_id, status_sync)
SELECT id, 'pending_create'
FROM unnest($1::bigint[]) id
ON CONFLICT (hubsoft_ticket_id) DO NOTHING
RETURNING id, hubsoft_ticket_id;
`;
try {
const { rows } = await db.query(query, [hubsoftIds]);
return rows;
} catch (err) {
logError('Erro ao inserir sync_data', err);
throw err;
}
}
/**
* Atualiza sync_data após criação do ticket no GLPI
* @param {number, number[]} hubsoftid, glpiID
*/
async function updateSyncDataCreated(hubsoftId, glpiId) {
const query = `
UPDATE sync_data
SET glpi_ticket_id = $2,
status_sync = 'created',
updated_at = NOW()
WHERE hubsoft_ticket_id = $1
RETURNING *;
`;
try {
const { rows } = await db.query(query, [hubsoftId, glpiId]);
return rows[0] || null;
} catch (err) {
logError('Erro ao atualizar sync_data para created', err);
throw err;
}
}
/**
* Busca sync_data pelo id do HubSoft
*/
async function getSyncIdByHubsoftId(hubsoftTicketId) {
const query = `
SELECT
id,
glpi_ticket_id,
status_sync
FROM sync_data
WHERE hubsoft_ticket_id = $1;
`;
try {
const { rows } = await db.query(query, [hubsoftTicketId]);
return rows.length ? rows[0] : null;
} catch (err) {
logError(
`Erro ao buscar sync_data para hubsoft_ticket_id=${hubsoftTicketId}`,
err
);
throw err;
}
}
async function lockTicketForClosing(syncId) {
const query = `
UPDATE sync_data
SET status_sync = 'processing_close',
updated_at = NOW()
WHERE id = $1
AND status_sync NOT IN ('processing_close', 'closed')
RETURNING *;
`;
try {
const { rows } = await db.query(query, [syncId]);
return rows[0] || null;
} catch (err) {
logError(`Erro ao travar ticket para fechamento (${syncId})`, err);
throw err;
}
}
async function updateSyncDataError(syncErrorMessage, syncId) {
const query = `
UPDATE sync_data
SET sync_error_message = $1,
status_sync = 'sync_error',
last_sync_attempt = NOW()
WHERE id = $2
RETURNING *;
`;
try {
const { rows } = await db.query(query, [syncErrorMessage, syncId]);
return rows[0];
} catch (err) {
logError('Erro ao atualizar erro de sync_data', err);
throw err;
}
}
/**
* Coleta info de sync a partir do GLPI ID
* @param {number[]} glpiTicketId
*/
async function getByGlpiId(glpiTicketId) {
const query = `
SELECT
id,
glpi_ticket_id,
hubsoft_ticket_id,
status_sync
FROM sync_data
WHERE glpi_ticket_id = $1
LIMIT 1;
`
const { rows } = await db.query(query, [glpiTicketId])
return rows[0] || null
}
async function markAsClosed(syncId) {
const query = `
UPDATE sync_data
SET
status_sync = 'closed',
updated_at = NOW()
WHERE id = $1
RETURNING hubsoft_ticket_id;
`
const { rows } = await db.query(query, [syncId])
return rows[0]?.hubsoft_ticket_id
}
module.exports = {
insertSyncData,
updateSyncDataCreated,
getSyncIdByHubsoftId,
lockTicketForClosing,
updateSyncDataError,
getByGlpiId,
markAsClosed
};