192 lines
6.0 KiB
JavaScript
192 lines
6.0 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.MessageService = void 0;
|
|
const database_js_1 = require("../config/database.js");
|
|
class MessageService {
|
|
static async sendMessage(userId, data) {
|
|
try {
|
|
const message = await database_js_1.prisma.message.create({
|
|
data: {
|
|
content: data.content,
|
|
image: data.image,
|
|
userId,
|
|
roomId: data.roomId,
|
|
},
|
|
include: {
|
|
user: {
|
|
select: {
|
|
id: true,
|
|
username: true,
|
|
avatar: true,
|
|
},
|
|
},
|
|
reactions: {
|
|
include: {
|
|
user: {
|
|
select: {
|
|
id: true,
|
|
username: true,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|
|
return {
|
|
success: true,
|
|
data: message,
|
|
};
|
|
}
|
|
catch (error) {
|
|
console.error("Send message error:", error);
|
|
return {
|
|
success: false,
|
|
error: "Failed to send message",
|
|
};
|
|
}
|
|
}
|
|
static async reactToMessage(userId, data) {
|
|
try {
|
|
const existingReaction = await database_js_1.prisma.messageReaction.findUnique({
|
|
where: {
|
|
userId_messageId_type: {
|
|
userId,
|
|
messageId: data.messageId,
|
|
type: data.type,
|
|
},
|
|
},
|
|
});
|
|
if (existingReaction) {
|
|
await database_js_1.prisma.messageReaction.delete({
|
|
where: {
|
|
id: existingReaction.id,
|
|
},
|
|
});
|
|
}
|
|
else {
|
|
await database_js_1.prisma.messageReaction.create({
|
|
data: {
|
|
userId,
|
|
messageId: data.messageId,
|
|
type: data.type,
|
|
},
|
|
});
|
|
}
|
|
const message = await database_js_1.prisma.message.findUnique({
|
|
where: {
|
|
id: data.messageId,
|
|
},
|
|
include: {
|
|
reactions: {
|
|
include: {
|
|
user: {
|
|
select: {
|
|
id: true,
|
|
username: true,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|
|
return {
|
|
success: true,
|
|
data: {
|
|
messageId: data.messageId,
|
|
reactions: message?.reactions ?? [],
|
|
},
|
|
};
|
|
}
|
|
catch (error) {
|
|
console.error("React to message error:", error);
|
|
return {
|
|
success: false,
|
|
error: "Failed to react to message",
|
|
};
|
|
}
|
|
}
|
|
static async markMessagesAsSeen(userId, messageIds) {
|
|
try {
|
|
const seenEntries = messageIds.map((messageId) => ({
|
|
userId,
|
|
messageId,
|
|
}));
|
|
await database_js_1.prisma.messageSeen.createMany({
|
|
data: seenEntries,
|
|
skipDuplicates: true,
|
|
});
|
|
const messages = await database_js_1.prisma.message.findMany({
|
|
where: {
|
|
id: { in: messageIds },
|
|
},
|
|
include: {
|
|
seenBy: {
|
|
include: {
|
|
user: {
|
|
select: {
|
|
id: true,
|
|
username: true,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|
|
const seenData = messages.map((message) => ({
|
|
messageId: message.id,
|
|
seenBy: message.seenBy.map((seen) => seen.userId),
|
|
}));
|
|
return {
|
|
success: true,
|
|
data: seenData,
|
|
};
|
|
}
|
|
catch (error) {
|
|
console.error("Mark messages as seen error:", error);
|
|
return {
|
|
success: false,
|
|
error: "Failed to mark messages as seen",
|
|
};
|
|
}
|
|
}
|
|
static async deleteMessage(userId, messageId, roomId) {
|
|
try {
|
|
const message = await database_js_1.prisma.message.findFirst({
|
|
where: {
|
|
id: messageId,
|
|
userId: userId,
|
|
roomId: roomId,
|
|
},
|
|
});
|
|
if (!message) {
|
|
return {
|
|
success: false,
|
|
error: "Message not found or you don't have permission to delete it",
|
|
status: 403,
|
|
};
|
|
}
|
|
await database_js_1.prisma.message.delete({
|
|
where: {
|
|
id: messageId,
|
|
},
|
|
});
|
|
return {
|
|
success: true,
|
|
data: {
|
|
messageId,
|
|
roomId,
|
|
},
|
|
};
|
|
}
|
|
catch (error) {
|
|
console.error("Delete message error:", error);
|
|
return {
|
|
success: false,
|
|
error: "Failed to delete message",
|
|
status: 500,
|
|
};
|
|
}
|
|
}
|
|
}
|
|
exports.MessageService = MessageService;
|