Skip to content
Snippets Groups Projects
appController.js 3.62 KiB
Newer Older
import UserModel from '../model/User.model.js';
import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';
import ENV from '../config.js'
/** POST: http://localhost:8080/api/register
 * @param : {
  "username" : "example123",
  "password" : "admin123",
  "email": "example@gmail.com",
  "profile": ""
}
*/
export async function register(req,res){

  try {
      const { username, password, profile, email } = req.body;        

      // Checking existing Username
      const existUsername = new Promise((resolve, reject) => {
          UserModel.findOne({ username }, function(err, user){
              if(err) reject(new Error(err))
              if(user) reject({ error : "Please use unique username"});

              resolve();
          })
      });

      // Checking existing Email
      const existEmail = new Promise((resolve, reject) => {
          UserModel.findOne({ email }, function(err, email){
              if(err) reject(new Error(err))
              if(email) reject({ error : "Please use unique Email"});

              resolve();
          })
      });


      Promise.all([existUsername, existEmail])
          .then(() => {
              if(password){
                  bcrypt.hash(password, 10)
                      .then( hashedPassword => {
                          
                          const user = new UserModel({
                              username,
                              password: hashedPassword,
                              profile: profile || '',
                              email
                          });

                          // return save result as a response
                          user.save()
                              .then(result => res.status(201).send({ msg: "User Registered Successfully"}))
                              .catch(error => res.status(500).send({error}))

                      }).catch(error => {
                          return res.status(500).send({
                              error : "Enable to hashed password"
                          })
                      })
              }
          }).catch(error => {
              return res.status(500).send({ error })
          })
  } catch (error) {
      return res.status(500).send(error);
  }
}

/** POST: http://localhost:8080/api/login 
 * @param: {
  "username" : "example123",
  "password" : "admin123"
}
*/
export async function login(req,res){
   
    const { username, password } = req.body;

    try {
        
        UserModel.findOne({ username })
            .then(user => {
                bcrypt.compare(password, user.password)
                    .then(passwordCheck => {

                        if(!passwordCheck) return res.status(400).send({ error: "Don't have Password"});

                        // create jwt token
                        const token = jwt.sign({
                                        userId: user._id,
                                        username : user.username
                                    }, ENV.JWT_SECRET , { expiresIn : "24h"});

                        return res.status(200).send({
                            msg: "Login Successful...!",
                            username: user.username,
                            token
                        });                                    

                    })
                    .catch(error =>{
                        return res.status(400).send({ error: "Password does not Match"})
                    })
            })
            .catch( error => {
                return res.status(404).send({ error : "Username not Found"});
            })

    } catch (error) {
        return res.status(500).send({ error});
    }