Add room invites and chat moderation
All checks were successful
Template Compliance / compliance (push) Successful in 7s

This commit is contained in:
ToxicCrzay270
2026-06-11 14:39:08 +02:00
parent 1b68be8802
commit 699232f5c6
5 changed files with 200 additions and 27 deletions

View File

@@ -1,5 +1,6 @@
"use server";
import { randomBytes } from "node:crypto";
import { Prisma, RoomVisibility } from "@prisma/client";
import { revalidatePath } from "next/cache";
import { redirect } from "next/navigation";
@@ -171,6 +172,74 @@ export async function addRoomMember(formData: FormData) {
redirect(`/rooms/${encodeURIComponent(room.slug)}?rail=Invite&saved=1`);
}
export async function createRoomInvite(formData: FormData) {
const user = await requireCurrentUser();
const roomId = String(formData.get("roomId") || "");
const expiresDays = Number(formData.get("expiresDays") || 0);
if (!roomId) return;
const room = await prisma.room.findUnique({
where: { id: roomId },
include: { members: { where: { userId: user.id }, select: { canManage: true } } }
});
if (!room || !canManageRoom(user, room)) return;
const expiresAt = Number.isFinite(expiresDays) && expiresDays > 0 ? new Date(Date.now() + expiresDays * 24 * 60 * 60 * 1000) : null;
const invite = await prisma.invite.create({
data: {
code: randomBytes(12).toString("base64url"),
creatorId: user.id,
roomId: room.id,
expiresAt
}
});
await prisma.auditEvent.create({
data: {
actorId: user.id,
roomId: room.id,
action: "room.invite.create",
metadata: { inviteId: invite.id, expiresAt: expiresAt?.toISOString() || null }
}
});
revalidateRoom(room.slug);
redirect(`/rooms/${encodeURIComponent(room.slug)}?rail=Invite&saved=1`);
}
export async function revokeRoomInvite(formData: FormData) {
const user = await requireCurrentUser();
const inviteId = String(formData.get("inviteId") || "");
if (!inviteId) return;
const invite = await prisma.invite.findUnique({
where: { id: inviteId },
include: {
room: {
include: { members: { where: { userId: user.id }, select: { canManage: true } } }
}
}
});
if (!invite?.room || !canManageRoom(user, invite.room)) return;
await prisma.$transaction([
prisma.invite.update({ where: { id: invite.id }, data: { status: "REVOKED" } }),
prisma.auditEvent.create({
data: {
actorId: user.id,
roomId: invite.room.id,
action: "room.invite.revoke",
metadata: { inviteId: invite.id }
}
})
]);
revalidateRoom(invite.room.slug);
redirect(`/rooms/${encodeURIComponent(invite.room.slug)}?rail=Invite&saved=1`);
}
export async function removeRoomMember(formData: FormData) {
const user = await requireCurrentUser();
const roomId = String(formData.get("roomId") || "");