skailan-crm
Version:
Servicio de CRM y gestión de ventas para Skailan
120 lines • 5.39 kB
JavaScript
import { Contact } from "@skailan/contacts/dist/domain/entities/Contact";
export class ContactIntegrationServiceImpl {
contactsServiceUrl;
constructor(contactsServiceUrl = process.env.CONTACTS_SERVICE_URL ||
"http://localhost:3009") {
this.contactsServiceUrl = contactsServiceUrl;
}
async syncLeadWithContact(lead) {
try {
// Buscar si ya existe un contacto con el mismo email
const existingContact = await this.findContactByLeadEmail(lead.email, lead.organizationId);
if (existingContact) {
// Actualizar contacto existente con información del lead
const updatedContact = this.updateContactFromLead(existingContact, lead);
return await this.updateContact(updatedContact);
}
else {
// Crear nuevo contacto
const newContact = this.convertLeadToContact(lead);
return await this.createContact(newContact);
}
}
catch (error) {
console.error("Error syncing lead with contact:", error);
throw new Error(`Failed to sync lead with contact: ${error}`);
}
}
async findContactByLeadEmail(email, organizationId) {
try {
const response = await fetch(`${this.contactsServiceUrl}/contacts/search?email=${email}&organizationId=${organizationId}`, {
method: "GET",
headers: {
"Content-Type": "application/json",
"x-tenant-id": organizationId,
},
});
if (response.ok) {
const contactData = (await response.json());
return contactData
? new Contact(contactData.id, contactData.organizationId, contactData.externalId, contactData.name, contactData.email, contactData.phone, contactData.profilePictureUrl, contactData.metadata, new Date(contactData.createdAt), new Date(contactData.updatedAt))
: null;
}
return null;
}
catch (error) {
console.error("Error finding contact by email:", error);
return null;
}
}
convertLeadToContact(lead) {
return new Contact(lead.id, // Usar el mismo ID para mantener consistencia
lead.organizationId, lead.email || lead.phone || lead.id, // externalId
lead.name, lead.email, lead.phone, null, // profilePictureUrl
{
source: lead.source,
company: lead.company,
title: lead.title,
industry: lead.industry,
score: lead.score,
status: lead.status,
notes: lead.notes,
leadId: lead.id,
}, // metadata
lead.createdAt, lead.updatedAt);
}
updateLeadFromContact(lead, contact) {
// Actualizar información del lead con datos del contacto
lead.updateContactInfo(contact.email, contact.phone);
// Actualizar metadata si es necesario
if (contact.metadata) {
lead.enrichData(contact.metadata.company || null, contact.metadata.title || null, contact.metadata.industry || null);
}
return lead;
}
updateContactFromLead(contact, lead) {
contact.updateInfo(lead.name, lead.email, lead.phone, contact.profilePictureUrl, {
...contact.metadata,
source: lead.source,
company: lead.company,
title: lead.title,
industry: lead.industry,
score: lead.score,
status: lead.status,
notes: lead.notes,
leadId: lead.id,
});
return contact;
}
async createContact(contact) {
const response = await fetch(`${this.contactsServiceUrl}/contacts`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-tenant-id": contact.organizationId,
},
body: JSON.stringify(contact.toJSON()),
});
if (!response.ok) {
throw new Error(`Failed to create contact: ${response.statusText}`);
}
const contactData = (await response.json());
return new Contact(contactData.id, contactData.organizationId, contactData.externalId, contactData.name, contactData.email, contactData.phone, contactData.profilePictureUrl, contactData.metadata, new Date(contactData.createdAt), new Date(contactData.updatedAt));
}
async updateContact(contact) {
const response = await fetch(`${this.contactsServiceUrl}/contacts/${contact.id}`, {
method: "PUT",
headers: {
"Content-Type": "application/json",
"x-tenant-id": contact.organizationId,
},
body: JSON.stringify(contact.toJSON()),
});
if (!response.ok) {
throw new Error(`Failed to update contact: ${response.statusText}`);
}
const contactData = (await response.json());
return new Contact(contactData.id, contactData.organizationId, contactData.externalId, contactData.name, contactData.email, contactData.phone, contactData.profilePictureUrl, contactData.metadata, new Date(contactData.createdAt), new Date(contactData.updatedAt));
}
}
//# sourceMappingURL=ContactIntegrationService.js.map