skailan-contacts
Version:
Servicio de gestión de contactos para Skailan
175 lines • 7.13 kB
JavaScript
import { CreateContact } from '../../app/use-cases/CreateContact';
import { GetContactById } from '../../app/use-cases/GetContactById';
import { ListContacts } from '../../app/use-cases/ListContacts';
import { UpdateContact } from '../../app/use-cases/UpdateContact';
import { DeleteContact } from '../../app/use-cases/DeleteContact';
import { ContactPrismaRepository } from '../../infra/database/prisma/ContactPrismaRepository';
export const createContact = async (req, res) => {
try {
const { externalId, name, email, phone, profilePictureUrl, metadata } = req.body;
const organizationId = req.organization?.id;
if (!organizationId) {
return res.status(400).json({ error: 'Organization ID not found in request.' });
}
if (!externalId) {
return res.status(400).json({ error: 'External ID is required.' });
}
const prisma = req.tenantPrisma;
if (!prisma) {
return res.status(500).json({ error: 'Prisma client not initialized for tenant.' });
}
const contactRepository = new ContactPrismaRepository(prisma);
const createContactUseCase = new CreateContact(contactRepository);
const newContact = await createContactUseCase.execute({
organizationId,
externalId,
name,
email,
phone,
profilePictureUrl,
metadata,
});
res.status(201).json(newContact.toJSON());
}
catch (error) {
const statusCode = error.message.includes('already exists') ? 409 : 500;
res.status(statusCode).json({ error: error.message || 'Error creating contact.' });
}
};
export const getContactById = async (req, res) => {
try {
const { id } = req.params;
const organizationId = req.organization?.id;
if (!organizationId) {
return res.status(400).json({ error: 'Organization ID not found in request.' });
}
if (!id) {
return res.status(400).json({ error: 'Contact ID is required.' });
}
const prisma = req.tenantPrisma;
if (!prisma) {
return res.status(500).json({ error: 'Prisma client not initialized for tenant.' });
}
const contactRepository = new ContactPrismaRepository(prisma);
const getContactByIdUseCase = new GetContactById(contactRepository);
const contact = await getContactByIdUseCase.execute({
id,
organizationId,
});
if (!contact) {
return res.status(404).json({ error: 'Contact not found.' });
}
res.status(200).json(contact.toJSON());
}
catch (error) {
res.status(500).json({ error: error.message || 'Error retrieving contact.' });
}
};
export const listContacts = async (req, res) => {
try {
const organizationId = req.organization?.id;
if (!organizationId) {
return res.status(400).json({ error: 'Organization ID not found in request.' });
}
const prisma = req.tenantPrisma;
if (!prisma) {
return res.status(500).json({ error: 'Prisma client not initialized for tenant.' });
}
const contactRepository = new ContactPrismaRepository(prisma);
const listContactsUseCase = new ListContacts(contactRepository);
const contacts = await listContactsUseCase.execute({
organizationId,
});
res.status(200).json(contacts.map(contact => contact.toJSON()));
}
catch (error) {
res.status(500).json({ error: error.message || 'Error listing contacts.' });
}
};
export const updateContact = async (req, res) => {
try {
const { id } = req.params;
const { name, email, phone, profilePictureUrl, metadata } = req.body;
const organizationId = req.organization?.id;
if (!organizationId) {
return res.status(400).json({ error: 'Organization ID not found in request.' });
}
if (!id) {
return res.status(400).json({ error: 'Contact ID is required.' });
}
const prisma = req.tenantPrisma;
if (!prisma) {
return res.status(500).json({ error: 'Prisma client not initialized for tenant.' });
}
const contactRepository = new ContactPrismaRepository(prisma);
const updateContactUseCase = new UpdateContact(contactRepository);
const updatedContact = await updateContactUseCase.execute({
id,
organizationId,
name,
email,
phone,
profilePictureUrl,
metadata,
});
res.status(200).json(updatedContact.toJSON());
}
catch (error) {
const statusCode = error.message.includes('not found') ? 404 :
error.message.includes('already exists') ? 409 : 500;
res.status(statusCode).json({ error: error.message || 'Error updating contact.' });
}
};
export const deleteContact = async (req, res) => {
try {
const { id } = req.params;
const organizationId = req.organization?.id;
if (!organizationId) {
return res.status(400).json({ error: 'Organization ID not found in request.' });
}
if (!id) {
return res.status(400).json({ error: 'Contact ID is required.' });
}
const prisma = req.tenantPrisma;
if (!prisma) {
return res.status(500).json({ error: 'Prisma client not initialized for tenant.' });
}
const contactRepository = new ContactPrismaRepository(prisma);
const deleteContactUseCase = new DeleteContact(contactRepository);
await deleteContactUseCase.execute({
id,
organizationId,
});
res.status(204).send();
}
catch (error) {
const statusCode = error.message.includes('not found') ? 404 : 500;
res.status(statusCode).json({ error: error.message || 'Error deleting contact.' });
}
};
export const searchContactByEmail = async (req, res) => {
try {
const { email } = req.query;
const organizationId = req.organization?.id;
if (!organizationId) {
return res.status(400).json({ error: 'Organization ID not found in request.' });
}
if (!email || typeof email !== 'string') {
return res.status(400).json({ error: 'Email parameter is required.' });
}
const prisma = req.tenantPrisma;
if (!prisma) {
return res.status(500).json({ error: 'Prisma client not initialized for tenant.' });
}
const contactRepository = new ContactPrismaRepository(prisma);
const contact = await contactRepository.findByEmail(email, organizationId);
if (!contact) {
return res.status(404).json({ error: 'Contact not found.' });
}
res.status(200).json(contact.toJSON());
}
catch (error) {
res.status(500).json({ error: error.message || 'Error searching contact.' });
}
};
//# sourceMappingURL=contactController.js.map