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:
@@ -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") || "");
|
||||
|
||||
Reference in New Issue
Block a user