diff --git a/app/controllers/chat.js b/app/controllers/chat.js index 181a793..42b3bc9 100644 --- a/app/controllers/chat.js +++ b/app/controllers/chat.js @@ -29,6 +29,20 @@ export default class ChatController extends SiteController { const authRequired = sessionService.authCheckMiddleware({ requireLogin: true }); const multer = this.createMulter(ChatController.slug); + async function requireRoomOwner (req, res, next) { + if (!req.user) { + return next(new SiteError(403, 'Must be logged in to proceed')); + } + if (!res.locals.room) { + return next(new SiteError(403, 'Room not found')); + } + if (!res.locals.room.owner._id.equals(req.user._id)) { + return next(new SiteError(403, 'This is not your room')); + } + + return next(); + } + const router = express.Router(); this.dtp.app.use('/chat', router); @@ -48,6 +62,12 @@ export default class ChatController extends SiteController { this.postRoomMessage.bind(this), ); + router.post( + '/room/:roomId/settings', + requireRoomOwner, + this.postRoomSettings.bind(this), + ); + router.post( '/room', // limiterService.create(limiterService.config.chat.postCreateRoom), @@ -71,6 +91,13 @@ export default class ChatController extends SiteController { this.getRoomMessages.bind(this), ); + router.get( + '/room/:roomId/settings', + // limiterService.create(limiterService.config.chat.getRoomMessages), + requireRoomOwner, + this.getRoomSettingsView.bind(this), + ); + router.get( '/room/:roomId', // limiterService.create(limiterService.config.chat.getRoomView), @@ -124,6 +151,17 @@ export default class ChatController extends SiteController { } } + async postRoomSettings (req, res, next) { + const { chat: chatService } = this.dtp.services; + try { + await chatService.updateRoomSettings(res.locals.room, req.body); + res.redirect(`/chat/room/${res.locals.room._id}`); + } catch (error) { + this.log.error('failed to present the room settings view', { error }); + return next(error); + } + } + async postCreateRoom (req, res, next) { const { chat: chatService } = this.dtp.services; try { @@ -162,6 +200,10 @@ export default class ChatController extends SiteController { } } + async getRoomSettingsView (req, res) { + res.render('chat/room/settings'); + } + async getRoomView (req, res, next) { const { chat: chatService } = this.dtp.services; try { diff --git a/app/views/chat/room/settings.pug b/app/views/chat/room/settings.pug new file mode 100644 index 0000000..8393b29 --- /dev/null +++ b/app/views/chat/room/settings.pug @@ -0,0 +1,21 @@ +extends ../../layout/main +block view-content + + .uk-section.uk-section-default + .uk-container + + form(method="POST", action= `/chat/room/${room._id}/settings`).uk-form + .uk-card.uk-card-default.uk-card-small + .uk-card-header + h1.uk-card-title Room Settings + + .uk-card-body + .uk-margin + label(for="name") Room Name + input(id="name", name="name", type="text", placeholder="Enter room name", value= room.name).uk-input + .uk-margin + label(for="topic") Topic + input(id="topic", name="topic", type="text", placeholder="Enter room topic or leave blank", value= room.topic).uk-input + + .uk-card-footer.uk-flex.uk-flex-right + button(type="submit").uk-button.uk-button-default.uk-border-rounded Save Settings \ No newline at end of file diff --git a/app/views/layout/main.pug b/app/views/layout/main.pug index 25cf0df..7dfb426 100644 --- a/app/views/layout/main.pug +++ b/app/views/layout/main.pug @@ -25,9 +25,9 @@ html(lang='en', data-obs-widget= obsWidget) block viewcss block js - script(async, src=`/fontawesome/js/fontawesome.min.js?v=${pkg.version}`) - script(src=`/uikit/dist/js/uikit.min.js?v=${pkg.version}`) - script(src=`/uikit/dist/js/uikit-icons.min.js?v=${pkg.version}`) + script(async, src=`/fontawesome/js/fontawesome.min.js?v=${pkg.version}`, type="module") + script(src=`/uikit/dist/js/uikit.min.js?v=${pkg.version}`, type="module") + script(src=`/uikit/dist/js/uikit-icons.min.js?v=${pkg.version}`, type="module") block pwa-support include ../components/pwa-support