thread.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. let express = require('express')
  2. let router = express.Router()
  3. const Errors = require('../lib/errors.js')
  4. let { User, Thread, Category } = require('../models')
  5. router.get('/:thread_id', async (req, res) => {
  6. try {
  7. let limit = +req.query.limit || 10
  8. let whereObj = { id: req.params.thread_id }
  9. if(req.query.start) {
  10. whereObj.createdAt = { $lt: req.query.start }
  11. }
  12. let thread = await Thread.findAll({
  13. where: whereObj,
  14. limit: limit,
  15. order: [['createdAt', 'DESC']],
  16. include: Thread.includeOptions()
  17. })
  18. if(!thread) throw Errors.invalidParameter('id', 'thread does not exist')
  19. let meta = { limit: limit, next: null }
  20. if(thread.Posts.length) {
  21. let lastPost = thread.Posts.slice(-1)[0]
  22. meta.next = lastPost.createdAt
  23. }
  24. res.json({
  25. meta: meta,
  26. thread: thread.toJSON()
  27. })
  28. } catch (e) {
  29. if(e.name === 'invalidParameter') {
  30. res.status(400)
  31. res.json({
  32. errors: [e]
  33. })
  34. } else {
  35. console.log(e)
  36. res.status(500)
  37. res.json({
  38. errors: [Errors.unknown]
  39. })
  40. }
  41. }
  42. })
  43. router.all('*', (req, res, next) => {
  44. if(req.session.loggedIn) {
  45. next()
  46. } else {
  47. res.status(401)
  48. res.json({
  49. errors: [Errors.requestNotAuthorized]
  50. })
  51. }
  52. })
  53. router.post('/', async (req, res) => {
  54. let validationErrors = []
  55. try {
  56. if(req.body.name === undefined) {
  57. validationErrors.push(Errors.missingParameter('name'))
  58. } else if(typeof req.body.name !== 'string') {
  59. validationErrors.push(Errors.invalidParameterType('name', 'string'))
  60. }
  61. if(req.body.category === undefined) {
  62. validationErrors.push(Errors.missingParameter('category'))
  63. } else if(typeof req.body.category !== 'string') {
  64. validationErrors.push(Errors.invalidParameterType('category', 'string'))
  65. }
  66. if(validationErrors.length) throw Errors.VALIDATION_ERROR
  67. let category = await Category.findOne({ where: {
  68. name: req.body.category
  69. }})
  70. if(!category) throw Errors.invalidCategory
  71. let user = await User.findOne({ where: {
  72. username: req.session.username
  73. }})
  74. let thread = await Thread.create({
  75. name: req.body.name
  76. })
  77. await thread.setCategory(category)
  78. await thread.setUser(user)
  79. res.json(await thread.reload({
  80. include: [
  81. { model: User, attributes: ['username', 'createdAt', 'updatedAt', 'id'] },
  82. Category
  83. ]
  84. }))
  85. } catch (e) {
  86. if(e === Errors.VALIDATION_ERROR) {
  87. res.status(400)
  88. res.json({
  89. errors: validationErrors
  90. })
  91. } else if(e === Errors.invalidCategory) {
  92. res.status(400)
  93. res.json({
  94. errors: [Errors.invalidCategory]
  95. })
  96. } else {
  97. console.log(e)
  98. res.status(500)
  99. res.json({
  100. errors: [Errors.unknown]
  101. })
  102. }
  103. }
  104. })
  105. module.exports = router