UNPKG

skailan-contacts

Version:

Servicio de gestión de contactos para Skailan

73 lines 3.65 kB
import { Contact } from "../../domain/entities/Contact"; import { ContactCommunicationPlatform } from "../../domain/entities/ContactCommunicationPlatform"; import { v4 as uuidv4 } from "uuid"; export class CreateContactFromConversation { contactRepository; platformRepository; constructor(contactRepository, platformRepository) { this.contactRepository = contactRepository; this.platformRepository = platformRepository; } async execute(request) { const { organizationId, externalId, name, platform, platformUserId, platformUsername, contactEmail, contactPhone, metadata, } = request; // Validar plataformas soportadas const validPlatforms = [ "whatsapp", "telegram", "email", "sms", "facebook", "instagram", ]; if (!validPlatforms.includes(platform)) { throw new Error(`Invalid platform: ${platform}. Valid platforms are: ${validPlatforms.join(", ")}`); } // Verificar si ya existe un contacto con el mismo externalId const existingContact = await this.contactRepository.findByExternalId(externalId, organizationId); if (existingContact) { // Si existe, actualizar con la nueva información de plataforma return await this.updateExistingContactWithPlatform(existingContact, platform, platformUserId || null, platformUsername || null); } // Crear nuevo contacto desde conversación const contactId = uuidv4(); const contact = Contact.createFromConversation(contactId, organizationId, externalId, name || null, platform, platformUserId || null, platformUsername || null); // Actualizar con información adicional si está disponible if (contactEmail || contactPhone) { contact.updateInfo(contact.name, contactEmail || contact.email, contactPhone || contact.phone, contact.profilePictureUrl, { ...contact.metadata, ...metadata, contactEmail, contactPhone, }); } // Guardar el contacto const savedContact = await this.contactRepository.save(contact); // Guardar la plataforma de comunicación const communicationPlatform = contact.getPrimaryPlatform(); if (communicationPlatform) { await this.platformRepository.save(communicationPlatform); } return savedContact; } async updateExistingContactWithPlatform(contact, platform, platformUserId, platformUsername) { // Verificar si ya tiene esta plataforma const existingPlatform = contact.getPlatformByType(platform); if (existingPlatform) { // Actualizar la plataforma existente existingPlatform.updatePlatformInfo(platformUserId, platformUsername, true, // isActive existingPlatform.isPrimary, existingPlatform.config); await this.platformRepository.save(existingPlatform); } else { // Agregar nueva plataforma const newPlatform = new ContactCommunicationPlatform(uuidv4(), contact.id, contact.organizationId, platform, platformUserId, platformUsername, true, // isActive false, // isPrimary (no cambiar la primaria existente) null, // config new Date(), new Date()); contact.addCommunicationPlatform(newPlatform); await this.platformRepository.save(newPlatform); } return await this.contactRepository.save(contact); } } //# sourceMappingURL=CreateContactFromConversation.js.map