This repository has been archived on 2025-12-11. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
fullstack-open/part4/bloglist/utils/middleware.js
Andrew Trieu a9b6ade2f4 Upload 4.23
2023-06-10 15:11:13 +03:00

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
}