55 lines
1.5 KiB
JavaScript
55 lines
1.5 KiB
JavaScript
const logger = require('./logger')
|
|
const jwt = require('jsonwebtoken')
|
|
const User = require('../models/user')
|
|
|
|
const requestLogger = (request, response, next) => {
|
|
logger.info('Method:', request.method)
|
|
logger.info('Path: ', request.path)
|
|
logger.info('Body: ', request.body)
|
|
logger.info('---')
|
|
next()
|
|
}
|
|
|
|
const unknownEndpoint = (request, response) => {
|
|
response.status(404).send({ error: 'unknown endpoint' })
|
|
}
|
|
|
|
const errorHandler = (error, request, response, next) => {
|
|
logger.error(error.message)
|
|
|
|
if (error.name === 'CastError') {
|
|
return response.status(400).send({ error: 'malformatted id' })
|
|
} else if (error.name === 'ValidationError') {
|
|
return response.status(400).json({ error: error.message })
|
|
} else if (error.name === 'JsonWebTokenError') {
|
|
return response.status(400).json({ error: error.message })
|
|
} else if (error.name === 'TokenExpiredError') {
|
|
return response.status(401).json({ error: 'token expired' })
|
|
}
|
|
|
|
next(error)
|
|
}
|
|
|
|
const tokenExtractor = (request, response, next) => {
|
|
const authorization = request.get('authorization')
|
|
if (authorization && authorization.startsWith('Bearer ')) {
|
|
request.token = authorization.replace('Bearer ', '')
|
|
}
|
|
next()
|
|
}
|
|
|
|
const userExtractor = async (request, response, next) => {
|
|
if (!request.token) return next()
|
|
const decodedToken = jwt.verify(request.token, process.env.SECRET)
|
|
const user = await User.findById(decodedToken.id)
|
|
request.user = user
|
|
next()
|
|
}
|
|
|
|
module.exports = {
|
|
requestLogger,
|
|
unknownEndpoint,
|
|
errorHandler,
|
|
tokenExtractor,
|
|
userExtractor
|
|
} |