user-ui-settings.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import ErrorV3 from '@growi/core/src/models/vo/error-apiv3';
  2. import express from 'express';
  3. import { body } from 'express-validator';
  4. import { AllSidebarContentsType } from '~/interfaces/ui';
  5. import loggerFactory from '~/utils/logger';
  6. import { apiV3FormValidator } from '../../middlewares/apiv3-form-validator';
  7. import UserUISettings from '../../models/user-ui-settings';
  8. const logger = loggerFactory('growi:routes:apiv3:user-ui-settings');
  9. const router = express.Router();
  10. module.exports = (crowi) => {
  11. const loginRequiredStrictly = require('../../middlewares/login-required')(crowi);
  12. const validatorForPut = [
  13. body('settings').exists().withMessage('The body param \'settings\' is required'),
  14. body('settings.isSidebarCollapsed').optional().isBoolean(),
  15. body('settings.currentSidebarContents').optional().isIn(AllSidebarContentsType),
  16. body('settings.currentProductNavWidth').optional().isNumeric(),
  17. body('settings.preferDrawerModeByUser').optional().isBoolean(),
  18. body('settings.preferDrawerModeOnEditByUser').optional().isBoolean(),
  19. ];
  20. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  21. router.put('/', loginRequiredStrictly, validatorForPut, apiV3FormValidator, async(req: any, res: any) => {
  22. const { user } = req;
  23. const { settings } = req.body;
  24. // extract only necessary params
  25. const updateData = {
  26. isSidebarCollapsed: settings.isSidebarCollapsed,
  27. currentSidebarContents: settings.currentSidebarContents,
  28. currentProductNavWidth: settings.currentProductNavWidth,
  29. preferDrawerModeByUser: settings.preferDrawerModeByUser,
  30. preferDrawerModeOnEditByUser: settings.preferDrawerModeOnEditByUser,
  31. };
  32. // remove the keys that have null value
  33. Object.keys(updateData).forEach((key) => {
  34. if (updateData[key] == null) {
  35. delete updateData[key];
  36. }
  37. });
  38. try {
  39. const updatedSettings = await UserUISettings.findOneAndUpdate(
  40. { user: user._id },
  41. {
  42. $set: {
  43. user: user._id,
  44. ...updateData,
  45. },
  46. },
  47. { upsert: true, new: true },
  48. );
  49. return res.apiv3(updatedSettings);
  50. }
  51. catch (err) {
  52. logger.error('Error', err);
  53. return res.apiv3Err(new ErrorV3(err));
  54. }
  55. });
  56. return router;
  57. };