chat-app/backend/dist/services/chatService.js
Gal Podlipnik 365aea2997
Some checks failed
Build and Deploy / build-and-deploy (push) Failing after 58s
cicd 3
2025-06-12 16:22:33 +02:00

491 lines
16 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ChatService = void 0;
const database_js_1 = require("../config/database.js");
class ChatService {
static async getChatRooms(userId) {
try {
const chatRooms = await database_js_1.prisma.chatRoom.findMany({
where: {
members: {
some: {
userId,
},
},
},
include: {
members: {
include: {
user: {
select: {
id: true,
username: true,
isOnline: true,
lastSeen: true,
avatar: true,
},
},
},
},
_count: {
select: {
messages: true,
},
},
},
orderBy: {
updatedAt: "desc",
},
});
return {
success: true,
data: chatRooms,
};
}
catch (error) {
console.error("Get chat rooms error:", error);
return {
success: false,
error: "Failed to retrieve chat rooms",
};
}
}
static async createChatRoom(userId, data) {
try {
const chatRoom = await database_js_1.prisma.chatRoom.create({
data: {
name: data.name,
description: data.description,
createdBy: userId,
members: {
create: [
{
userId,
role: "admin",
},
],
},
},
});
if (data.memberUsernames.length > 0) {
const users = await database_js_1.prisma.user.findMany({
where: {
username: {
in: data.memberUsernames,
},
},
});
const memberData = users.map((user) => ({
userId: user.id,
roomId: chatRoom.id,
}));
await database_js_1.prisma.chatRoomMember.createMany({
data: memberData,
skipDuplicates: true,
});
}
const fullChatRoom = await database_js_1.prisma.chatRoom.findUnique({
where: { id: chatRoom.id },
include: {
members: {
include: {
user: {
select: {
id: true,
username: true,
isOnline: true,
avatar: true,
},
},
},
},
_count: {
select: {
messages: true,
},
},
},
});
return {
success: true,
data: fullChatRoom,
};
}
catch (error) {
console.error("Create chat room error:", error);
return {
success: false,
error: "Failed to create chat room",
};
}
}
static async getMessages(query) {
try {
const page = Number.parseInt(query.page ?? "1");
const limit = Number.parseInt(query.limit ?? "50");
const skip = (page - 1) * limit;
const messages = await database_js_1.prisma.message.findMany({
where: {
roomId: query.roomId,
},
include: {
user: {
select: {
id: true,
username: true,
avatar: true,
},
},
reactions: {
include: {
user: {
select: {
id: true,
username: true,
},
},
},
},
seenBy: {
select: {
userId: true,
},
},
},
orderBy: {
createdAt: "desc",
},
take: limit,
skip,
});
const formattedMessages = messages.map((message) => ({
...message,
seenBy: message.seenBy.map((seen) => seen.userId),
}));
return {
success: true,
data: formattedMessages.reverse(),
};
}
catch (error) {
console.error("Get messages error:", error);
return {
success: false,
error: "Failed to retrieve messages",
};
}
}
static async checkRoomMembership(userId, roomId) {
try {
const membership = await database_js_1.prisma.chatRoomMember.findUnique({
where: {
userId_roomId: {
userId,
roomId,
},
},
});
return !!membership;
}
catch (error) {
console.error("Check room membership error:", error);
return false;
}
}
static async updateChatRoom(userId, roomId, data) {
try {
const membership = await database_js_1.prisma.chatRoomMember.findUnique({
where: {
userId_roomId: {
userId,
roomId,
},
},
});
if (!membership) {
return {
success: false,
error: "You are not a member of this chat room",
status: 403,
};
}
if (membership.role !== "admin") {
return {
success: false,
error: "Only admins can update chat room settings",
status: 403,
};
}
const updatedRoom = await database_js_1.prisma.chatRoom.update({
where: { id: roomId },
data: {
name: data.name,
description: data.description,
updatedAt: new Date(),
},
include: {
members: {
include: {
user: {
select: {
id: true,
username: true,
isOnline: true,
lastSeen: true,
avatar: true,
},
},
},
},
_count: {
select: {
messages: true,
},
},
},
});
return {
success: true,
data: updatedRoom,
};
}
catch (error) {
console.error("Update chat room error:", error);
return {
success: false,
error: "Failed to update chat room",
status: 500,
};
}
}
static async deleteChatRoom(userId, roomId) {
try {
const membership = await database_js_1.prisma.chatRoomMember.findUnique({
where: {
userId_roomId: {
userId,
roomId,
},
},
});
if (!membership) {
return {
success: false,
error: "You are not a member of this chat room",
status: 403,
};
}
if (membership.role !== "admin") {
return {
success: false,
error: "Only admins can delete chat rooms",
status: 403,
};
}
await database_js_1.prisma.chatRoom.delete({
where: { id: roomId },
});
return {
success: true,
data: { id: roomId },
};
}
catch (error) {
console.error("Delete chat room error:", error);
return {
success: false,
error: "Failed to delete chat room",
status: 500,
};
}
}
static async addChatRoomMember(userId, roomId, data) {
try {
const membership = await database_js_1.prisma.chatRoomMember.findUnique({
where: {
userId_roomId: {
userId,
roomId,
},
},
});
if (!membership) {
return {
success: false,
error: "You are not a member of this chat room",
status: 403,
};
}
if (membership.role !== "admin") {
return {
success: false,
error: "Only admins can add members",
status: 403,
};
}
const user = await database_js_1.prisma.user.findUnique({
where: { username: data.username },
});
if (!user) {
return {
success: false,
error: "User not found",
status: 404,
};
}
const existingMembership = await database_js_1.prisma.chatRoomMember.findUnique({
where: {
userId_roomId: {
userId: user.id,
roomId,
},
},
});
if (existingMembership) {
return {
success: false,
error: "User is already a member of this chat room",
status: 409,
};
}
await database_js_1.prisma.chatRoomMember.create({
data: {
userId: user.id,
roomId,
role: "member",
},
});
const updatedRoom = await database_js_1.prisma.chatRoom.findUnique({
where: { id: roomId },
include: {
members: {
include: {
user: {
select: {
id: true,
username: true,
isOnline: true,
lastSeen: true,
avatar: true,
},
},
},
},
_count: {
select: {
messages: true,
},
},
},
});
return {
success: true,
data: updatedRoom,
};
}
catch (error) {
console.error("Add chat room member error:", error);
return {
success: false,
error: "Failed to add member to chat room",
status: 500,
};
}
}
static async removeChatRoomMember(userId, roomId, data) {
try {
const membership = await database_js_1.prisma.chatRoomMember.findUnique({
where: {
userId_roomId: {
userId,
roomId,
},
},
});
if (!membership) {
return {
success: false,
error: "You are not a member of this chat room",
status: 403,
};
}
if (membership.role !== "admin") {
return {
success: false,
error: "Only admins can remove members",
status: 403,
};
}
// Check if target user is an admin
const targetMembership = await database_js_1.prisma.chatRoomMember.findUnique({
where: {
userId_roomId: {
userId: data.userId,
roomId,
},
},
});
if (!targetMembership) {
return {
success: false,
error: "User is not a member of this chat room",
status: 404,
};
}
if (targetMembership.role === "admin") {
return {
success: false,
error: "Cannot remove an admin from the chat room",
status: 403,
};
}
// Remove user from chat room
await database_js_1.prisma.chatRoomMember.delete({
where: {
userId_roomId: {
userId: data.userId,
roomId,
},
},
});
// Get updated chat room
const updatedRoom = await database_js_1.prisma.chatRoom.findUnique({
where: { id: roomId },
include: {
members: {
include: {
user: {
select: {
id: true,
username: true,
isOnline: true,
lastSeen: true,
avatar: true,
},
},
},
},
_count: {
select: {
messages: true,
},
},
},
});
return {
success: true,
data: updatedRoom,
};
}
catch (error) {
console.error("Remove chat room member error:", error);
return {
success: false,
error: "Failed to remove member from chat room",
status: 500,
};
}
}
}
exports.ChatService = ChatService;