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