admin.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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,
  55. adminTab: 'stats'
  56. }) || true;
  57. }).catch((err) => {
  58. throw err;
  59. });
  60. });
  61. router.get('/users', (req, res) => {
  62. if(!res.locals.rights.manage) {
  63. return res.render('error-forbidden');
  64. }
  65. db.User.find({})
  66. .select('-password -rights')
  67. .sort('name email')
  68. .exec().then((usrs) => {
  69. res.render('pages/admin/users', { adminTab: 'users', usrs });
  70. });
  71. });
  72. router.get('/users/:id', (req, res) => {
  73. if(!res.locals.rights.manage) {
  74. return res.render('error-forbidden');
  75. }
  76. if(!validator.isMongoId(req.params.id)) {
  77. return res.render('error-forbidden');
  78. }
  79. db.User.findById(req.params.id)
  80. .select('-password -providerId')
  81. .exec().then((usr) => {
  82. let usrOpts = {
  83. canChangeEmail: (usr.email !== 'guest' && usr.provider === 'local' && usr.email !== req.app.locals.appconfig.admin),
  84. canChangeName: (usr.email !== 'guest'),
  85. canChangePassword: (usr.email !== 'guest' && usr.provider === 'local'),
  86. canChangeRole: (usr.email !== 'guest' && !(usr.provider === 'local' && usr.email === req.app.locals.appconfig.admin)),
  87. canBeDeleted: (usr.email !== 'guest' && !(usr.provider === 'local' && usr.email === req.app.locals.appconfig.admin))
  88. };
  89. res.render('pages/admin/users-edit', { adminTab: 'users', usr, usrOpts });
  90. });
  91. });
  92. router.post('/users/:id', (req, res) => {
  93. if(!res.locals.rights.manage) {
  94. return res.status(401).json({ msg: 'Unauthorized' });
  95. }
  96. if(!validator.isMongoId(req.params.id)) {
  97. return res.status(400).json({ msg: 'Invalid User ID' });
  98. }
  99. return db.User.findById(req.params.id).then((usr) => {
  100. usr.name = _.trim(req.body.name);
  101. usr.rights = JSON.parse(req.body.rights);
  102. if(usr.provider === 'local' && req.body.password !== '********') {
  103. let nPwd = _.trim(req.body.password);
  104. if(nPwd.length < 6) {
  105. return Promise.reject(new Error('New Password too short!'))
  106. } else {
  107. return db.User.hashPassword(nPwd).then((pwd) => {
  108. usr.password = pwd;
  109. return usr.save();
  110. });
  111. }
  112. } else {
  113. return usr.save();
  114. }
  115. }).then(() => {
  116. return res.json({ msg: 'OK' });
  117. }).catch((err) => {
  118. res.status(400).json({ msg: err.message });
  119. })
  120. });
  121. router.get('/settings', (req, res) => {
  122. if(!res.locals.rights.manage) {
  123. return res.render('error-forbidden');
  124. }
  125. res.render('pages/admin/settings', { adminTab: 'settings' });
  126. });
  127. module.exports = router;