From 02e878be7232ba4697040a4ff927d836a4ca6444 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 10 Dec 2021 17:16:54 -0500 Subject: [PATCH] feat: stub code for v3 chats api --- src/controllers/write/chats.js | 49 ++++++++++++++++++++++++++++++++++ src/middleware/assert.js | 18 +++++++++++++ src/middleware/user.js | 8 ++++++ src/routes/write/chats.js | 29 ++++++++++++++++++++ src/routes/write/index.js | 1 + 5 files changed, 105 insertions(+) create mode 100644 src/controllers/write/chats.js create mode 100644 src/routes/write/chats.js diff --git a/src/controllers/write/chats.js b/src/controllers/write/chats.js new file mode 100644 index 0000000000..8e4061036c --- /dev/null +++ b/src/controllers/write/chats.js @@ -0,0 +1,49 @@ +/* eslint-disable */ +'use strict'; + +const api = require('../../api'); + +const helpers = require('../helpers'); + +const Chats = module.exports; + +Chats.list = async (req, res) => { + // ... +}; + +Chats.create = async (req, res) => { + // ... +}; + +Chats.exists = async (req, res) => { + helpers.formatApiResponse(200, res); +}; + +Chats.get = async (req, res) => { + // ... +}; + +Chats.post = async (req, res) => { + // ... +}; + +Chats.users = async (req, res) => { + // ... +}; + +Chats.invite = async (req, res) => { + // ... +}; + +Chats.kick = async (req, res) => { + // ... +}; + +Chats.message = {}; +Chats.messages.edit = async (req, res) => { + // ... +}; + +Chats.messages.delete = async (req, res) => { + // ... +}; diff --git a/src/middleware/assert.js b/src/middleware/assert.js index 49718cba14..1786f15c39 100644 --- a/src/middleware/assert.js +++ b/src/middleware/assert.js @@ -14,6 +14,7 @@ const user = require('../user'); const groups = require('../groups'); const topics = require('../topics'); const posts = require('../posts'); +const messaging = require('../messaging'); const slugify = require('../slugify'); const helpers = require('./helpers'); @@ -104,3 +105,20 @@ Assert.folderName = helpers.try(async (req, res, next) => { next(); }); + +Assert.room = helpers.try(async (req, res, next) => { + const [exists, inRoom] = await Promise.all([ + await messaging.roomExists(req.params.roomId), + await messaging.isUserInRoom(req.uid, req.params.roomId), + ]); + + if (!exists) { + return controllerHelpers.formatApiResponse(404, res, new Error('[[error:chat-room-does-not-exist]]')); + } + + if (!inRoom) { + return controllerHelpers.formatApiResponse(403, res, new Error('[[error:no-privileges]]')); + } + + next(); +}); diff --git a/src/middleware/user.js b/src/middleware/user.js index 6e583ffdd0..6cfeca7039 100644 --- a/src/middleware/user.js +++ b/src/middleware/user.js @@ -133,6 +133,14 @@ module.exports = function (middleware) { controllers.helpers.notAllowed(req, res); }); + middleware.canChat = helpers.try(async (req, res, next) => { + const canChat = await privileges.global.can('chat', req.uid); + if (canChat) { + return next(); + } + controllers.helpers.notAllowed(req, res); + }); + middleware.checkAccountPermissions = helpers.try(async (req, res, next) => { // This middleware ensures that only the requested user and admins can pass diff --git a/src/routes/write/chats.js b/src/routes/write/chats.js new file mode 100644 index 0000000000..c52fb48692 --- /dev/null +++ b/src/routes/write/chats.js @@ -0,0 +1,29 @@ +'use strict'; + +const router = require('express').Router(); +const middleware = require('../../middleware'); +const controllers = require('../../controllers'); +const routeHelpers = require('../helpers'); + +const { setupApiRoute } = routeHelpers; + +module.exports = function () { + const middlewares = [middleware.ensureLoggedIn, middleware.canChat]; + + setupApiRoute(router, 'get', '/', [...middlewares], controllers.write.chats.list); + setupApiRoute(router, 'post', '/', [...middlewares, middleware.checkRequired.bind(null, ['uids'])], controllers.write.chats.create); + + setupApiRoute(router, 'head', '/:roomId', [...middlewares, middleware.assert.room], controllers.write.chats.exists); + setupApiRoute(router, 'get', '/:roomId', [...middlewares, middleware.assert.room], controllers.write.chats.get); + setupApiRoute(router, 'post', '/:roomId', [...middlewares, middleware.assert.room], controllers.write.chats.post); + // no route for room deletion, reserved just in case... + + setupApiRoute(router, 'get', '/:roomId/users', [...middlewares, middleware.assert.room], controllers.write.chats.users); + setupApiRoute(router, 'put', '/:roomId/users', [...middlewares, middleware.assert.room, middleware.checkRequired.bind(null, ['uids'])], controllers.write.chats.invite); + setupApiRoute(router, 'delete', '/:roomId/users', [...middlewares, middleware.assert.room, middleware.checkRequired.bind(null, ['uids'])], controllers.write.chats.kick); + + setupApiRoute(router, 'put', '/:roomId/:mid', [...middlewares, middleware.assert.room], controllers.write.chats.messages.edit); + setupApiRoute(router, 'delete', '/:roomId/:mid', [...middlewares, middleware.assert.room], controllers.write.chats.messages.delete); + + return router; +}; diff --git a/src/routes/write/index.js b/src/routes/write/index.js index 59e22e1ca2..04d3207e05 100644 --- a/src/routes/write/index.js +++ b/src/routes/write/index.js @@ -37,6 +37,7 @@ Write.reload = async (params) => { router.use('/api/v3/categories', require('./categories')()); router.use('/api/v3/topics', require('./topics')()); router.use('/api/v3/posts', require('./posts')()); + router.use('/api/v3/chats', require('./chats')()); router.use('/api/v3/flags', require('./flags')()); router.use('/api/v3/admin', require('./admin')()); router.use('/api/v3/files', require('./files')());