From 60d0092bbc346dee3470c671f217989331b3e9d4 Mon Sep 17 00:00:00 2001 From: rob Date: Thu, 7 Jul 2022 18:01:53 -0400 Subject: [PATCH] CoreUser settings view and logic --- app/controllers/user.js | 42 ++++++++++++++++++++++++++++++-- app/services/core-node.js | 11 +++++++++ app/views/user/settings-core.pug | 15 ++++++++++++ app/views/user/settings.pug | 2 +- config/limiter.js | 5 ++++ 5 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 app/views/user/settings-core.pug diff --git a/app/controllers/user.js b/app/controllers/user.js index ec6ac0f..b046d37 100644 --- a/app/controllers/user.js +++ b/app/controllers/user.js @@ -63,6 +63,14 @@ class UserController extends SiteController { router.param('userId', this.populateUser.bind(this)); router.param('coreUserId', this.populateCoreUser.bind(this)); + router.post( + '/core/:userId/settings', + limiterService.create(limiterService.config.user.postUpdateCoreSettings), + checkProfileOwner, + upload.none(), + this.postUpdateCoreSettings.bind(this), + ); + router.post( '/:userId/profile-photo', limiterService.create(limiterService.config.user.postProfilePhoto), @@ -91,7 +99,7 @@ class UserController extends SiteController { authRequired, otpMiddleware, checkProfileOwner, - this.getUserSettingsView.bind(this), + this.getCoreUserSettingsView.bind(this), ); router.get( '/core/:coreUserId', @@ -250,6 +258,24 @@ class UserController extends SiteController { } } + async postUpdateCoreSettings (req, res) { + const { coreNode: coreNodeService } = this.dtp.services; + try { + const displayList = this.createDisplayList('app-settings'); + + await coreNodeService.updateUserSettings(req.user, req.body); + + displayList.reload(); + res.status(200).json({ success: true, displayList }); + } catch (error) { + this.log.error('failed to update CoreUser settings', { error }); + return res.status(error.statusCode || 500).json({ + success: false, + message: error.message, + }); + } + } + async postUpdateSettings (req, res) { const { user: userService } = this.dtp.services; try { @@ -287,6 +313,18 @@ class UserController extends SiteController { } } + async getCoreUserSettingsView (req, res, next) { + const { otpAuth: otpAuthService } = this.dtp.services; + try { + res.locals.hasOtpAccount = await otpAuthService.isUserProtected(req.user, 'Account'); + res.locals.startTab = req.query.st || 'watch'; + res.render('user/settings-core'); + } catch (error) { + this.log.error('failed to render CoreUser settings view', { error }); + return next(error); + } + } + async getUserSettingsView (req, res, next) { const { otpAuth: otpAuthService } = this.dtp.services; try { @@ -294,7 +332,7 @@ class UserController extends SiteController { res.locals.startTab = req.query.st || 'watch'; res.render('user/settings'); } catch (error) { - this.log.error('failed to produce user settings view', { error }); + this.log.error('failed to render user settings view', { error }); return next(error); } } diff --git a/app/services/core-node.js b/app/services/core-node.js index 5e90bd5..14f3777 100644 --- a/app/services/core-node.js +++ b/app/services/core-node.js @@ -391,6 +391,17 @@ class CoreNodeService extends SiteService { user.type = 'CoreUser'; return user; } + + async updateUserSettings (user, settings) { + await CoreUser.updateOne( + { _id: user._id }, + { + $set: { + theme: settings.theme, + }, + }, + ); + } } module.exports = { diff --git a/app/views/user/settings-core.pug b/app/views/user/settings-core.pug new file mode 100644 index 0000000..15ff17a --- /dev/null +++ b/app/views/user/settings-core.pug @@ -0,0 +1,15 @@ +extends ../layouts/main +block content + + section.uk-section.uk-section-default.uk-section-small + .uk-container + h1 Settings + form(method="POST", action=`/user/core/${userProfile._id}/settings`, onsubmit="return dtp.app.submitForm(event, 'user account update');").uk-form + .uk-margin + label(for="theme").uk-form-label UI Theme + select(id="theme", name="theme").uk-select + option(value="dtp-light", selected= user ? userProfile.theme === 'dtp-light' : true) Light Mode + option(value="dtp-dark", selected= user ? userProfile.theme === 'dtp-dark' : false) Dark Mode + + .uk-margin + button(type="submit").uk-button.uk-button-primary Update settings \ No newline at end of file diff --git a/app/views/user/settings.pug b/app/views/user/settings.pug index 5639d09..25f1cdc 100644 --- a/app/views/user/settings.pug +++ b/app/views/user/settings.pug @@ -108,4 +108,4 @@ block content option(value="dtp-dark", selected= user ? userProfile.theme === 'dtp-dark' : false) Dark Mode .uk-margin - button(type="submit").uk-button.dtp-button-primary Update account settings \ No newline at end of file + button(type="submit").uk-button.uk-button-primary Update account settings \ No newline at end of file diff --git a/config/limiter.js b/config/limiter.js index 95f8ac1..fe2bdbf 100644 --- a/config/limiter.js +++ b/config/limiter.js @@ -146,6 +146,11 @@ module.exports = { expire: ONE_MINUTE * 5, message: 'You are updating your profile photo too quickly', }, + postUpdateCoreSettings: { + total: 4, + expire: ONE_MINUTE, + message: 'You are updating account settings too quickly', + }, postUpdateSettings: { total: 4, expire: ONE_MINUTE,