const express = require('express');
const router = express.Router({ mergeParams: true });
// Parameter middleware
router.param('userId', (req, res, next, id) => {
User.findById(id)
.then(user => {
if (!user) {
const error = new Error('User not found');
error.status = 404;
throw error;
}
req.user = user;
next();
})
.catch(next);
});
// Authentication middleware
const requireAuth = (req, res, next) => {
if (!req.headers.authorization) {
return res.status(401).json({ error: 'No credentials provided' });
}
next();
};
// Apply auth to all routes
router.use(requireAuth);
// Route handlers
router.route('/users')
.get((req, res) => {
User.find()
.then(users => res.json(users))
.catch(err => res.status(500).json({ error: err.message }));
})
.post((req, res) => {
User.create(req.body)
.then(user => res.status(201).json(user))
.catch(err => res.status(400).json({ error: err.message }));
});
router.route('/users/:userId')
.get((req, res) => {
res.json(req.user);
})
.put((req, res) => {
Object.assign(req.user, req.body);
req.user.save()
.then(user => res.json(user))
.catch(err => res.status(400).json({ error: err.message }));
})
.delete((req, res) => {
req.user.remove()
.then(() => res.status(204).end())
.catch(err => res.status(500).json({ error: err.message }));
});
// Nested routes
const postsRouter = express.Router({ mergeParams: true });
postsRouter.get('/', (req, res) => {
Post.find({ userId: req.user.id })
.then(posts => res.json(posts))
.catch(err => res.status(500).json({ error: err.message }));
});
postsRouter.post('/', (req, res) => {
Post.create({ ...req.body, userId: req.user.id })
.then(post => res.status(201).json(post))
.catch(err => res.status(400).json({ error: err.message }));
});
router.use('/users/:userId/posts', postsRouter);
// Error handling
router.use((err, req, res, next) => {
res.status(err.status || 500).json({
error: err.message,
stack: process.env.NODE_ENV === 'development' ? err.stack : undefined
});
});
module.exports = router;