const moment = require('moment'); const Validator = require('validatorjs'); const Helper = require('../library/LibHelper'); const UsersModels = require('../models/UsersModels'); const LibPassword = require('../library/LibPassword'); const LibJwt = require('../library/LibJwt'); const response = require('../config/response'); Validator.useLang('en'); class AuthController { async register(req, res) { let apiRes = {}; try { const now = moment().unix(); // input validation const input = { first_name: req.body.first_name, last_name: req.body.last_name, email: req.body.email, password: req.body.password, crt_at: moment.unix(now).format('YYYY-MM-DD HH:mm:ss'), updt_at: moment.unix(now).format('YYYY-MM-DD HH:mm:ss'), }; const rulesInput = { first_name: 'required|string|max:45', last_name: 'required|string|max:45', email: 'required|email|max:45', password: 'required|string|min:6|max:16', }; const isInputValid = new Validator(input, rulesInput); if (isInputValid.fails()) { apiRes = JSON.parse(JSON.stringify(response[422])); apiRes.meta.message += Helper.setErrMsg(': ' + Object.values(isInputValid.errors.all())[0][0]); // get first message return res.status(200).json(apiRes); } // check email unique const getUsers = await UsersModels.findEmail(input.email); if (getUsers.length > 0) { apiRes.meta = response['email_unique'].meta; return res.status(200).json(apiRes); } // create account input.password = await LibPassword.hashPw(input.password); // hash password const respCreateUser = await UsersModels.create(input); // success response apiRes.meta = response[201].meta; apiRes.data = (await UsersModels.find(respCreateUser.insertId))[0]; return res.status(201).json(apiRes); } catch (e) { apiRes = JSON.parse(JSON.stringify(response[500])); apiRes.meta.message += Helper.setErrMsg(': ' + e.message); return res.status(500).json(apiRes); } } async login(req, res) { let apiRes = {} try { const now = moment().unix() // input validation const input = { email: req.body.email, password: req.body.password, }; const rulesInput = { email: 'required|email', password: 'required|string', }; const isInputValid = new Validator(input, rulesInput); if (isInputValid.fails()) { apiRes = JSON.parse(JSON.stringify(response[422])); apiRes.meta.message += Helper.setErrMsg(': ' + Object.values(isInputValid.errors.all())[0][0]); // get first message return res.status(200).json(apiRes); } // login const getUsers = await UsersModels.findEmail(input.email); if (getUsers.length < 1) { apiRes = JSON.parse(JSON.stringify(response[404])); return res.status(200).json(apiRes); } const isPwValid = await LibPassword.checkPw(getUsers[0].password, input.password); if (!isPwValid) { apiRes.meta = response['wrong_password'].meta; return res.status(200).json(apiRes); } await UsersModels.update({is_login: 1}, getUsers[0].id); // success response const jwt = await LibJwt.createToken({ uid: getUsers[0].id }); apiRes = JSON.parse(JSON.stringify(response[200])); apiRes.meta.message = 'success login'; apiRes.data = getUsers[0]; apiRes.token = jwt.token; return res.status(200).json(apiRes); } catch (e) { apiRes = JSON.parse(JSON.stringify(response[500])); apiRes.meta.message += Helper.setErrMsg(': ' + e.message); return res.status(500).json(apiRes); } } async profile(req, res) { let apiRes = {} try { const now = moment().unix(); const { uid } = req.jwt; const getUsers = await UsersModels.find(uid); if (getUsers.length < 1) { apiRes = JSON.parse(JSON.stringify(response[404])); return res.status(200).json(apiRes); } delete getUsers[0].password; apiRes = JSON.parse(JSON.stringify(response[200])); apiRes.data = getUsers[0]; return res.status(200).json(apiRes); } catch (e) { apiRes = JSON.parse(JSON.stringify(response[500])); apiRes.meta.message += Helper.setErrMsg(': ' + e.message); return res.status(500).json(apiRes); } } async logout(req, res) { let apiRes = {} try { const now = moment().unix(); const { uid } = req.jwt; const getUsers = await UsersModels.find(uid); if (getUsers.length < 1) { apiRes = JSON.parse(JSON.stringify(response[404])); return res.status(200).json(apiRes); } await UsersModels.update({is_login: 0}, uid); apiRes = JSON.parse(JSON.stringify(response[200])); apiRes.meta.message = 'success logout'; return res.status(200).json(apiRes); } catch (e) { apiRes = JSON.parse(JSON.stringify(response[500])); apiRes.meta.message += Helper.setErrMsg(': ' + e.message); return res.status(500).json(apiRes); } } } const object = new AuthController(); module.exports = object;