skailan-conversations
Version:
Servicio de conversaciones y mensajería para Skailan
184 lines • 6.92 kB
JavaScript
import { StartConversation } from "../../app/use-cases/StartConversation";
import { GetConversationById } from "../../app/use-cases/GetConversationById";
import { ListConversations } from "../../app/use-cases/ListConversations";
import { UpdateConversation } from "../../app/use-cases/UpdateConversation";
import { DeleteConversation } from "../../app/use-cases/DeleteConversation";
import { ConversationPrismaRepository } from "../../infra/database/prisma/ConversationPrismaRepository";
import { ChannelPrismaRepository } from "../../infra/database/prisma/ChannelPrismaRepository";
export const startConversation = async (req, res) => {
try {
const { channelId, contactExternalId, contactName, contactEmail, contactPhone, } = req.body;
const organizationId = req.organization?.id;
if (!organizationId) {
return res
.status(400)
.json({ error: "Organization ID not found in request." });
}
if (!channelId) {
return res.status(400).json({ error: "Channel ID is required." });
}
if (!contactExternalId) {
return res
.status(400)
.json({ error: "Contact external ID is required." });
}
const prisma = req.tenantPrisma;
if (!prisma) {
return res
.status(500)
.json({ error: "Prisma client not initialized for tenant." });
}
const conversationRepository = new ConversationPrismaRepository(prisma);
const channelRepository = new ChannelPrismaRepository(prisma);
const startConversationUseCase = new StartConversation(conversationRepository, channelRepository);
const conversation = await startConversationUseCase.execute({
organizationId,
channelId,
contactExternalId,
contactName,
contactEmail,
contactPhone,
});
res.status(201).json(conversation);
}
catch (error) {
res
.status(500)
.json({ error: error.message || "Error starting conversation." });
}
};
export const getConversationById = async (req, res) => {
try {
const { id } = req.params;
if (!id) {
return res.status(400).json({ error: "ID is required." });
}
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 conversationRepository = new ConversationPrismaRepository(prisma);
const getConversationByIdUseCase = new GetConversationById(conversationRepository);
const conversation = await getConversationByIdUseCase.execute({
id: id,
organizationId,
});
if (!conversation) {
return res.status(404).json({ error: "Conversation not found." });
}
res.status(200).json(conversation);
}
catch (error) {
res
.status(500)
.json({ error: error.message || "Error retrieving conversation." });
}
};
export const listConversations = async (req, res) => {
try {
const organizationId = req.organization?.id;
const { channelId, contactId, status, assignedToUserId } = req.query;
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 conversationRepository = new ConversationPrismaRepository(prisma);
const listConversationsUseCase = new ListConversations(conversationRepository);
const conversations = await listConversationsUseCase.execute({
organizationId,
channelId,
contactId,
status,
assignedToUserId,
});
res.status(200).json(conversations);
}
catch (error) {
res
.status(500)
.json({ error: error.message || "Error listing conversations." });
}
};
export const updateConversation = async (req, res) => {
try {
const { id } = req.params;
if (!id) {
return res.status(400).json({ error: "ID is required." });
}
const { status, assignedToUserId } = req.body;
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 conversationRepository = new ConversationPrismaRepository(prisma);
const updateConversationUseCase = new UpdateConversation(conversationRepository);
const updatedConversation = await updateConversationUseCase.execute({
id: id,
organizationId,
status,
assignedToUserId,
});
res.status(200).json(updatedConversation);
}
catch (error) {
res
.status(500)
.json({ error: error.message || "Error updating conversation." });
}
};
export const deleteConversation = async (req, res) => {
try {
const { id } = req.params;
if (!id) {
return res.status(400).json({ error: "ID is required." });
}
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 conversationRepository = new ConversationPrismaRepository(prisma);
const deleteConversationUseCase = new DeleteConversation(conversationRepository);
await deleteConversationUseCase.execute({
id: id,
organizationId,
});
res.status(204).send();
}
catch (error) {
res
.status(500)
.json({ error: error.message || "Error deleting conversation." });
}
};
//# sourceMappingURL=conversationController.js.map