mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-07 20:40:15 +02:00
98 lines
2.1 KiB
TypeScript
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,
|
|
};
|