From 3335d84de5fdc16eef0b1a803379441936aef53a Mon Sep 17 00:00:00 2001 From: Troplo Date: Sun, 18 Oct 2020 15:41:36 +1100 Subject: [PATCH] 0.176-prerelease3 --- controllers/conversation.js | 1 + .../src/components/routes/Conversation.vue | 2 +- lib/sockets.js | 9 ++++ models/user.js | 1 + routes/userutils.js | 8 ++- socket_routes/conversationRooms.js | 50 +++++++++++++++++++ socket_routes/typing.js | 37 ++++++++++++++ 7 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 socket_routes/conversationRooms.js create mode 100644 socket_routes/typing.js diff --git a/controllers/conversation.js b/controllers/conversation.js index 3afe8bc..9f25ecb 100644 --- a/controllers/conversation.js +++ b/controllers/conversation.js @@ -55,6 +55,7 @@ exports.create = async function (userIds, name) { searchString of usernames given by user */ exports.getFromUser = async function (userId, page, searchString) { + console.log(userId) let usernames = (searchString || '').split(/\s+/); let replacementsObj = { offset: (page || 0) * 10, diff --git a/frontend/src/components/routes/Conversation.vue b/frontend/src/components/routes/Conversation.vue index 48bdc78..3391356 100644 --- a/frontend/src/components/routes/Conversation.vue +++ b/frontend/src/components/routes/Conversation.vue @@ -226,7 +226,7 @@ }, createConversation () { let userIds = this.newConversationUsers.map(user => user.id); - userIds.push(+this.$store.state.userId); + userIds.push(+this.$store.state.UserId); //If there is no message or only one user (themselves) //then do not create new conversation diff --git a/lib/sockets.js b/lib/sockets.js index 2096e5b..901c0e3 100644 --- a/lib/sockets.js +++ b/lib/sockets.js @@ -1,3 +1,5 @@ +const typing = require('../socket_routes/typing'); +const conversationRooms = require('../socket_routes/conversationRooms'); module.exports = { init (app, server, session) { let io = require('socket.io')(server) @@ -30,6 +32,13 @@ module.exports = { socket.on('accountEvent', _ => { socket.disconnect() }) + socket.on('disconnect', () => { removeIoUser(socket); }); + + socket.on('joinConversation', data => { conversationRooms.join(data, socket) }); + socket.on('leaveConversation', data => { conversationRooms.leave(data, socket) }); + + socket.on('startTyping', data => { typing('startTyping', data, socket) }); + socket.on('stopTyping', data => { typing('stopTyping', data, socket) }); }) app.set('io', io) diff --git a/models/user.js b/models/user.js index 9bb33ad..0340cdd 100644 --- a/models/user.js +++ b/models/user.js @@ -414,6 +414,7 @@ module.exports = (sequelize, DataTypes) => { User.hasMany(models.Post) User.hasMany(models.Thread) User.hasMany(models.userWall) + User.belongsToMany(models.Conversation, { through: models.UserConversation }) User.belongsToMany(models.Ip, { through: 'UserIp' }) }, includeOptions (from, limit) { diff --git a/routes/userutils.js b/routes/userutils.js index 5974b0d..72486cb 100644 --- a/routes/userutils.js +++ b/routes/userutils.js @@ -352,13 +352,11 @@ router.all('*', (req, res, next) => { } }) -router.get('/conversations', async (req, res, next) => { +router.get('/:userId/conversations', async (req, res, next) => { try { - let user = await User.findOne({ where: { - username: req.session.username - }}) + let id = +req.params.userId; - let conversations = await conversationController.getFromUser(user.id, +req.query.page, req.query.search); + let conversations = await conversationController.getFromUser(id, +req.query.page, req.query.search); res.json(conversations); } catch (e) { next(e); } }); diff --git a/socket_routes/conversationRooms.js b/socket_routes/conversationRooms.js new file mode 100644 index 0000000..51a7687 --- /dev/null +++ b/socket_routes/conversationRooms.js @@ -0,0 +1,50 @@ +const socketErrorHandler = require('../lib/socketErrorHandler'); +const validateSchema = require('../lib/validation/validateSchema'); + +const conversationController = require('../controllers/conversation'); + +/* + data: + { + conversationId: integer + } +*/ +async function join (data, socket) { + try { + validateSchema({ + conversationId: { + type: 'integer', + required: true + } + }, data); + + const { conversationId } = data; + const { userId } = socket.request.session; + + const conversationUsers = await conversationController.getUserIds(conversationId); + if(!conversationUsers.includes(userId)) { + throw new Error('unauthorised'); + } + + socket.join('conversation/' + conversationId); + } catch (e) { + socketErrorHandler(e, socket); + } +}; + +function leave (data, socket) { + try { + validateSchema({ + conversationId: { + type: 'integer', + required: true + } + }, data); + + socket.leave('conversation/' + data.conversationId) + } catch (e) { + socketErrorHandler(e, socket); + } +} + +module.exports = { join, leave }; \ No newline at end of file diff --git a/socket_routes/typing.js b/socket_routes/typing.js new file mode 100644 index 0000000..27817e5 --- /dev/null +++ b/socket_routes/typing.js @@ -0,0 +1,37 @@ +const socketErrorHandler = require('../lib/socketErrorHandler'); +const validateSchema = require('../lib/validation/validateSchema'); + +const conversationController = require('../controllers/conversation'); + +/* + data: + { + conversationId: integer + } +*/ +async function setTyping (event, data, socket) { + try { + validateSchema({ + conversationId: { + type: 'integer', + required: true + } + }, data); + + const { conversationId } = data; + const { userId } = socket.request.session; + + const conversationUsers = await conversationController.getUserIds(conversationId); + if(!conversationUsers.includes(userId)) { + throw new Error('unauthorised'); + } + + socket + .to('conversation/' + conversationId) + .emit(event, { userId }); + } catch (e) { + socketErrorHandler(e, socket); + } +}; + +module.exports = setTyping; \ No newline at end of file