Files
pichunt/server/api/auth/login.post.ts
T
2025-09-15 00:13:57 +02:00

51 lines
1.3 KiB
TypeScript

import { verify } from 'argon2';
import { useValidatedBody, z } from 'h3-zod';
import prisma from '~~/lib/prisma';
import { logins } from '~~/server/metrics';
export default defineEventHandler(async (event) => {
const { email, password } = await useValidatedBody(
event,
z.object({
email: z.email().min(5).trim(),
password: z.string().min(8)
})
);
const user = await prisma.user.findUnique({
where: {
deletedAt: null,
email
},
select: {
id: true,
password: true,
name: true,
role: true
}
});
if (!user || user.password.length <= 0) {
console.warn(`Failed login attempted: Unknown email: ${email}`);
logins.inc({ success: 'false' });
throw createError({ status: 404, statusText: 'Not found!' });
}
if (!(await verify(user.password, password))) {
console.warn(`Failed login attempted: Wrong password: ${email}`);
logins.inc({ success: 'false' });
throw createError({ status: 404, statusText: 'Not found!' });
}
console.warn(`Successful login attempted: ${email}`);
await setUserSession(event, {
user: {
id: user.id,
name: user.name,
role: user.role
},
loggedInAt: new Date()
});
logins.inc({ success: 'true' });
return { success: true, user: { id: user.id } };
});