src/features/auth/actions/sign-in.ts
"use server";
import { verify } from "@node-rs/argon2";
import { cookies } from "next/headers";
import { redirect } from "next/navigation";
import { z } from "zod";
import {
ActionState,
fromErrorToActionState,
toActionState,
} from "@/components/form/utils/to-action-state";
import { lucia } from "@/lib/lucia";
import prisma from "@/lib/prisma";
import { ticketsPath } from "@/paths";
const signInSchema = z.object({
email: z.email().min(1, { message: "Is required" }).max(191),
password: z.string().min(6).max(191),
});
export const signIn = async (_actionState: ActionState, formData: FormData) => {
try {
const { email, password } = signInSchema.parse(
Object.fromEntries(formData),
);
const user = await prisma.user.findUnique({
where: { email },
});
if (!user) {
return toActionState("ERROR", "Incorrect email or password", formData);
}
const validPassword = await verify(user.passwordHash, password);
if (!validPassword) {
return toActionState("ERROR", "Incorrect email or password", formData);
}
const session = await lucia.createSession(user.id, {});
const sessionCookie = lucia.createSessionCookie(session.id);
(await cookies()).set(
sessionCookie.name,
sessionCookie.value,
sessionCookie.attributes,
);
} catch (error) {
return fromErrorToActionState(error, formData);
}
redirect(ticketsPath());
};