feat: implement credentials login
All checks were successful
container-scan / Container Scan (pull_request) Successful in 2m55s
docker-build / docker (pull_request) Successful in 7m1s

implements the credentials login functionality
This commit is contained in:
Dominik 2025-05-28 13:08:07 +02:00
parent 72a5c25838
commit 2bab63b2b9
Signed by: dominik
GPG key ID: 06A4003FC5049644
10 changed files with 508 additions and 115 deletions

75
src/lib/auth/register.ts Normal file
View file

@ -0,0 +1,75 @@
'use server';
import type { z } from 'zod';
import bcrypt from 'bcryptjs';
import { registerSchema } from '@/lib/validation/user';
import { prisma } from '@/prisma';
export async function registerAction(data: z.infer<typeof registerSchema>) {
try {
const result = await registerSchema.safeParseAsync(data);
if (!result.success) {
return {
error: result.error.errors[0].message,
};
}
const { email, password, firstName, lastName, username } = result.data;
const user = await prisma.user.findUnique({
where: {
email,
},
});
if (user) {
return {
error: 'User already exist with this email',
};
}
const existingUsername = await prisma.user.findUnique({
where: {
name: username,
},
});
if (existingUsername) {
return {
error: 'Username already exists',
};
}
const passwordHash = await bcrypt.hash(password, 10);
await prisma.$transaction(async (tx) => {
const { id } = await tx.user.create({
data: {
email,
name: username,
password_hash: passwordHash,
first_name: firstName,
last_name: lastName,
emailVerified: new Date(), // TODO: handle email verification
},
});
await tx.account.create({
data: {
userId: id,
type: 'credentials',
provider: 'credentials',
providerAccountId: id,
},
});
});
return {};
// eslint-disable-next-line @typescript-eslint/no-unused-vars
} catch (_error) {
return {
error: 'System error. Please contact support',
};
}
}