66 lines
1.5 KiB
TypeScript
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 };
|