skailan-conversations
Version:
Servicio de conversaciones y mensajería para Skailan
152 lines • 7.69 kB
JavaScript
import { Message } from "../../../domain/entities/Message";
export class MessagePrismaRepository {
prisma;
constructor(prisma) {
this.prisma = prisma;
}
async findById(id, organizationId) {
const messageData = await this.prisma.message.findUnique({
where: { id },
});
if (!messageData) {
return null;
}
return new Message(messageData.id, messageData.organizationId, messageData.conversationId, messageData.senderType, messageData.senderId, messageData.type, messageData.content, messageData.mediaUrl, messageData.externalMessageId, messageData.status, messageData.timestamp, messageData.createdAt);
}
async findAll(organizationId, conversationId) {
const where = { organizationId };
if (conversationId) {
where.conversationId = conversationId;
}
const messagesData = await this.prisma.message.findMany({
where,
orderBy: { timestamp: "desc" },
});
return messagesData.map((messageData) => new Message(messageData.id, messageData.organizationId, messageData.conversationId, messageData.senderType, messageData.senderId, messageData.type, messageData.content, messageData.mediaUrl, messageData.externalMessageId, messageData.status, messageData.timestamp, messageData.createdAt));
}
async findByConversationId(conversationId, organizationId, limit, offset) {
const messagesData = await this.prisma.message.findMany({
where: { conversationId, organizationId },
orderBy: { timestamp: "desc" },
take: limit,
skip: offset,
});
return messagesData.map((messageData) => new Message(messageData.id, messageData.organizationId, messageData.conversationId, messageData.senderType, messageData.senderId, messageData.type, messageData.content, messageData.mediaUrl, messageData.externalMessageId, messageData.status, messageData.timestamp, messageData.createdAt));
}
async findByExternalMessageId(externalMessageId, organizationId) {
const messagesData = await this.prisma.message.findMany({
where: { externalMessageId, organizationId },
});
return messagesData.map((messageData) => new Message(messageData.id, messageData.organizationId, messageData.conversationId, messageData.senderType, messageData.senderId, messageData.type, messageData.content, messageData.mediaUrl, messageData.externalMessageId, messageData.status, messageData.timestamp, messageData.createdAt));
}
async countByConversationId(conversationId, organizationId) {
return await this.prisma.message.count({
where: { conversationId, organizationId },
});
}
async countByConversationIdAndStatus(conversationId, organizationId, status) {
return await this.prisma.message.count({
where: { conversationId, organizationId, status },
});
}
async countByConversationIdAndDate(conversationId, organizationId, date) {
const startOfDay = new Date(date);
startOfDay.setHours(0, 0, 0, 0);
const endOfDay = new Date(date);
endOfDay.setHours(23, 59, 59, 999);
return await this.prisma.message.count({
where: {
conversationId,
organizationId,
timestamp: {
gte: startOfDay,
lte: endOfDay,
},
},
});
}
async countUnreadByConversationId(conversationId, organizationId) {
return await this.prisma.message.count({
where: {
conversationId,
organizationId,
status: { not: "read" },
},
});
}
async countBySenderId(senderId, organizationId) {
return await this.prisma.message.count({
where: { senderId, organizationId },
});
}
async create(messageData) {
const savedMessage = await this.prisma.message.create({
data: messageData,
});
return new Message(savedMessage.id, savedMessage.organizationId, savedMessage.conversationId, savedMessage.senderType, savedMessage.senderId, savedMessage.type, savedMessage.content, savedMessage.mediaUrl, savedMessage.externalMessageId, savedMessage.status, savedMessage.timestamp, savedMessage.createdAt);
}
async update(id, updateData) {
const updatedMessage = await this.prisma.message.update({
where: { id },
data: updateData,
});
return new Message(updatedMessage.id, updatedMessage.organizationId, updatedMessage.conversationId, updatedMessage.senderType, updatedMessage.senderId, updatedMessage.type, updatedMessage.content, updatedMessage.mediaUrl, updatedMessage.externalMessageId, updatedMessage.status, updatedMessage.timestamp, updatedMessage.createdAt);
}
async save(message) {
const savedMessage = await this.prisma.message.create({
data: {
id: message.id,
organizationId: message.organizationId,
conversationId: message.conversationId,
senderType: message.senderType,
senderId: message.senderId,
type: message.type,
content: message.content,
mediaUrl: message.mediaUrl,
externalMessageId: message.externalMessageId,
status: message.status,
timestamp: message.timestamp,
createdAt: message.createdAt,
},
});
return new Message(savedMessage.id, savedMessage.organizationId, savedMessage.conversationId, savedMessage.senderType, savedMessage.senderId, savedMessage.type, savedMessage.content, savedMessage.mediaUrl, savedMessage.externalMessageId, savedMessage.status, savedMessage.timestamp, savedMessage.createdAt);
}
async saveOrUpdate(message) {
const savedMessage = await this.prisma.message.upsert({
where: { id: message.id },
update: {
organizationId: message.organizationId,
conversationId: message.conversationId,
senderType: message.senderType,
senderId: message.senderId,
type: message.type,
content: message.content,
mediaUrl: message.mediaUrl,
externalMessageId: message.externalMessageId,
status: message.status,
timestamp: message.timestamp,
},
create: {
id: message.id,
organizationId: message.organizationId,
conversationId: message.conversationId,
senderType: message.senderType,
senderId: message.senderId,
type: message.type,
content: message.content,
mediaUrl: message.mediaUrl,
externalMessageId: message.externalMessageId,
status: message.status,
timestamp: message.timestamp,
createdAt: message.createdAt,
},
});
return new Message(savedMessage.id, savedMessage.organizationId, savedMessage.conversationId, savedMessage.senderType, savedMessage.senderId, savedMessage.type, savedMessage.content, savedMessage.mediaUrl, savedMessage.externalMessageId, savedMessage.status, savedMessage.timestamp, savedMessage.createdAt);
}
async delete(id, organizationId) {
await this.prisma.message.delete({
where: { id },
});
}
}
//# sourceMappingURL=MessagePrismaRepository.js.map