65 lines
3.0 KiB
JavaScript
65 lines
3.0 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.liberarSlotAgenda = liberarSlotAgenda;
|
|
exports.notificarConflito = notificarConflito;
|
|
exports.decrementarScore = decrementarScore;
|
|
exports.bloquearAgendamentosAutomaticos = bloquearAgendamentosAutomaticos;
|
|
exports.buscarScoreContato = buscarScoreContato;
|
|
/**
|
|
* Temporal Activities — operações com efeitos colaterais (banco, APIs, I/O).
|
|
* Activities são executadas pelo Worker e podem ser re-tentadas automaticamente.
|
|
*/
|
|
const prisma_1 = require("../database/prisma");
|
|
const logger_1 = require("../../config/logger");
|
|
// ─── Conflito de Agenda: liberar slot após timeout ────────────────────────────
|
|
async function liberarSlotAgenda(input) {
|
|
logger_1.logger.info(input, '[Temporal] Slot liberado por timeout — notificando solicitante');
|
|
// Aqui você envia mensagem via WhatsApp avisando o solicitante
|
|
// Implementação real acoplada ao WhatsAppConnectionManager via NATS
|
|
// Por ora, marca no banco como disponível
|
|
await prisma_1.prisma.protocol.updateMany({
|
|
where: {
|
|
contactId: input.solicitanteId,
|
|
status: 'WAITING_CLIENT',
|
|
},
|
|
data: { status: 'OPEN' },
|
|
});
|
|
}
|
|
async function notificarConflito(input) {
|
|
logger_1.logger.info(input, '[Temporal] Notificando pessoa B sobre solicitação de slot');
|
|
// Dispara mensagem via NATS → WhatsApp handler
|
|
}
|
|
// ─── Gestão de Reputação ──────────────────────────────────────────────────────
|
|
async function decrementarScore(input) {
|
|
const contact = await prisma_1.prisma.contact.findUnique({
|
|
where: { id: input.contactId },
|
|
});
|
|
if (!contact)
|
|
throw new Error(`Contato ${input.contactId} não encontrado`);
|
|
const novoScore = Math.max(0, contact.scoreReputacao - input.pontos);
|
|
const restrito = novoScore <= 20;
|
|
await prisma_1.prisma.contact.update({
|
|
where: { id: input.contactId },
|
|
data: {
|
|
scoreReputacao: novoScore,
|
|
flagRestricao: restrito,
|
|
},
|
|
});
|
|
logger_1.logger.info({ contactId: input.contactId, novoScore, restrito, motivo: input.motivo }, '[Temporal] Score de reputação atualizado');
|
|
return { novoScore, restrito };
|
|
}
|
|
async function bloquearAgendamentosAutomaticos(input) {
|
|
await prisma_1.prisma.contact.update({
|
|
where: { id: input.contactId },
|
|
data: { flagRestricao: true },
|
|
});
|
|
logger_1.logger.warn({ contactId: input.contactId }, '[Temporal] Contato marcado como RESTRITO — agendamentos automáticos bloqueados');
|
|
}
|
|
async function buscarScoreContato(contactId) {
|
|
const c = await prisma_1.prisma.contact.findUnique({
|
|
where: { id: contactId },
|
|
select: { scoreReputacao: true, flagRestricao: true },
|
|
});
|
|
return { score: c?.scoreReputacao ?? 100, restrito: c?.flagRestricao ?? false };
|
|
}
|