diff --git a/services/auth.service.js b/services/auth.service.js new file mode 100644 index 0000000..583d300 --- /dev/null +++ b/services/auth.service.js @@ -0,0 +1,77 @@ +const bcrypt = require("bcrypt"); +const jwt = require("jsonwebtoken"); +const validateUser = require("../helpers/validateUser"); +const { ErrorHandler } = require("../helpers/error"); +const { + getUserByUsernameDb +} = require("../db/user.db"); +const { logger } = require("../utils/logger"); + +class AuthService { + + async login(username, password, tenantId) { + try { + // if (!validateUser(username, password)) { + // throw new ErrorHandler(403, "Invalid login"); + // } + + const user = await getUserByUsernameDb(username, tenantId); + console.log(user); + + if (!user) { + throw new ErrorHandler(403, "Username not found."); + } + + const isCorrectPassword = password === user.password + if (!isCorrectPassword) { + throw new ErrorHandler(403, "Username or password incorrect."); + } + + const dataToken = { + tenant_id: tenantId, + user_id: user.user_id, + username, + fullname: user.full_name, + role_id: user.role_id + } + + const token = await this.signToken(dataToken); + const refreshToken = await this.signRefreshToken(dataToken); + + return { + token, + refreshToken, + role_id: dataToken.role_id, + tenant_id: tenantId, + user: { + user_id: dataToken.user_id, + fullname: dataToken.fullname, + username: dataToken.username, + }, + }; + } catch (error) { + throw new ErrorHandler(error.statusCode, error.message); + } + } + + async signToken(data) { + try { + // console.log("signToken process.env.SECRET", process.env.SECRET) + return jwt.sign(data, process.env.SECRET, { expiresIn: "23h" }); + } catch (error) { + logger.error(error); + throw new ErrorHandler(500, "An error occurred"); + } + } + + async signRefreshToken(data) { + try { + return jwt.sign(data, process.env.REFRESH_SECRET, { expiresIn: "23h" }); + } catch (error) { + logger.error(error); + throw new ErrorHandler(500, error.message); + } + } +} + +module.exports = new AuthService(); diff --git a/services/user.service.js b/services/user.service.js new file mode 100644 index 0000000..2e95fda --- /dev/null +++ b/services/user.service.js @@ -0,0 +1,124 @@ +const { + createUserDb, + changeUserPasswordDb, + getUserByIdDb, + updateUserDb, + deleteUserDb, + getAllUsersDb, + getUserByUsernameDb, + getAllRoleDb +} = require("../db/user.db"); +const { ErrorHandler } = require("../helpers/error"); +const { convertId } = require("../helpers/utils"); + +const statusName = [ + { + status: true, + status_name: "Aktif" + }, { + status: false, + status_name: "NonAktif" + } +]; + +class UserService { + + getAllStatusUsers = async () => { + try { + return statusName; + } catch (error) { + throw new ErrorHandler(error.statusCode, error.message); + } + }; + + getAllUsers = async (param) => { + try { + const results = await getAllUsersDb(param); + + results.data.map(element => { + element.is_active = element.is_active == 1 ? true : false + element.is_active_name = convertId(statusName, element.is_active, 'status', 'status_name') + }); + + return results + } catch (error) { + throw new ErrorHandler(error.statusCode, error.message); + } + }; + + createUser = async (param) => { + try { + const userByUsername = await getUserByUsernameDb(param.userName, param.tenantID); + + if (userByUsername) { + throw new ErrorHandler(401, "username taken already"); + } + + return await createUserDb(param); + } catch (error) { + throw new ErrorHandler(error.statusCode, error.message); + } + }; + + getUserById = async (id) => { + try { + const user = await getUserByIdDb(id); + // user.password = undefined; + user.is_active = user.is_active == 1 ? true : false + return user; + } catch (error) { + throw new ErrorHandler(error.statusCode, error.message); + } + }; + + changeUserPassword = async (password, email, tenantID) => { + try { + return await changeUserPasswordDb(password, email, tenantID); + } catch (error) { + throw new ErrorHandler(error.statusCode, error.message); + } + }; + + updateUser = async (param) => { + const { userName, id } = param; + const errors = {}; + try { + + const user = await getUserByIdDb(id); + + const findUserByUsername = await getUserByUsernameDb(userName, param.tenantID); + + const usernameChanged = userName && user.user_name.toLowerCase() !== userName.toLowerCase(); + + if (usernameChanged && typeof findUserByUsername === "object") { + errors["username"] = "Username is already taken"; + } + + if (Object.keys(errors).length > 0) { + throw new ErrorHandler(403, errors); + } + + return await updateUserDb(param); + } catch (error) { + throw new ErrorHandler(error.statusCode, error.message); + } + }; + + deleteUser = async (id, userID) => { + try { + return await deleteUserDb(id, userID); + } catch (error) { + throw new ErrorHandler(error.statusCode, error.message); + } + }; + + getAllRoles = async (tenantID) => { + try { + return await getAllRoleDb(tenantID); + } catch (error) { + throw new ErrorHandler(error.statusCode, error.message); + } + }; +} + +module.exports = new UserService();