97 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.2 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);
 | |
|     });
 | |
|   });
 | |
| };
 | |
| 
 | |
| const logout = (req, res) => {
 | |
|   req.logout();
 | |
|   res.redirect("/");
 | |
| };
 | |
| 
 | |
| module.exports = {
 | |
|   register,
 | |
|   authenticate,
 | |
|   login,
 | |
|   logout
 | |
| };
 |