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
|
|
};
|