const User = require('../models/User') const {body, validationResult} = require('express-validator') const bcrypt = require('bcryptjs') const jwt = require('jsonwebtoken') const sharp = require('sharp') const {secretKey, getID} = require('./../authentication') const {_sr} = require('../plugins/serverResponses') const {res404, res500, hasWhiteSpaces, isLatinCharactersWithSymbol, generateRandomDigits, removeWhiteSpaces, checkValidations} = require('../plugins/controllersHelperFunctions') const fs = require('fs') const moment = require('moment-jalaali') module.exports.create_admin = [ [ body('username') .notEmpty().withMessage(_sr['fa'].required.username) .bail() .custom((value, {req}) => { if (hasWhiteSpaces(value)) return Promise.reject(_sr['fa'].response.whiteSpace) return User.findOne({username: value}).then(user => { if (user) return Promise.reject(_sr['fa'].duplicated.username) else return true }) }), body('password') .custom((value, {req}) => { if (hasWhiteSpaces(value)) return Promise.reject(_sr['fa'].response.whiteSpace) if (removeWhiteSpaces(value).length < 4) return Promise.reject(_sr['fa'].min_char.min4) if (value !== req.body.password_confirmation) return Promise.reject(_sr['fa'].response.passwords_not_match) else return true }) ], checkValidations(validationResult), async (req, res) => { const {username, password} = req.body const data = {username, scope: ['admin']} try { const salt = await bcrypt.genSalt(10) const hash = await bcrypt.hash(password, salt) data.password = hash const admin = new User(data) await admin.save() return res.json({message: _sr['fa'].response.success_save}) } catch (e) { return res500(res, e) } } ] /////////////////////////////////////////////////////////////////////// login module.exports.login = [ [ body('username') .isLength({min: 4}).withMessage(_sr['fa'].min_char.min4) .bail() .if((value, {req}) => { return req.body.password && req.body.password.length >= 4 }) .custom((value, {req}) => { return User.findOne({$or: [{email: value.toLowerCase()}, {username: value}]}) .then(user => { if (!user) return Promise.reject(_sr['fa'].not_found.password) else return true }) }), body('password') .notEmpty().withMessage(_sr['fa'].required.password) .bail() .isLength({min: 4}).withMessage(_sr['fa'].min_char.min4), body('remember_me') .exists().withMessage(_sr['fa'].required.remember_me) .bail() .isBoolean().withMessage(_sr['fa'].format.boolean) ], checkValidations(validationResult), (req, res) => { User.findOne({$or: [{email: req.body.username.toLowerCase()}, {username: req.body.username}]}, (err, user) => { if (err || !user) return res404(res, err) bcrypt.compare(req.body.password, user.password, (err, isMatch) => { if (err || !isMatch) return res.status(422).json({validation: {username: {msg: _sr['fa'].not_found.password}}}) if (user.token) { jwt.verify(user.token.replace(/^Bearer\s/, ''), secretKey, (err, decoded) => { if (err) { let token = jwt.sign({_id: user._id}, secretKey, {expiresIn: req.body.remember_me ? '7d' : '1h'}) user.token = token user.save(err => { if (err) console.log(err) return res.json({token: token}) }) } else return res.json({token: user.token}) }) } else { let token = jwt.sign({_id: user._id}, secretKey, {expiresIn: req.body.remember_me ? '7d' : '1h'}) user.token = token user.save(err => { if (err) console.log(err) return res.json({token: token}) }) } }) }) } ] /////////////////////////////////////////////////////////////////////// logout module.exports.logout = [ (req, res) => { const token = req.headers.authorization if (token) { User.findOneAndUpdate({token: token}, {token: null}, (err, oldData) => { if (err || !oldData) res.status(401).json({message: 'Your not logged in'}) else return res.json({message: 'You are logged out.'}) }) } else { return res.status(401).json({message: 'Your not logged in'}) } } ] /////////////////////////////////////////////////////////////////////// get user module.exports.getUser = [ (req, res) => { const token = req.headers.authorization if (token) { jwt.verify(token, secretKey, (err, decoded) => { if (err) return res.status(401).json({message: 'unauthenticated'}) User.findById(decoded._id, (err, user) => { if (err || !user) return res404(res, err) else return res.json({user: user}) }) }) } else { return res.status(401).json({message: 'unauthenticated'}) } } ]