Files
cod-api/services/user.service.js
2025-10-09 09:01:08 +07:00

175 lines
4.9 KiB
JavaScript

const {
createUserDb,
getUserByIdDb,
getAllUsersDb,
getUserByUsernameDb,
updateUserDb,
deleteUserDb,
changeUserPasswordDb
} = require('../db/user.db');
const { hashPassword } = require('../helpers/hashPassword');
const { ErrorHandler } = require('../helpers/error');
const statusName = [
{ status: true, status_name: "Aktif" },
{ status: false, status_name: "NonAktif" }
];
class UserService {
// Get all status users
getAllStatusUsers = async () => {
try {
return statusName;
} catch (error) {
throw new ErrorHandler(error.statusCode || 500, error.message);
}
};
// Get all users
getAllUsers = async () => {
try {
const results = await getAllUsersDb();
results.forEach(user => {
user.is_active = user.is_active == 1;
user.is_active_name = statusName.find(s => s.status === user.is_active)?.status_name;
delete user.user_password; // remove password
});
return results;
} catch (error) {
throw new ErrorHandler(error.statusCode || 500, error.message);
}
};
// Get user by ID
getUserById = async (id) => {
try {
const user = await getUserByIdDb(id);
if (!user) throw new ErrorHandler(404, "User not found");
user.is_active = user.is_active == 1;
user.is_active_name = statusName.find(s => s.status === user.is_active)?.status_name;
delete user.user_password;
return user;
} catch (error) {
throw new ErrorHandler(error.statusCode || 500, error.message);
}
};
// Create users
createUser = async ({ fullname, name, email, phone, password, role_id = null, is_sa = 0, is_active = 1, approved_by }) => {
try {
const existingUser = await getUserByUsernameDb(name);
if (existingUser) throw new ErrorHandler(400, "Username already taken");
const hashedPassword = await hashPassword(password);
const userId = await createUserDb({
user_fullname: fullname,
user_name: name,
user_email: email,
user_phone: phone,
user_password: hashedPassword,
role_id,
is_sa,
is_active,
is_approve: 1,
approved_by,
approved_at: new Date()
});
return {
user_id: userId,
user_fullname: fullname,
user_name: name,
user_email: email,
user_phone: phone,
role_id,
is_sa,
is_active,
is_approve: 1,
approved_by
};
} catch (error) {
throw new ErrorHandler(error.statusCode || 500, error.message);
}
};
// Update user
updateUser = async ({ user_id, fullname, name, email, phone, role_id, is_sa, is_active, is_approve, updatedById }) => {
try {
const user = await getUserByIdDb(user_id);
if (!user) throw new ErrorHandler(404, "User not found");
// Cek username
if (name && user.user_name.toLowerCase() !== name.toLowerCase()) {
const userByName = await getUserByUsernameDb(name);
if (userByName) throw new ErrorHandler(400, "Username already taken");
}
const updateData = {
...(fullname && { user_fullname: fullname }),
...(name && { user_name: name }),
...(email && { user_email: email }),
...(phone && { user_phone: phone }),
...(role_id !== undefined && { role_id }),
...(updatedById !== undefined && { updated_by: updatedById })
};
await updateUserDb(user_id, updateData);
const updatedUser = await getUserByIdDb(user_id);
delete updatedUser.user_password;
updatedUser.is_active = updatedUser.is_active == 1;
updatedUser.is_active_name = statusName.find(s => s.status === updatedUser.is_active)?.status_name;
return updatedUser;
} catch (error) {
throw new ErrorHandler(error.statusCode || 500, error.message);
}
};
// Approve user
approveUser = async (userId, approverId) => {
try {
const updateData = {
is_approve: 1,
approved_by: approverId,
approved_at: new Date()
};
await updateUserDb(userId, updateData);
const updatedUser = await getUserByIdDb(userId);
delete updatedUser.user_password;
return updatedUser;
} catch (error) {
throw new ErrorHandler(error.statusCode || 500, error.message);
}
};
// Delete user (soft delete)
deleteUser = async (userId, deletedBy) => {
try {
await deleteUserDb(userId, deletedBy);
return { message: "User deleted successfully" };
} catch (error) {
throw new ErrorHandler(error.statusCode || 500, error.message);
}
};
// Change password
changeUserPassword = async (user_Id, new_Password) => {
try {
const hashedPassword = await hashPassword(new_Password);
await changeUserPasswordDb(user_Id, hashedPassword);
return { message: "Password updated successfully" };
} catch (error) {
throw new ErrorHandler(error.statusCode || 500, error.message);
}
};
}
module.exports = new UserService();