diff --git a/.gitignore b/.gitignore index b740f61..2d8bf39 100644 --- a/.gitignore +++ b/.gitignore @@ -62,5 +62,3 @@ sonar.properties **/*.copy.ts **/*.copy.scss **/*.copy.html - -middlewares diff --git a/middlewares/asyncHandler.js b/middlewares/asyncHandler.js new file mode 100644 index 0000000..f3c8b1f --- /dev/null +++ b/middlewares/asyncHandler.js @@ -0,0 +1,7 @@ +const asyncHandler = (fn) => (req, res, next) => { + Promise.resolve(fn(req, res, next)).catch((err) => { + next(err); + }); +}; + +module.exports = asyncHandler; diff --git a/middlewares/auth.js b/middlewares/auth.js new file mode 100644 index 0000000..17178d7 --- /dev/null +++ b/middlewares/auth.js @@ -0,0 +1,30 @@ +const { verify } = require("../util/jwt"); +const User = require("../models/User"); +const ErrorResponse = require("../util/errorResponse"); + +exports.protect = async (req, res, next) => { + try { + const { headers } = req; + if (!headers.authorization) return next(); + + const token = headers.authorization.split(" ")[1]; + if (!token) throw new SyntaxError("Token missing or malformed"); + + const userVerified = await verify(token); + if (!userVerified) throw new Error("Invalid Token"); + + req.loggedUser = await User.findOne({ + attributes: { exclude: ["email", "password"] }, + where: { email: userVerified.email }, + }); + + if (!req.loggedUser) next(new NotFoundError("User")); + + headers.email = userVerified.email; + req.loggedUser.dataValues.token = token; + + next(); + } catch (error) { + next(error); + } +}; diff --git a/middlewares/errorHandler.js b/middlewares/errorHandler.js new file mode 100644 index 0000000..f6a7621 --- /dev/null +++ b/middlewares/errorHandler.js @@ -0,0 +1,22 @@ +const ErrorResponse = require("../util/errorResponse"); + +//REQUESTED PAGE IS NOT FOUND +module.exports.notFound = (req, res, next) => { + const error = new ErrorResponse(`Not Found - ${req.originalUrl}`); + res.status(404); + next(error); +}; + +module.exports.errorHandler = (err, req, res, next) => { + // Log to console for dev + console.log(err.message.red); + console.log(err.stack.red); + + const statusCode = err.statusCode ? err.statusCode : 500; + + res.status(statusCode).json({ + errors: { + body: [err.message], + }, + }); +};