subman-nextjs/src/app/api/auth/actions/sign-in.ts

66 lines
1.5 KiB
TypeScript

'use server';
import { cookies } from 'next/headers';
import { redirect } from 'next/navigation';
import { Argon2id } from 'oslo/password';
import { lucia } from 'app/lib/lucia';
import prisma from 'app/lib/db';
import { toast } from '@/components/ui/use-toast';
export type User = {
id?: number,
email: string,
password: string,
}
const signIn = async (formData: FormData) => {
console.log("signIn called!")
const clientUser: User = {
email: formData.get("email") as string,
password: formData.get("password") as string
}
try {
const user = await prisma.user.findFirst({
where: { email: clientUser.email },
});
if (!user) {
console.log("NOT A USER")
// https://www.robinwieruch.de/next-forms/
toast({
title: "Whoops!",
description: "Username not recognised!"
})
}
const validPassword = await new Argon2id().verify(
user.password,
clientUser.password
);
console.log(`VALID PASSWORD: ${validPassword}`)
if (!validPassword) {
// https://www.robinwieruch.de/next-forms
console.log("NOT A VALID PASSWORD!")
throw new Error('Incorrect email or password');
}
const session = await lucia.createSession(user.id.toString(), {});
const sessionCookie = lucia.createSessionCookie(session.id);
cookies().set(
sessionCookie.name,
sessionCookie.value,
sessionCookie.attributes
);
} catch (error) {
// TODO: add error feedback yourself
// https://www.robinwieruch.de/next-forms/
}
redirect('/submission');
};
export { signIn };