Files
scoreodonto.com/backend/dist/infra/temporal/activities.js
T

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 };
}