91 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const passport = require("passport");
 | 
						|
const path = require("path");
 | 
						|
const User = require(path.join(__dirname, "/schemas/User"));
 | 
						|
 | 
						|
class UserExistsError extends Error {
 | 
						|
  constructor(message = "Username already exists.") {
 | 
						|
    super(message);
 | 
						|
    this.name = "UserExists";
 | 
						|
    this.statusCode = 409;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
class MissingUsernameError extends Error {
 | 
						|
  constructor(message = "No username given.") {
 | 
						|
    super(message);
 | 
						|
    this.name = "MissingUsernameError";
 | 
						|
    this.statusCode = 400;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
class MissingPasswordError extends Error {
 | 
						|
  constructor(message = "No password given.") {
 | 
						|
    super(message);
 | 
						|
    this.name = "MissingPasswordError";
 | 
						|
    this.statusCode = 400;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
class IncorrectUserCredentialsError extends Error {
 | 
						|
  constructor(message = "Incorrect username or password") {
 | 
						|
    super(message);
 | 
						|
    this.name = "IncorrectUserCredentialsError";
 | 
						|
    this.statusCode = 404;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function userAuthenticationErrorHandler(err) {
 | 
						|
  if (err.name == "UserExistsError") {
 | 
						|
    throw new UserExistsError(err.message);
 | 
						|
  } else if (err.name == "MissingUsernameError") {
 | 
						|
    throw new MissingUsernameError(err.message);
 | 
						|
  } else if (err.name == "MissingPasswordError") {
 | 
						|
    throw new MissingPasswordError(err.message);
 | 
						|
  }
 | 
						|
 | 
						|
  throw err;
 | 
						|
}
 | 
						|
 | 
						|
const register = (username, password) => {
 | 
						|
  return User.register(new User({ username: username }), password).catch(userAuthenticationErrorHandler);
 | 
						|
};
 | 
						|
 | 
						|
const authenticate = req => {
 | 
						|
  return new Promise((resolve, reject) => {
 | 
						|
    const { username, password } = req.body;
 | 
						|
 | 
						|
    if (username == undefined) throw new MissingUsernameError();
 | 
						|
    if (password == undefined) throw new MissingPasswordError();
 | 
						|
 | 
						|
    passport.authenticate("local", function(err, user, info) {
 | 
						|
      if (err) {
 | 
						|
        reject(err);
 | 
						|
      }
 | 
						|
 | 
						|
      if (!user) {
 | 
						|
        reject(new IncorrectUserCredentialsError());
 | 
						|
      }
 | 
						|
 | 
						|
      resolve(user);
 | 
						|
    })(req);
 | 
						|
  });
 | 
						|
};
 | 
						|
 | 
						|
const login = (req, user) => {
 | 
						|
  return new Promise((resolve, reject) => {
 | 
						|
    req.logIn(user, err => {
 | 
						|
      if (err) {
 | 
						|
        reject(err);
 | 
						|
      }
 | 
						|
 | 
						|
      resolve(user);
 | 
						|
    });
 | 
						|
  });
 | 
						|
};
 | 
						|
 | 
						|
module.exports = {
 | 
						|
  register,
 | 
						|
  authenticate,
 | 
						|
  login
 | 
						|
};
 |