71 lines
2.0 KiB
TypeScript
71 lines
2.0 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { z } from "zod";
|
|
|
|
import { getAuthenticatedUser } from "@/lib/auth";
|
|
import { db } from "@/lib/db";
|
|
import { getChannel, isSetupComplete } from "@/lib/setup";
|
|
|
|
export const runtime = "nodejs";
|
|
|
|
const channelSettingsSchema = z.object({
|
|
channelName: z.string().trim().min(2).max(80),
|
|
channelDescription: z.string().trim().max(500).optional(),
|
|
channelIsAdult: z.boolean(),
|
|
});
|
|
|
|
function redirectWithError(request: Request, error: string) {
|
|
const url = new URL("/dashboard/settings", request.url);
|
|
url.searchParams.set("error", error);
|
|
return NextResponse.redirect(url, 303);
|
|
}
|
|
|
|
function redirectWithSuccess(request: Request, success: string) {
|
|
const url = new URL("/dashboard/settings", request.url);
|
|
url.searchParams.set("success", success);
|
|
return NextResponse.redirect(url, 303);
|
|
}
|
|
|
|
export async function POST(request: Request) {
|
|
if (!(await isSetupComplete())) {
|
|
return NextResponse.redirect(new URL("/setup", request.url), 303);
|
|
}
|
|
|
|
const user = await getAuthenticatedUser();
|
|
if (!user) {
|
|
return NextResponse.redirect(new URL("/login", request.url), 303);
|
|
}
|
|
|
|
const channel = await getChannel();
|
|
if (!channel) {
|
|
return NextResponse.redirect(new URL("/setup", request.url), 303);
|
|
}
|
|
|
|
const formData = await request.formData();
|
|
const parsed = channelSettingsSchema.safeParse({
|
|
channelName: formData.get("channelName"),
|
|
channelDescription: formData.get("channelDescription") || undefined,
|
|
channelIsAdult: formData.get("channelIsAdult") === "on",
|
|
});
|
|
|
|
if (!parsed.success) {
|
|
return redirectWithError(request, "Please provide a valid channel name.");
|
|
}
|
|
|
|
try {
|
|
await db.channel.update({
|
|
where: {
|
|
id: channel.id,
|
|
},
|
|
data: {
|
|
name: parsed.data.channelName,
|
|
description: parsed.data.channelDescription || null,
|
|
isAdult: parsed.data.channelIsAdult,
|
|
},
|
|
});
|
|
|
|
return redirectWithSuccess(request, "Channel settings saved.");
|
|
} catch {
|
|
return redirectWithError(request, "Failed to save channel settings.");
|
|
}
|
|
}
|