diff --git a/api/chatHistory.js b/api/controllers/chatController.js similarity index 68% rename from api/chatHistory.js rename to api/controllers/chatController.js index 9578176..fb3d8b6 100644 --- a/api/chatHistory.js +++ b/api/controllers/chatController.js @@ -8,19 +8,23 @@ const getAllHistory = (req, res) => { return history(page, limit) .then(messages => res.json(messages)) - .catch(error => res.status(500).json({ - message: error.message, - success: false - })); + .catch(error => + res.status(500).json({ + message: error.message, + success: false + }) + ); }; const deleteHistory = (req, res) => { return clearHistory() .then(message => res.json(message)) - .catch(error => res.status(500).json({ - message: error.message, - success: false - })); + .catch(error => + res.status(500).json({ + message: error.message, + success: false + }) + ); }; module.exports = { diff --git a/api/controllers/userController.js b/api/controllers/userController.js new file mode 100644 index 0000000..5e6ed96 --- /dev/null +++ b/api/controllers/userController.js @@ -0,0 +1,49 @@ +const path = require("path"); +const userRepository = require(path.join(__dirname, "../user")); + +function register(req, res, next) { + const { username, password } = req.body; + + return userRepository + .register(username, password) + .then(user => userRepository.login(req, user)) + .then(_ => + res.send({ + messsage: `Bruker registrert. Velkommen ${username}`, + success: true + }) + ) + .catch(error => { + const { statusCode, message } = error; + + return res.status(statusCode || 500).send({ + message: message || "Unable to sign in with given username and passowrd", + success: false + }); + }); +} + +const login = (req, res, next) => { + return userRepository + .authenticate(req) + .then(user => userRepository.login(req, user)) + .then(user => { + res.send({ + message: `Velkommen ${user.username}`, + success: true + }); + }) + .catch(error => { + const { statusCode, message } = error; + + return res.status(statusCode || 500).send({ + message: message || "Unable to sign in with given username and passowrd", + success: false + }); + }); +}; + +module.exports = { + register, + login +}; diff --git a/api/user.js b/api/user.js index 7a2ce9e..654cb43 100644 --- a/api/user.js +++ b/api/user.js @@ -1,42 +1,86 @@ const passport = require("passport"); const path = require("path"); const User = require(path.join(__dirname, "/schemas/User")); -const router = require("express").Router(); -const register = (req, res, next) => { - User.register( - new User({ username: req.body.username }), - req.body.password, - function(err) { - if (err) { - if (err.name == "UserExistsError") - res.status(409).send({ success: false, message: err.message }) - else if (err.name == "MissingUsernameError" || err.name == "MissingPasswordError") - res.status(400).send({ success: false, message: err.message }) - return next(err); - } +class UserExistsError extends Error { + constructor(message = "Username already exists.") { + super(message); + this.name = "UserExists"; + this.statusCode = 409; + } +} - return res.status(200).send({ message: "Bruker registrert. Velkommen " + req.body.username, success: true }) - } - ); +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 login = (req, res, next) => { - passport.authenticate("local", function(err, user, info) { - if (err) { - if (err.name == "MissingUsernameError" || err.name == "MissingPasswordError") - return res.status(400).send({ message: err.message, success: false }) - return next(err); - } +const authenticate = req => { + return new Promise((resolve, reject) => { + const { username, password } = req.body; - if (!user) return res.status(404).send({ message: "Incorrect username or password", success: false }) + if (username == undefined) throw new MissingUsernameError(); + if (password == undefined) throw new MissingPasswordError(); - req.logIn(user, (err) => { - if (err) { return next(err) } + passport.authenticate("local", function(err, user, info) { + if (err) { + reject(err); + } - return res.status(200).send({ message: "Velkommen " + user.username, success: true }) - }) - })(req, res, next); + 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) => { @@ -46,6 +90,7 @@ const logout = (req, res) => { module.exports = { register, + authenticate, login, logout };