Files
feishin/server/services/users.service.ts
T
2022-11-08 15:13:47 -08:00

98 lines
2.1 KiB
TypeScript

import bcrypt from 'bcryptjs';
import { prisma } from '@lib/prisma';
import { AuthUser } from '@middleware/authenticate';
import { randomString, ApiError } from '@utils/index';
const findById = async (user: AuthUser, options: { id: string }) => {
const { id } = options;
if (!user.isAdmin && user.id !== id) {
throw ApiError.forbidden();
}
const uniqueUser = await prisma.user.findUnique({
include: { serverFolderPermissions: true },
where: { id },
});
if (!uniqueUser) {
throw ApiError.notFound('');
}
return uniqueUser;
};
const findMany = async () => {
const users = await prisma.user.findMany({});
return users;
};
const createUser = async (options: {
displayName?: string;
password: string;
username: string;
}) => {
const { password, username, displayName } = options;
const [userExists, displayNameExists] = await prisma.$transaction([
prisma.user.findUnique({ where: { username } }),
prisma.user.findUnique({ where: { displayName } }),
]);
if (userExists) {
throw ApiError.conflict('The user already exists.');
}
if (displayNameExists) {
throw ApiError.conflict('The display name already exists.');
}
const hashedPassword = await bcrypt.hash(password, 12);
const user = await prisma.user.create({
data: {
deviceId: `${username}_${randomString(10)}`,
enabled: false,
password: hashedPassword,
username,
},
});
return user;
};
const deleteUser = async (options: { userId: string }) => {
const { userId } = options;
const user = await prisma.user.delete({ where: { id: userId } });
return user;
};
const updateUser = async (
options: { userId: string },
data: {
password?: string;
username?: string;
}
) => {
const { userId } = options;
const { username, password } = data;
const hashedPassword = password && (await bcrypt.hash(password, 12));
const user = await prisma.user.update({
data: { password: hashedPassword, username },
where: { id: userId },
});
return user;
};
export const usersService = {
createUser,
deleteUser,
findById,
findMany,
updateUser,
};