skailan-contacts
Version:
Servicio de gestión de contactos para Skailan
73 lines • 3.65 kB
JavaScript
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