Advertisement
Guest User

Untitled

a guest
Apr 16th, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Joi from 'joi'
  2.  
  3. import { POST } from 'Constants/methods'
  4. import { ANY } from 'Constants/ranks'
  5. import Log from 'Logger'
  6. import Users from 'Models/users'
  7. import { createToken } from 'Helpers/auth'
  8. import { comparePassword } from 'Helpers/auth'
  9. import { userToPublic } from 'Utils/users'
  10.  
  11. const schema = {
  12.     body: {
  13.         email: Joi.string().email().required(),
  14.         password: Joi.string().min(8).max(64).required()
  15.     }
  16. }
  17.  
  18. const findUser = (request, response, next) => {
  19.     let credentials = request.body
  20.  
  21.     Users.findOne({
  22.         where: {
  23.             email: credentials.email
  24.         }
  25.     })
  26.         .then(user => {
  27.  
  28.             if (!user) {
  29.                 return response.boom.badRequest('Unknown user')
  30.             }
  31.  
  32.             request.datas = {
  33.                 credentials,
  34.                 user
  35.             }
  36.  
  37.             next()
  38.         })
  39.         .catch(error => {
  40.             response.boom.serverUnavailable('Database error')
  41.             Log.error('Error while fetching an user in database', credentials, error)
  42.         })
  43. }
  44.  
  45. const checkPassword = (request, response, next) => {
  46.     let { credentials, user } = request.datas
  47.  
  48.     comparePassword(credentials.password, user.password)
  49.         .then(isValid => {
  50.             if (!isValid) {
  51.                 return response.boom.badRequest('Bad password')
  52.             }
  53.  
  54.             next()
  55.         })
  56.         .catch(error => {
  57.             response.boom.badImplementation('Internal servor error')
  58.             Log.error('Error while comparing user password', credentials, user, error)
  59.         })
  60. }
  61.  
  62. const sendCookie = (request, response) => {
  63.     let { credentials, user } = request.datas
  64.  
  65.     const payload = {
  66.         email: credentials.email,
  67.         rank: user.rank,
  68.         id: user.id
  69.     }
  70.  
  71.     const token = createToken(payload)
  72.  
  73.     response.cookie('token', token)
  74.     response.status(200).json(userToPublic(user))
  75. }
  76.  
  77. export default  {
  78.     type: POST,
  79.     path: '/login',
  80.     rank: ANY,
  81.     handlers: [
  82.         findUser,
  83.         checkPassword,
  84.         sendCookie
  85.     ],
  86.     schema
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement