blog.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. const Blog = require('../models/blog');
  2. const slugify = require('slugify');
  3. const request = require('request');
  4. const AsyncLock = require('async-lock');
  5. const lock = new AsyncLock();
  6. const MEDIUM_URL = "https://medium.com/@filipjerga/latest?format=json&limit=20";
  7. function parseFilters(queries) {
  8. const parsedQueries = {};
  9. if (queries.filter) {
  10. Object.keys(queries).forEach((qKey) => {
  11. if (qKey.includes('filter')) {
  12. const pKey = qKey.match(/\[([^)]+)\]/)[1]
  13. parsedQueries[pKey] = queries[qKey]
  14. }
  15. })
  16. }
  17. return parsedQueries
  18. }
  19. exports.getBlogs = (req, res) => {
  20. const pageSize = parseInt(req.query.pageSize) || 0;
  21. const pageNum = parseInt(req.query.pageNum) || 1;
  22. const skips = pageSize * (pageNum - 1);
  23. const filters = req.query.filter || {}
  24. Blog.find({status: 'published', ...filters})
  25. .sort({'createdAt': -1})
  26. .populate('author -_id -password -products -email -role')
  27. .skip(skips)
  28. .limit(pageSize)
  29. .exec(function(errors, publishedBlogs) {
  30. if (errors) {
  31. return res.status(422).send(errors);
  32. }
  33. // Blog.count({})
  34. Blog.count({status: 'published'})
  35. .then(count => {
  36. return res.json({blogs: publishedBlogs, count, pageCount: Math.ceil(count / pageSize)});
  37. });
  38. });
  39. }
  40. exports.getMediumBlogs = (req, res) => {
  41. request.get(MEDIUM_URL, (err, apiRes, body) => {
  42. if (!err && apiRes.statusCode === 200) {
  43. let i = body.indexOf("{");
  44. const data = body.substr(i);
  45. res.send(data)
  46. } else {
  47. res.sendStatus(500).json(err);
  48. }
  49. });
  50. }
  51. exports.getBlogBySlug = (req, res) => {
  52. const slug = req.params.slug;
  53. Blog.findOne({slug})
  54. .populate('author -_id -password -products -email -role')
  55. .exec(function(errors, foundBlog) {
  56. if (errors) {
  57. return res.status(422).send(errors);
  58. }
  59. return res.json(foundBlog);
  60. });
  61. }
  62. exports.getBlogById = (req, res) => {
  63. const blogId = req.params.id;
  64. Blog.findById(blogId, (errors, foundBlog) => {
  65. if (errors) {
  66. return res.status(422).send(errors);
  67. }
  68. return res.json(foundBlog);
  69. });
  70. }
  71. exports.getUserBlogs = (req, res) => {
  72. const user = req.user;
  73. Blog.find({author: user.id}, function(errors, userBlogs) {
  74. if (errors) {
  75. return res.status(422).send(errors);
  76. }
  77. return res.json(userBlogs);
  78. });
  79. }
  80. exports.updateBlog = (req, res) => {
  81. const blogId = req.params.id;
  82. const blogData = req.body;
  83. Blog.findById(blogId, function(errors, foundBlog) {
  84. if (errors) {
  85. return res.status(422).send(errors);
  86. }
  87. if (blogData.status && blogData.status === 'published' && !foundBlog.slug) {
  88. foundBlog.slug = slugify(foundBlog.title, {
  89. replacement: '-', // replace spaces with replacement
  90. remove: null, // regex to remove characters
  91. lower: true // result in lower case
  92. });
  93. }
  94. foundBlog.set(blogData);
  95. foundBlog.updatedAt = new Date();
  96. foundBlog.save(function(errors, foundBlog) {
  97. if (errors) {
  98. return res.status(422).send(errors);
  99. }
  100. return res.json(foundBlog);
  101. });
  102. });
  103. }
  104. exports.createBlog = (req, res) => {
  105. const lockId = req.query.lockId;
  106. if (!lock.isBusy(lockId)) {
  107. lock.acquire(lockId, function(done) {
  108. const blogData = req.body;
  109. const blog = new Blog(blogData);
  110. blog.author = req.user;
  111. blog.save((errors, createdBlog) => {
  112. setTimeout(() => done(), 5000);
  113. if (errors) {
  114. return res.status(422).send(errors);
  115. }
  116. return res.json(createdBlog);
  117. });
  118. }, function(errors, ret) {
  119. errors && console.error(errors)
  120. });
  121. } else {
  122. return res.status(422).send({message: 'Blog is getting saved!'});
  123. }
  124. }
  125. exports.deleteBlog = (req, res) => {
  126. const blogId = req.params.id;
  127. Blog.deleteOne({_id: blogId}, function(errors) {
  128. if (errors) {
  129. return res.status(422).send(errors);
  130. }
  131. res.json({status: 'deleted'});
  132. });
  133. }