post.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. let express = require('express')
  2. let router = express.Router()
  3. const Errors = require('../lib/errors')
  4. let { User, Thread, Post } = require('../models')
  5. router.post('/', async (req, res) => {
  6. let validationErrors = []
  7. let thread, replyingToPost, post
  8. try {
  9. if(req.body.content === undefined) {
  10. validationErrors.push(Errors.missingParameter('content'))
  11. } else if(typeof req.body.content !== 'string') {
  12. validationErrors.push(Errors.invalidParamterType('content', 'string'))
  13. } if (req.body.threadId === undefined) {
  14. validationErrors.push(Errors.missingParameter('threadId'))
  15. } else if(!Object.isInteger(req.body.threadId)) {
  16. validationErrors.push(Errors.invalidParamterType('threadId', 'integer'))
  17. } if(req.body.replyingToId !== undefined && !Object.isInteger(req.body.replyingToId)) {
  18. validationErrors.push(Errors.invalidParamterType('replyingToId', 'integer'))
  19. }
  20. if(validationErrors) throw Errors.VALIDATION_ERROR
  21. post = await Post.create({
  22. content: req.body.content
  23. })
  24. thread = await Thread.findOne({ where: {
  25. id: req.body.threadId
  26. }})
  27. user = await User.findOne({ where: {
  28. username: req.session.username
  29. }})
  30. if(!thread) throw Errors.invalidParamter('threadId', 'thread does not exist')
  31. await post.setUser(user)
  32. await post.setThread(thread)
  33. await thread.addPost(post)
  34. if(req.body.replyingToId) {
  35. replyingToPost = await Post.findOne({ where: {
  36. id: req.body.replyingToId
  37. }, include: [Thread] })
  38. if(!replyingToPost) {
  39. throw Errors.invalidParamter('replyingToId', 'post does not exist')
  40. } else if(replyingToPost.Thread.id !== thread.id) {
  41. throw Errors.invalidParamter('replyingToId', 'replies must be in same thread')
  42. } else {
  43. await post.setReplyingTo(replyingToPost)
  44. await replyingToPost.addReplies(post)
  45. }
  46. }
  47. res.json(await post.reload({
  48. include: [
  49. { model: User, attributes: ['username', 'createdAt', 'updatedAt', 'id'] },
  50. Thread,
  51. { model: Post, as: 'ReplyingTo', include:
  52. [{ model: User, attributes: ['username', 'createdAt', 'updatedAt', 'id'] }]
  53. }
  54. ]
  55. }))
  56. } catch (e) {
  57. if(e === Errors.VALIDATION_ERROR) {
  58. res.status(400)
  59. res.json({
  60. errors: validationErrors
  61. })
  62. } else if(e.name === 'invalidParamter') {
  63. res.status(400)
  64. res.json({
  65. errors: [e]
  66. })
  67. } else {
  68. res.status(500)
  69. res.json({
  70. errors: [Errors.unknown]
  71. })
  72. }
  73. }
  74. })
  75. module.exports router