48 lines
1.1 KiB
TypeScript
48 lines
1.1 KiB
TypeScript
"use server";
|
|
|
|
import { cookies } from "next/headers";
|
|
import { redirect } from "next/navigation";
|
|
import { Argon2id } from "oslo/password";
|
|
import { lucia } from "@/lib/lucia";
|
|
import { daphnis } from "@/lib/prisma";
|
|
|
|
const signIn = async (formData: FormData) => {
|
|
const formDataRaw = {
|
|
username: formData.get("username") as string,
|
|
password: formData.get("password") as string,
|
|
};
|
|
|
|
try {
|
|
const user = await daphnis.user.findUnique({
|
|
where: { username: formDataRaw.username },
|
|
});
|
|
|
|
if (!user) {
|
|
return { error: "Incorrect username" };
|
|
}
|
|
|
|
const validPassword = await new Argon2id().verify(
|
|
user.hashedPassword,
|
|
formDataRaw.password
|
|
);
|
|
|
|
if (!validPassword) {
|
|
return { error: "Incorrect password" };
|
|
}
|
|
|
|
const session = await lucia.createSession(user.id, {});
|
|
const sessionCookie = lucia.createSessionCookie(session.id);
|
|
|
|
cookies().set(
|
|
sessionCookie.name,
|
|
sessionCookie.value,
|
|
sessionCookie.attributes
|
|
);
|
|
} catch (error: any) {
|
|
return { error: "Sign-in failed: " + error.message };
|
|
}
|
|
redirect("/home");
|
|
};
|
|
|
|
export { signIn };
|