admin.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. 'use strict'
  2. var express = require('express')
  3. var router = express.Router()
  4. const Promise = require('bluebird')
  5. const validator = require('validator')
  6. const _ = require('lodash')
  7. /**
  8. * Admin
  9. */
  10. router.get('/', (req, res) => {
  11. res.redirect('/admin/profile')
  12. })
  13. router.get('/profile', (req, res) => {
  14. if (res.locals.isGuest) {
  15. return res.render('error-forbidden')
  16. }
  17. res.render('pages/admin/profile', { adminTab: 'profile' })
  18. })
  19. router.post('/profile', (req, res) => {
  20. if (res.locals.isGuest) {
  21. return res.render('error-forbidden')
  22. }
  23. return db.User.findById(req.user.id).then((usr) => {
  24. usr.name = _.trim(req.body.name)
  25. if (usr.provider === 'local' && req.body.password !== '********') {
  26. let nPwd = _.trim(req.body.password)
  27. if (nPwd.length < 6) {
  28. return Promise.reject(new Error('New Password too short!'))
  29. } else {
  30. return db.User.hashPassword(nPwd).then((pwd) => {
  31. usr.password = pwd
  32. return usr.save()
  33. })
  34. }
  35. } else {
  36. return usr.save()
  37. }
  38. }).then(() => {
  39. return res.json({ msg: 'OK' })
  40. }).catch((err) => {
  41. res.status(400).json({ msg: err.message })
  42. })
  43. })
  44. router.get('/stats', (req, res) => {
  45. if (res.locals.isGuest) {
  46. return res.render('error-forbidden')
  47. }
  48. Promise.all([
  49. db.Entry.count(),
  50. db.UplFile.count(),
  51. db.User.count()
  52. ]).spread((totalEntries, totalUploads, totalUsers) => {
  53. return res.render('pages/admin/stats', {
  54. totalEntries, totalUploads, totalUsers, adminTab: 'stats'
  55. }) || true
  56. }).catch((err) => {
  57. throw err
  58. })
  59. })
  60. router.get('/users', (req, res) => {
  61. if (!res.locals.rights.manage) {
  62. return res.render('error-forbidden')
  63. }
  64. db.User.find({})
  65. .select('-password -rights')
  66. .sort('name email')
  67. .exec().then((usrs) => {
  68. res.render('pages/admin/users', { adminTab: 'users', usrs })
  69. })
  70. })
  71. router.get('/users/:id', (req, res) => {
  72. if (!res.locals.rights.manage) {
  73. return res.render('error-forbidden')
  74. }
  75. if (!validator.isMongoId(req.params.id)) {
  76. return res.render('error-forbidden')
  77. }
  78. db.User.findById(req.params.id)
  79. .select('-password -providerId')
  80. .exec().then((usr) => {
  81. let usrOpts = {
  82. canChangeEmail: (usr.email !== 'guest' && usr.provider === 'local' && usr.email !== req.app.locals.appconfig.admin),
  83. canChangeName: (usr.email !== 'guest'),
  84. canChangePassword: (usr.email !== 'guest' && usr.provider === 'local'),
  85. canChangeRole: (usr.email !== 'guest' && !(usr.provider === 'local' && usr.email === req.app.locals.appconfig.admin)),
  86. canBeDeleted: (usr.email !== 'guest' && !(usr.provider === 'local' && usr.email === req.app.locals.appconfig.admin))
  87. }
  88. res.render('pages/admin/users-edit', { adminTab: 'users', usr, usrOpts })
  89. })
  90. })
  91. router.post('/users/:id', (req, res) => {
  92. if (!res.locals.rights.manage) {
  93. return res.status(401).json({ msg: 'Unauthorized' })
  94. }
  95. if (!validator.isMongoId(req.params.id)) {
  96. return res.status(400).json({ msg: 'Invalid User ID' })
  97. }
  98. return db.User.findById(req.params.id).then((usr) => {
  99. usr.name = _.trim(req.body.name)
  100. usr.rights = JSON.parse(req.body.rights)
  101. if (usr.provider === 'local' && req.body.password !== '********') {
  102. let nPwd = _.trim(req.body.password)
  103. if (nPwd.length < 6) {
  104. return Promise.reject(new Error('New Password too short!'))
  105. } else {
  106. return db.User.hashPassword(nPwd).then((pwd) => {
  107. usr.password = pwd
  108. return usr.save()
  109. })
  110. }
  111. } else {
  112. return usr.save()
  113. }
  114. }).then(() => {
  115. return res.json({ msg: 'OK' })
  116. }).catch((err) => {
  117. res.status(400).json({ msg: err.message })
  118. })
  119. })
  120. router.get('/settings', (req, res) => {
  121. if (!res.locals.rights.manage) {
  122. return res.render('error-forbidden')
  123. }
  124. res.render('pages/admin/settings', { adminTab: 'settings' })
  125. })
  126. module.exports = router