Files
metube/src/app/api/channel/route.ts
T
2026-04-14 14:39:13 -05:00

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.");
}
}