Add room invites and chat moderation
All checks were successful
Template Compliance / compliance (push) Successful in 7s
All checks were successful
Template Compliance / compliance (push) Successful in 7s
This commit is contained in:
15
server.js
15
server.js
@@ -160,6 +160,16 @@ app.prepare().then(() => {
|
||||
await broadcastRoom(io, room.slug, room.id);
|
||||
}));
|
||||
|
||||
socket.on("chat:delete", (payload) => safeRoomAction(socket, async ({ room, user }) => {
|
||||
if (!canManageRoom(room, user.id, user)) return reject(socket, "Only room managers can moderate chat.");
|
||||
const messageId = String(payload?.messageId || "");
|
||||
if (!messageId) return;
|
||||
const result = await prisma.roomMessage.deleteMany({ where: { id: messageId, roomId: room.id } });
|
||||
if (result.count === 0) return;
|
||||
await audit("room.chat.delete", user.id, room.id, { messageId });
|
||||
await broadcastRoom(io, room.slug, room.id);
|
||||
}));
|
||||
|
||||
socket.on("disconnect", () => {
|
||||
const roomSlug = socket.data.roomSlug;
|
||||
const user = socket.data.user;
|
||||
@@ -276,6 +286,11 @@ async function getRoomContext(slug, userId) {
|
||||
return { allowed, room };
|
||||
}
|
||||
|
||||
function canManageRoom(room, userId, user) {
|
||||
const isAdmin = Boolean(user?.roles?.some((userRole) => userRole.role.name === "admin"));
|
||||
return room.ownerId === userId || isAdmin || room.members.some((member) => member.userId === userId && member.canManage);
|
||||
}
|
||||
|
||||
async function buildRoomSnapshot(roomId) {
|
||||
const room = await prisma.room.findUnique({
|
||||
where: { id: roomId },
|
||||
|
||||
Reference in New Issue
Block a user