log.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. let express = require('express')
  2. let router = express.Router()
  3. const Errors = require('../lib/errors')
  4. let { Sequelize, Log, Thread, User } = require('../models')
  5. router.post('/', async (req, res) => {
  6. try {
  7. let thread, user
  8. if(req.body.route === 'thread') {
  9. thread = await Thread.findById(req.body.resourceId)
  10. if(!thread) throw Errors.sequelizeValidation(Sequelize, {
  11. error: 'thread does not exist',
  12. value: req.body.resourceId
  13. })
  14. } else if(
  15. req.body.route === 'userPosts' ||
  16. req.body.route === 'userThreads'
  17. ) {
  18. user = await User.findById(req.body.resourceId)
  19. if(!user) throw Errors.sequelizeValidation(Sequelize, {
  20. error: 'user does not exist',
  21. value: req.body.resourceId
  22. })
  23. } else if(
  24. (req.body.route === 'settingsGeneral' ||
  25. req.body.route === 'settingsAccount') &&
  26. !req.session.loggedIn
  27. ) {
  28. throw Errors.requestNotAuthorized
  29. }
  30. let log = await Log.create({
  31. route: req.body.route
  32. })
  33. if(thread) await log.setThread(thread)
  34. if(user) await log.setUser(user)
  35. if(req.session.username) {
  36. let sessionUser = await User.findOne({
  37. where: { username: req.session.username }
  38. })
  39. await log.setSessionUser(sessionUser)
  40. }
  41. res.json(log.toJSON())
  42. } catch (e) {
  43. if(e.name in Errors) {
  44. res.status(401)
  45. res.json({
  46. errors: [e]
  47. })
  48. } else if(e instanceof Sequelize.ValidationError) {
  49. res.status(400)
  50. res.json(e)
  51. } else {
  52. console.log(e)
  53. res.status(500)
  54. res.json({
  55. errors: [Errors.unknown]
  56. })
  57. }
  58. }
  59. })
  60. router.all('*', (req, res, next) => {
  61. if(req.session.admin) {
  62. next()
  63. } else {
  64. res.status(401)
  65. res.json({
  66. errors: [Errors.requestNotAuthorized]
  67. })
  68. }
  69. })
  70. router.get('/top-threads', async (req, res) => {
  71. try {
  72. let logs = await Log.findAll({
  73. where: {
  74. createdAt: {
  75. $gt: new Date(Date.now() - 1000*60*60*24)
  76. },
  77. route: 'thread'
  78. },
  79. include: [Thread]
  80. })
  81. //Sum each log for a thread
  82. let pageViewsObj = logs.reduce((obj, log) => {
  83. if(!obj[log.Thread.id]) {
  84. obj[log.Thread.id] = { Thread: log.Thread, pageViews: 1 }
  85. } else {
  86. obj[log.Thread.id].pageViews++
  87. }
  88. return obj
  89. }, {})
  90. //Transform to array
  91. let pageViewsArr = Object.keys(pageViewsObj).map(id => {
  92. return pageViewsObj[id]
  93. })
  94. //Sort by number of page views descending
  95. let sortedPageViewsArr = pageViewsArr.sort((a, b) => {
  96. if(a.pageViews < b.pageViews) {
  97. return 1
  98. } else if (a.pageViews > b.pageViews) {
  99. return -1
  100. } else {
  101. return 0
  102. }
  103. })
  104. //Return top 3
  105. res.json(sortedPageViewsArr.slice(0, 3))
  106. } catch (e) {
  107. res.status(500)
  108. res.json({
  109. errors: [Errors.unknown]
  110. })
  111. }
  112. })
  113. module.exports = router