2023-02-14 10:10:10 +01:00
|
|
|
import type { Password, User } from '@prisma/client';
|
|
|
|
|
import bcrypt from 'bcryptjs';
|
2023-02-11 03:14:14 +01:00
|
|
|
|
2023-02-14 10:10:10 +01:00
|
|
|
import { prisma } from '~/db.server';
|
2023-02-11 03:14:14 +01:00
|
|
|
|
2023-02-14 10:10:10 +01:00
|
|
|
export type { User } from '@prisma/client';
|
2023-02-11 03:14:14 +01:00
|
|
|
|
2023-02-14 10:10:10 +01:00
|
|
|
export async function getUserById(id: User['id']) {
|
2023-02-11 03:14:14 +01:00
|
|
|
return prisma.user.findUnique({ where: { id } });
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-14 10:10:10 +01:00
|
|
|
export async function getUserByEmail(email: User['email']) {
|
2023-02-11 03:14:14 +01:00
|
|
|
return prisma.user.findUnique({ where: { email } });
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-22 13:11:03 +02:00
|
|
|
export async function createUser(
|
|
|
|
|
email: User['email'],
|
|
|
|
|
password: string,
|
|
|
|
|
admin = false
|
|
|
|
|
) {
|
2023-02-11 03:14:14 +01:00
|
|
|
const hashedPassword = await bcrypt.hash(password, 10);
|
|
|
|
|
|
|
|
|
|
return prisma.user.create({
|
|
|
|
|
data: {
|
|
|
|
|
email,
|
2023-06-22 13:11:03 +02:00
|
|
|
admin,
|
2023-02-11 03:14:14 +01:00
|
|
|
password: {
|
|
|
|
|
create: {
|
2023-02-14 10:10:10 +01:00
|
|
|
hash: hashedPassword
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-02-11 03:14:14 +01:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-23 01:20:18 +01:00
|
|
|
export async function updateUserEmail(id: User['id'], email: string) {
|
|
|
|
|
return prisma.user.update({
|
|
|
|
|
where: { id },
|
|
|
|
|
data: { email }
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-01 01:19:38 +01:00
|
|
|
export async function updateUserPrefs(
|
|
|
|
|
id: User['id'],
|
|
|
|
|
prefs: {
|
|
|
|
|
dateFormat?: User['dateFormat'];
|
|
|
|
|
}
|
|
|
|
|
) {
|
|
|
|
|
return prisma.user.update({
|
|
|
|
|
where: { id },
|
|
|
|
|
data: { ...prefs }
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-23 01:20:18 +01:00
|
|
|
export async function updateUserPassword(id: User['id'], password: string) {
|
|
|
|
|
const hashedPassword = await bcrypt.hash(password, 10);
|
|
|
|
|
|
|
|
|
|
return prisma.user.update({
|
|
|
|
|
where: { id },
|
|
|
|
|
data: {
|
|
|
|
|
password: {
|
|
|
|
|
update: {
|
|
|
|
|
hash: hashedPassword
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-14 10:10:10 +01:00
|
|
|
export async function deleteUserByEmail(email: User['email']) {
|
2023-02-11 03:14:14 +01:00
|
|
|
return prisma.user.delete({ where: { email } });
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-23 14:17:29 +01:00
|
|
|
export async function deleteUserById(id: User['id']) {
|
|
|
|
|
return prisma.user.delete({ where: { id } });
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-11 03:14:14 +01:00
|
|
|
export async function verifyLogin(
|
2023-02-14 10:10:10 +01:00
|
|
|
email: User['email'],
|
|
|
|
|
password: Password['hash']
|
2023-02-11 03:14:14 +01:00
|
|
|
) {
|
|
|
|
|
const userWithPassword = await prisma.user.findUnique({
|
|
|
|
|
where: { email },
|
|
|
|
|
include: {
|
2023-02-14 10:10:10 +01:00
|
|
|
password: true
|
|
|
|
|
}
|
2023-02-11 03:14:14 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (!userWithPassword || !userWithPassword.password) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const isValid = await bcrypt.compare(
|
|
|
|
|
password,
|
|
|
|
|
userWithPassword.password.hash
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (!isValid) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const { password: _password, ...userWithoutPassword } = userWithPassword;
|
|
|
|
|
|
|
|
|
|
return userWithoutPassword;
|
|
|
|
|
}
|
2023-02-23 14:17:29 +01:00
|
|
|
|
2023-06-22 13:11:03 +02:00
|
|
|
export async function countUsers() {
|
|
|
|
|
return prisma.user.count();
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-23 14:17:29 +01:00
|
|
|
export async function getUsers({
|
|
|
|
|
search,
|
|
|
|
|
page,
|
|
|
|
|
size,
|
|
|
|
|
orderBy,
|
|
|
|
|
order
|
|
|
|
|
}: {
|
|
|
|
|
search?: string;
|
|
|
|
|
page?: number;
|
|
|
|
|
size?: number;
|
|
|
|
|
orderBy?: string;
|
|
|
|
|
order?: 'asc' | 'desc';
|
|
|
|
|
}) {
|
|
|
|
|
const totalUsers = await prisma.user.count();
|
|
|
|
|
const filteredTotal = await prisma.user.count({
|
|
|
|
|
where: {
|
|
|
|
|
email: {
|
|
|
|
|
contains: search || undefined
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
const paginatedUsers = await prisma.user.findMany({
|
|
|
|
|
where: {
|
|
|
|
|
email: {
|
|
|
|
|
contains: search || undefined
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
orderBy: {
|
|
|
|
|
[orderBy || 'createdAt']: order || 'desc'
|
|
|
|
|
},
|
|
|
|
|
skip: page && size ? (page - 1) * size : 0,
|
|
|
|
|
take: size
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const nextPage = page && size && totalUsers > page * size ? page + 1 : null;
|
|
|
|
|
const previousPage = page && page > 2 ? page - 1 : null;
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
total: totalUsers,
|
|
|
|
|
filteredTotal,
|
|
|
|
|
users: paginatedUsers,
|
|
|
|
|
nextPage,
|
|
|
|
|
previousPage
|
|
|
|
|
};
|
|
|
|
|
}
|