var router = require('express').Router(); var mongoose = require('mongoose'); var Article = mongoose.model('Article'); var Comment = mongoose.model('Comment'); var User = mongoose.model('User'); var auth = require('../auth'); // Preload article objects on routes with ':article' router.param('article', function (req, res, next, slug) { Article.findOne({ slug: slug }) .populate('author') .then(function (article) { if (!article) { return res.sendStatus(404); } req.article = article; return next(); }).catch(next); }); router.param('comment', function (req, res, next, id) { Comment.findById(id).then(function (comment) { if (!comment) { return res.sendStatus(404); } req.comment = comment; return next(); }).catch(next); }); router.get('/', auth.optional, function (req, res, next) { var query = {}; var limit = 20; var offset = 0; if (typeof req.query.limit !== 'undefined') { limit = req.query.limit; } if (typeof req.query.offset !== 'undefined') { offset = req.query.offset; } if (typeof req.query.membre !== 'undefined') { query.membre = req.query.membre; } if (typeof req.query.tag !== 'undefined') { query.tagList = { "$in": [req.query.tag] }; } Promise.all([ req.query.author ? User.findOne({ username: req.query.author }) : null, req.query.favorited ? User.findOne({ username: req.query.favorited }) : null ]).then(function (results) { var author = results[0]; var favoriter = results[1]; if (author) { query.author = author._id; } if (favoriter) { query._id = { $in: favoriter.favorites }; } else if (req.query.favorited) { query._id = { $in: [] }; } return Promise.all([ Article.find(query) .limit(Number(limit)) .skip(Number(offset)) .sort({ createdAt: 'desc' }) .populate('author') .exec(), Article.count(query).exec(), req.payload ? User.findById(req.payload.id) : null, ]).then(function (results) { var articles = results[0]; var articlesCount = results[1]; var user = results[2]; return res.json({ articles: articles.map(function (article) { return article.toJSONFor(user); }), articlesCount: articlesCount }); }); }).catch(next); }); router.get('/feed', auth.required, function (req, res, next) { var limit = 20; var offset = 0; if (typeof req.query.limit !== 'undefined') { limit = req.query.limit; } if (typeof req.query.offset !== 'undefined') { offset = req.query.offset; } User.findById(req.payload.id).then(function (user) { if (!user) { return res.sendStatus(401); } Promise.all([ Article.find({ author: { $in: user.following } }) .limit(Number(limit)) .skip(Number(offset)) .populate('author') .exec(), Article.count({ author: { $in: user.following } }) ]).then(function (results) { var articles = results[0]; var articlesCount = results[1]; return res.json({ articles: articles.map(function (article) { return article.toJSONFor(user); }), articlesCount: articlesCount }); }).catch(next); }); }); router.post('/', auth.required, function (req, res, next) { User.findById(req.payload.id).then(function (user) { if (!user) { return res.sendStatus(401); } var article = new Article(req.body.article); article.author = user; return article.save().then(function () { return res.json({ article: article.toJSONFor(user) }); }); }).catch(next); }); // return a article router.get('/:article', auth.optional, function (req, res, next) { Promise.all([ req.payload ? User.findById(req.payload.id) : null, req.article.populate('author') ]).then(function (results) { var user = results[0]; return res.json({ article: req.article.toJSONFor(user) }); }).catch(next); }); // update article // 6440016ef84d788c1b352018 router.put('/:article', auth.required, function (req, res, next) { User.findById(req.payload.id).then(function (user) { if (req.article.author._id.toString() === req.payload.id.toString()) { if (typeof req.body.article.title !== 'undefined') { req.article.title = req.body.article.title; } if (typeof req.body.article.description !== 'undefined') { req.article.description = req.body.article.description; } if (typeof req.body.article.body !== 'undefined') { req.article.body = req.body.article.body; } if (typeof req.body.article.tagList !== 'undefined') { req.article.tagList = req.body.article.tagList } if (typeof req.body.article.membre !== 'undefined') { req.article.membre = req.body.article.membre; } req.article.save().then(function (article) { return res.json({ article: article.toJSONFor(user) }); }).catch(next); } else { return res.sendStatus(403); } }); }); // delete article router.delete('/:article', auth.required, function (req, res, next) { User.findById(req.payload.id).then(function (user) { if (!user) { return res.sendStatus(401); } if (req.article.author._id.toString() === req.payload.id.toString()) { return req.article.remove().then(function () { return res.sendStatus(204); }); } else { return res.sendStatus(403); } }).catch(next); }); // Favorite an article router.post('/:article/favorite', auth.required, function (req, res, next) { var articleId = req.article._id; User.findById(req.payload.id).then(function (user) { if (!user) { return res.sendStatus(401); } return user.favorite(articleId).then(function () { return req.article.updateFavoriteCount().then(function (article) { return res.json({ article: article.toJSONFor(user) }); }); }); }).catch(next); }); // Unfavorite an article router.delete('/:article/favorite', auth.required, function (req, res, next) { var articleId = req.article._id; User.findById(req.payload.id).then(function (user) { if (!user) { return res.sendStatus(401); } return user.unfavorite(articleId).then(function () { return req.article.updateFavoriteCount().then(function (article) { return res.json({ article: article.toJSONFor(user) }); }); }); }).catch(next); }); // return an article's comments router.get('/:article/comments', auth.optional, function (req, res, next) { Promise.resolve(req.payload ? User.findById(req.payload.id) : null).then(function (user) { return req.article.populate({ path: 'comments', populate: { path: 'author' }, options: { sort: { createdAt: 'desc' } } }).then(function (article) { return res.json({ comments: req.article.comments.map(function (comment) { return comment.toJSONFor(user); }) }); }); }).catch(next); }); // create a new comment router.post('/:article/comments', auth.required, function (req, res, next) { User.findById(req.payload.id).then(function (user) { if (!user) { return res.sendStatus(401); } var comment = new Comment(req.body.comment); comment.article = req.article; comment.author = user; return comment.save().then(function () { req.article.comments.push(comment); return req.article.save().then(function (article) { res.json({ comment: comment.toJSONFor(user) }); }); }); }).catch(next); }); router.delete('/:article/comments/:comment', auth.required, function (req, res, next) { if (req.comment.author.toString() === req.payload.id.toString()) { req.article.comments.remove(req.comment._id); req.article.save() .then(Comment.find({ _id: req.comment._id }).remove().exec()) .then(function () { res.sendStatus(204); }); } else { res.sendStatus(403); } }); module.exports = router;