blog.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. .then(count => {
  35. return res.json({blogs: publishedBlogs, count, pageCount: Math.ceil(count / pageSize)});
  36. });
  37. });
  38. }
  39. exports.getMediumBlogs = (req, res) => {
  40. request.get(MEDIUM_URL, (err, apiRes, body) => {
  41. if (!err && apiRes.statusCode === 200) {
  42. let i = body.indexOf("{");
  43. const data = body.substr(i);
  44. res.send(data)
  45. } else {
  46. res.sendStatus(500).json(err);
  47. }
  48. });
  49. }
  50. exports.getBlogBySlug = (req, res) => {
  51. const slug = req.params.slug;
  52. Blog.findOne({slug})
  53. .populate('author -_id -password -products -email -role')
  54. .exec(function(errors, foundBlog) {
  55. if (errors) {
  56. return res.status(422).send(errors);
  57. }
  58. return res.json(foundBlog);
  59. });
  60. }
  61. exports.getBlogById = (req, res) => {
  62. const blogId = req.params.id;
  63. Blog.findById(blogId, (errors, foundBlog) => {
  64. if (errors) {
  65. return res.status(422).send(errors);
  66. }
  67. return res.json(foundBlog);
  68. });
  69. }
  70. exports.getUserBlogs = (req, res) => {
  71. const user = req.user;
  72. Blog.find({author: user.id}, function(errors, userBlogs) {
  73. if (errors) {
  74. return res.status(422).send(errors);
  75. }
  76. return res.json(userBlogs);
  77. });
  78. }
  79. exports.updateBlog = (req, res) => {
  80. const blogId = req.params.id;
  81. const blogData = req.body;
  82. Blog.findById(blogId, function(errors, foundBlog) {
  83. if (errors) {
  84. return res.status(422).send(errors);
  85. }
  86. if (blogData.status && blogData.status === 'published' && !foundBlog.slug) {
  87. foundBlog.slug = slugify(foundBlog.title, {
  88. replacement: '-', // replace spaces with replacement
  89. remove: null, // regex to remove characters
  90. lower: true // result in lower case
  91. });
  92. }
  93. foundBlog.set(blogData);
  94. foundBlog.updatedAt = new Date();
  95. foundBlog.save(function(errors, foundBlog) {
  96. if (errors) {
  97. return res.status(422).send(errors);
  98. }
  99. return res.json(foundBlog);
  100. });
  101. });
  102. }
  103. exports.createBlog = (req, res) => {
  104. const lockId = req.query.lockId;
  105. if (!lock.isBusy(lockId)) {
  106. lock.acquire(lockId, function(done) {
  107. const blogData = req.body;
  108. const blog = new Blog(blogData);
  109. blog.author = req.user;
  110. blog.save((errors, createdBlog) => {
  111. setTimeout(() => done(), 5000);
  112. if (errors) {
  113. return res.status(422).send(errors);
  114. }
  115. return res.json(createdBlog);
  116. });
  117. }, function(errors, ret) {
  118. errors && console.error(errors)
  119. });
  120. } else {
  121. return res.status(422).send({message: 'Blog is getting saved!'});
  122. }
  123. }
  124. exports.deleteBlog = (req, res) => {
  125. const blogId = req.params.id;
  126. Blog.deleteOne({_id: blogId}, function(errors) {
  127. if (errors) {
  128. return res.status(422).send(errors);
  129. }
  130. res.json({status: 'deleted'});
  131. });
  132. }