"use server"; import { cookies } from "next/headers"; import { redirect } from "next/navigation"; import bcrypt from "bcryptjs"; import { prisma } from "@streamclipper/db"; import { createSessionToken, SESSION_COOKIE_NAME } from "../../lib/auth"; const SESSION_MAX_AGE_SEC = 60 * 60 * 24 * 30; async function setSessionCookie(userId: string, username: string) { const token = await createSessionToken({ sub: userId, username }); const jar = await cookies(); jar.set(SESSION_COOKIE_NAME, token, { httpOnly: true, secure: process.env.NODE_ENV === "production", sameSite: "lax", path: "/", maxAge: SESSION_MAX_AGE_SEC, }); } export async function bootstrapAdmin(formData: FormData) { const username = String(formData.get("username") ?? "").trim(); const password = String(formData.get("password") ?? ""); if (!username || password.length < 8) { throw new Error("Kullanıcı adı gerekli, şifre en az 8 karakter olmalı."); } const existing = await prisma.user.count(); if (existing > 0) { redirect("/login"); } const passwordHash = await bcrypt.hash(password, 12); const user = await prisma.user.create({ data: { username, passwordHash } }); await setSessionCookie(user.id, user.username); redirect("/"); } export async function login(formData: FormData) { const username = String(formData.get("username") ?? "").trim(); const password = String(formData.get("password") ?? ""); const user = await prisma.user.findUnique({ where: { username } }); if (!user || !(await bcrypt.compare(password, user.passwordHash))) { redirect("/login?error=1"); } await setSessionCookie(user.id, user.username); redirect("/"); } export async function logout() { const jar = await cookies(); jar.delete(SESSION_COOKIE_NAME); redirect("/login"); }