Files
cod-api/services/user.service.js

189 lines
5.0 KiB
JavaScript

const {
getAllUsersDb,
getUserByIdDb,
getUserByUserEmailDb,
getUserByUsernameDb,
createUserDb,
updateUserDb,
approveUserDb,
rejectUserDb,
deleteUserDb,
changeUserPasswordDb
} = require('../db/user.db');
const { hashPassword } = require('../helpers/hashPassword');
const { ErrorHandler } = require('../helpers/error');
class UserService {
// Get all users
static async getAllUsers(param) {
try {
const results = await getAllUsersDb(param);
return results;
} catch (error) {
throw new ErrorHandler(error.statusCode, error.message);
}
}
// Get user by ID
static async getUserById(id) {
try {
const result = await getUserByIdDb(id);
if (!result) throw new ErrorHandler(404, 'User not found');
return result;
} catch (error) {
throw new ErrorHandler(error.statusCode, error.message);
}
}
// Create user
static async createUser(data) {
try {
if (!data || typeof data !== 'object') data = {};
const creatorId = data.userId || null;
// cek duplikasi username & email
const [existingUsername, existingEmail] = await Promise.all([
getUserByUsernameDb(data.user_name),
getUserByUserEmailDb(data.user_email)
]);
if (existingUsername) throw new ErrorHandler(400, 'Username is already taken');
if (existingEmail) throw new ErrorHandler(400, 'Email is already taken');
// hash password
const hashedPassword = await hashPassword(data.user_password);
// siapkan data untuk insert
const userData = {
...data,
user_password: hashedPassword,
is_approve: 2,
approved_by: creatorId,
created_by: creatorId,
updated_by: creatorId,
is_sa: 0,
is_active: 1
};
delete userData.userId;
const result = await createUserDb(userData);
return result;
} catch (error) {
throw new ErrorHandler(error.statusCode || 500, error.message);
}
}
// Update user
static async updateUser(id, data) {
try {
if (!data || typeof data !== 'object') data = {};
const existingEmail = await getUserByUserEmailDb(data.user_email);
const existingUsername = await getUserByUsernameDb(data.user_name);
if (existingUsername) {
throw new ErrorHandler(400, 'Username is already taken');
}
if (existingEmail) {
throw new ErrorHandler(400, 'Email is already taken')
}
const userExist = await getUserByIdDb(id);
if (!userExist) throw new ErrorHandler(404, 'User not found');
const result = await updateUserDb(id, data);
return result;
} catch (error) {
throw new ErrorHandler(error.statusCode, error.message);
}
}
// Approve user
static async approveUser(userId, approverId) {
try {
if (!userId) {
throw new ErrorHandler(400, 'User ID is required');
}
const existingUser = await getUserByIdDb(userId);
if (!existingUser) {
throw new ErrorHandler(404, 'User not found');
}
if (existingUser.is_approve === 2) {
throw new ErrorHandler(400, 'User is already approved');
}
if (existingUser.is_approve === 0) {
throw new ErrorHandler(400, 'User is already rejected');
}
const updatedUser = await approveUserDb(userId, approverId);
return updatedUser;
} catch (error) {
throw new ErrorHandler(error.statusCode || 500, error.message);
}
}
// Reject user
static async rejectUser(userId, approverId) {
try {
if (!userId) {
throw new ErrorHandler(400, 'User ID is required');
}
const existingUser = await getUserByIdDb(userId);
if (!existingUser) {
throw new ErrorHandler(404, 'User not found');
}
if (existingUser.is_approve === 2) {
throw new ErrorHandler(400, 'User is already approved');
}
if (existingUser.is_approve === 0) {
throw new ErrorHandler(400, 'User is already rejected');
}
const updatedUser = await rejectUserDb(userId, approverId);
return updatedUser;
} catch (error) {
throw new ErrorHandler(error.statusCode || 500, error.message);
}
}
// Soft delete user
static async deleteUser(id, userId) {
try {
const userExist = await getUserByIdDb(id);
if (!userExist) throw new ErrorHandler(404, 'User not found');
const result = await deleteUserDb(id, userId);
return result;
} catch (error) {
throw new ErrorHandler(error.statusCode, error.message);
}
}
// Change password
static async changeUserPassword(id, newPassword) {
try {
const userExist = await getUserByIdDb(id);
if (!userExist) throw new ErrorHandler(404, 'User not found');
const hashedPassword = await hashPassword(newPassword);
const result = await changeUserPasswordDb(id, hashedPassword);
return result;
} catch (error) {
throw new ErrorHandler(error.statusCode, error.message);
}
}
}
module.exports = UserService;