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

66 lines
1.5 KiB
TypeScript
Raw Normal View History

2024-09-12 14:53:15 +00:00
'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';
2024-09-12 15:45:18 +00:00
import { toast } from '@/components/ui/use-toast';
2024-09-12 14:53:15 +00:00
export type User = {
id?: number,
email: string,
password: string,
}
2024-09-12 15:45:18 +00:00
const signIn = async (formData: FormData) => {
console.log("signIn called!")
const clientUser: User = {
email: formData.get("email") as string,
password: formData.get("password") as string
}
2024-09-12 14:53:15 +00:00
try {
const user = await prisma.user.findFirst({
where: { email: clientUser.email },
});
if (!user) {
2024-09-12 15:45:18 +00:00
console.log("NOT A USER")
2024-09-12 14:53:15 +00:00
// https://www.robinwieruch.de/next-forms/
2024-09-12 15:45:18 +00:00
toast({
title: "Whoops!",
description: "Username not recognised!"
})
2024-09-12 14:53:15 +00:00
}
const validPassword = await new Argon2id().verify(
user.password,
clientUser.password
);
2024-09-12 15:45:18 +00:00
console.log(`VALID PASSWORD: ${validPassword}`)
2024-09-12 14:53:15 +00:00
if (!validPassword) {
2024-09-12 15:45:18 +00:00
// https://www.robinwieruch.de/next-forms
console.log("NOT A VALID PASSWORD!")
2024-09-12 14:53:15 +00:00
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/
}
2024-09-12 15:45:18 +00:00
redirect('/submission');
2024-09-12 14:53:15 +00:00
};
export { signIn };