Enable room queue controls
This commit is contained in:
@@ -4,7 +4,7 @@ import { RoomVisibility } from "@prisma/client";
|
||||
import { revalidatePath } from "next/cache";
|
||||
import { redirect } from "next/navigation";
|
||||
import { prisma } from "./prisma";
|
||||
import { requireCurrentUser } from "./session";
|
||||
import { requireCurrentUser, userIsAdmin } from "./session";
|
||||
import { getAppSettings } from "./settings";
|
||||
|
||||
function normalizeSlug(value: string) {
|
||||
@@ -53,3 +53,74 @@ export async function createRoom(formData: FormData) {
|
||||
revalidatePath("/dashboard");
|
||||
redirect(`/rooms/${encodeURIComponent(room.slug)}`);
|
||||
}
|
||||
|
||||
export async function updateRoomSettings(formData: FormData) {
|
||||
const user = await requireCurrentUser();
|
||||
const roomId = String(formData.get("roomId") || "");
|
||||
const name = String(formData.get("name") || "").trim().slice(0, 80);
|
||||
const visibility = String(formData.get("visibility") || "FRIENDS");
|
||||
|
||||
const room = await prisma.room.findUnique({
|
||||
where: { id: roomId },
|
||||
include: { members: { where: { userId: user.id }, select: { canManage: true } } }
|
||||
});
|
||||
|
||||
if (!room || !canManageRoom(user, room) || !name) return;
|
||||
|
||||
const allowedVisibility: RoomVisibility[] = ["PUBLIC", "FRIENDS", "EXPLICIT", "ROLE_RESTRICTED"];
|
||||
const roomVisibility = allowedVisibility.includes(visibility as RoomVisibility)
|
||||
? (visibility as RoomVisibility)
|
||||
: room.visibility;
|
||||
|
||||
await prisma.room.update({
|
||||
where: { id: room.id },
|
||||
data: {
|
||||
name,
|
||||
visibility: roomVisibility
|
||||
}
|
||||
});
|
||||
|
||||
revalidateRoom(room.slug);
|
||||
redirect(`/rooms/${encodeURIComponent(room.slug)}?rail=Settings&saved=1`);
|
||||
}
|
||||
|
||||
export async function addRoomMember(formData: FormData) {
|
||||
const user = await requireCurrentUser();
|
||||
const roomId = String(formData.get("roomId") || "");
|
||||
const username = String(formData.get("username") || "").trim().toLowerCase();
|
||||
const canManage = formData.get("canManage") === "on";
|
||||
|
||||
const room = await prisma.room.findUnique({
|
||||
where: { id: roomId },
|
||||
include: { members: { where: { userId: user.id }, select: { canManage: true } } }
|
||||
});
|
||||
|
||||
if (!room || !canManageRoom(user, room) || !username) return;
|
||||
|
||||
const invited = await prisma.user.findUnique({ where: { username }, select: { id: true } });
|
||||
if (!invited || invited.id === room.ownerId) {
|
||||
redirect(`/rooms/${encodeURIComponent(room.slug)}?rail=Invite&error=user`);
|
||||
}
|
||||
|
||||
await prisma.roomMember.upsert({
|
||||
where: { roomId_userId: { roomId: room.id, userId: invited.id } },
|
||||
update: { canManage },
|
||||
create: { roomId: room.id, userId: invited.id, canManage }
|
||||
});
|
||||
|
||||
revalidateRoom(room.slug);
|
||||
redirect(`/rooms/${encodeURIComponent(room.slug)}?rail=Invite&saved=1`);
|
||||
}
|
||||
|
||||
function canManageRoom(
|
||||
user: Awaited<ReturnType<typeof requireCurrentUser>>,
|
||||
room: { ownerId: string | null; members: Array<{ canManage: boolean }> }
|
||||
) {
|
||||
return room.ownerId === user.id || userIsAdmin(user) || room.members.some((member) => member.canManage);
|
||||
}
|
||||
|
||||
function revalidateRoom(slug: string) {
|
||||
revalidatePath(`/rooms/${encodeURIComponent(slug)}`);
|
||||
revalidatePath("/rooms");
|
||||
revalidatePath("/dashboard");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user