Files

71 lines
2.0 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use server";
import { cookies } from "next/headers";
import { redirect } from "next/navigation";
import prisma from "@/lib/prisma";
import bcrypt from "bcryptjs";
export type ActionState = { error: string } | null;
export async function login(prevState: ActionState, formData: FormData): Promise<ActionState> {
const username = formData.get("username") as string;
const password = formData.get("password") as string;
if (!username || !password) {
return { error: "Kullanıcı adı ve şifre gereklidir" };
}
// Fallback to initial .env credentials if no users exist
const userCount = await prisma.user.count();
if (userCount === 0) {
if (
username === process.env.ADMIN_USERNAME &&
password === process.env.ADMIN_PASSWORD
) {
// Create the first admin user
const hashedPassword = await bcrypt.hash(password, 10);
await prisma.user.create({
data: {
username,
password: hashedPassword,
},
});
await setSessionCookie();
redirect("/admin");
} else {
return { error: "Geçersiz kullanıcı adı veya şifre" };
}
} else {
// Normal DB login
const user = await prisma.user.findUnique({
where: { username },
});
if (user && await bcrypt.compare(password, user.password)) {
await setSessionCookie();
redirect("/admin");
} else {
return { error: "Geçersiz kullanıcı adı veya şifre" };
}
}
// This redirect is inside if blocks but typescript requires a return here.
return { error: "Bilinmeyen bir hata oluştu" };
}
async function setSessionCookie() {
const cookieStore = await cookies();
cookieStore.set("admin_session", "true", {
httpOnly: true,
secure: process.env.NODE_ENV === "production",
maxAge: 60 * 60 * 24 * 7, // 1 week
path: "/",
});
}
export async function logout() {
const cookieStore = await cookies();
cookieStore.delete("admin_session");
redirect("/admin/login");
}