mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 11:05:54 +01:00 
			
		
		
		
	fix: #6422, update deleted/restored messages
This commit is contained in:
		| @@ -12,6 +12,7 @@ | ||||
| 	"chat.recent-chats": "Recent Chats", | ||||
| 	"chat.contacts": "Contacts", | ||||
| 	"chat.message-history": "Message History", | ||||
| 	"chat.message-deleted": "Message Deleted", | ||||
| 	"chat.options": "Chat options", | ||||
| 	"chat.pop-out": "Pop out chat", | ||||
| 	"chat.minimize": "Minimize", | ||||
|   | ||||
| @@ -485,7 +485,7 @@ define('forum/chats', [ | ||||
| 			app.updateUserStatus($('.chats-list [data-uid="' + data.uid + '"] [component="user/status"]'), data.status); | ||||
| 		}); | ||||
|  | ||||
| 		messages.onChatMessageEdit(); | ||||
| 		messages.addSocketListeners(); | ||||
|  | ||||
| 		socket.on('event:chats.roomRename', function (data) { | ||||
| 			var roomEl = components.get('chat/recent/room', data.roomId); | ||||
|   | ||||
| @@ -129,14 +129,20 @@ define('forum/chats/messages', ['components', 'sounds', 'translator', 'benchpres | ||||
| 				// By setting the `data-mid` attribute, I tell the chat code that I am editing a | ||||
| 				// message, instead of posting a new one. | ||||
| 				inputEl.attr('data-mid', messageId).addClass('editing'); | ||||
| 				inputEl.val(raw); | ||||
| 				inputEl.val(raw).focus(); | ||||
| 			} | ||||
| 		}); | ||||
| 	}; | ||||
|  | ||||
| 	messages.onChatMessageEdit = function () { | ||||
| 	messages.addSocketListeners = function () { | ||||
| 		socket.removeListener('event:chats.edit', onChatMessageEdited); | ||||
| 		socket.on('event:chats.edit', onChatMessageEdited); | ||||
|  | ||||
| 		socket.removeListener('event:chats.delete', onChatMessageDeleted); | ||||
| 		socket.on('event:chats.delete', onChatMessageDeleted); | ||||
|  | ||||
| 		socket.removeListener('event:chats.restore', onChatMessageRestored); | ||||
| 		socket.on('event:chats.restore', onChatMessageRestored); | ||||
| 	}; | ||||
|  | ||||
| 	function onChatMessageEdited(data) { | ||||
| @@ -153,6 +159,18 @@ define('forum/chats/messages', ['components', 'sounds', 'translator', 'benchpres | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	function onChatMessageDeleted(messageId) { | ||||
| 		components.get('chat/message', messageId) | ||||
| 			.toggleClass('deleted', true) | ||||
| 			.find('[component="chat/message/body"]').translateHtml('[[modules:chat.message-deleted]]'); | ||||
| 	} | ||||
|  | ||||
| 	function onChatMessageRestored(message) { | ||||
| 		components.get('chat/message', message.messageId) | ||||
| 			.toggleClass('deleted', false) | ||||
| 			.find('[component="chat/message/body"]').html(message.content); | ||||
| 	} | ||||
|  | ||||
| 	messages.delete = function (messageId, roomId) { | ||||
| 		translator.translate('[[modules:chat.delete_message_confirm]]', function (translated) { | ||||
| 			bootbox.confirm(translated, function (ok) { | ||||
|   | ||||
| @@ -242,7 +242,7 @@ define('chat', [ | ||||
|  | ||||
| 				Chats.addCharactersLeftHandler(chatModal); | ||||
| 				Chats.addIPHandler(chatModal); | ||||
| 				ChatsMessages.onChatMessageEdit(); | ||||
| 				ChatsMessages.addSocketListeners(); | ||||
|  | ||||
| 				taskbar.push('chat', chatModal.attr('data-uuid'), { | ||||
| 					title: '[[modules:chat.chatting_with]] ' + (data.roomName || (data.users.length ? data.users[0].username : '')), | ||||
|   | ||||
| @@ -1,16 +1,33 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| module.exports = function (Messaging) { | ||||
| 	Messaging.deleteMessage = async mid => await doDeleteRestore(mid, 1); | ||||
| 	Messaging.restoreMessage = async mid => await doDeleteRestore(mid, 0); | ||||
| const sockets = require('../socket.io'); | ||||
|  | ||||
| 	async function doDeleteRestore(mid, state) { | ||||
| module.exports = function (Messaging) { | ||||
| 	Messaging.deleteMessage = async (mid, uid) => await doDeleteRestore(mid, 1, uid); | ||||
| 	Messaging.restoreMessage = async (mid, uid) => await doDeleteRestore(mid, 0, uid); | ||||
|  | ||||
| 	async function doDeleteRestore(mid, state, uid) { | ||||
| 		const field = state ? 'deleted' : 'restored'; | ||||
| 		const cur = await Messaging.getMessageField(mid, 'deleted'); | ||||
| 		if (cur === state) { | ||||
| 		const { deleted, roomId } = await Messaging.getMessageFields(mid, ['deleted', 'roomId']); | ||||
| 		if (deleted === state) { | ||||
| 			throw new Error('[[error:chat-' + field + '-already]]'); | ||||
| 		} | ||||
|  | ||||
| 		await Messaging.setMessageField(mid, 'deleted', state); | ||||
|  | ||||
| 		const [uids, messages] = await Promise.all([ | ||||
| 			Messaging.getUidsInRoom(roomId, 0, -1), | ||||
| 			Messaging.getMessagesData([mid], uid, roomId, true), | ||||
| 		]); | ||||
|  | ||||
| 		uids.forEach(function (_uid) { | ||||
| 			if (parseInt(_uid, 10) !== parseInt(uid, 10)) { | ||||
| 				if (state === 1) { | ||||
| 					sockets.in('uid_' + _uid).emit('event:chats.delete', mid); | ||||
| 				} else if (state === 0) { | ||||
| 					sockets.in('uid_' + _uid).emit('event:chats.restore', messages[0]); | ||||
| 				} | ||||
| 			} | ||||
| 		}); | ||||
| 	} | ||||
| }; | ||||
|   | ||||
| @@ -40,14 +40,13 @@ Messaging.getMessages = async (params) => { | ||||
| 	}); | ||||
| 	mids.reverse(); | ||||
|  | ||||
| 	let messageData = await Messaging.getMessagesData(mids, params.uid, params.roomId, isNew); | ||||
| 	const messageData = await Messaging.getMessagesData(mids, params.uid, params.roomId, isNew); | ||||
| 	messageData.forEach(function (messageData) { | ||||
| 		messageData.index = indices[messageData.messageId.toString()]; | ||||
| 	}); | ||||
|  | ||||
| 	// Filter out deleted messages unless you're the sender of said message | ||||
| 	messageData = messageData.filter(function (messageData) { | ||||
| 		return (!messageData.deleted || messageData.fromuid === parseInt(params.uid, 10)); | ||||
| 		messageData.isOwner = messageData.fromuid === parseInt(params.uid, 10); | ||||
| 		if (messageData.deleted && !messageData.isOwner) { | ||||
| 			messageData.content = '[[modules:chat.message-deleted]]'; | ||||
| 		} | ||||
| 	}); | ||||
|  | ||||
| 	return messageData; | ||||
| @@ -100,9 +99,7 @@ Messaging.getRecentChats = async (callerUid, uid, start, stop) => { | ||||
| 		unread: db.isSortedSetMembers('uid:' + uid + ':chat:rooms:unread', roomIds), | ||||
| 		users: Promise.all(roomIds.map(async (roomId) => { | ||||
| 			let uids = await db.getSortedSetRevRange('chat:room:' + roomId + ':uids', 0, 9); | ||||
| 			uids = uids.filter(function (value) { | ||||
| 				return value && parseInt(value, 10) !== parseInt(uid, 10); | ||||
| 			}); | ||||
| 			uids = uids.filter(_uid => _uid && parseInt(_uid, 10) !== parseInt(uid, 10)); | ||||
| 			return await user.getUsersFields(uids, ['uid', 'username', 'userslug', 'picture', 'status', 'lastonline']); | ||||
| 		})), | ||||
| 		teasers: Promise.all(roomIds.map(async roomId => Messaging.getTeaser(uid, roomId))), | ||||
|   | ||||
| @@ -196,7 +196,7 @@ SocketModules.chats.delete = async function (socket, data) { | ||||
| 		throw new Error('[[error:invalid-data]]'); | ||||
| 	} | ||||
| 	await Messaging.canDelete(data.messageId, socket.uid); | ||||
| 	await Messaging.deleteMessage(data.messageId); | ||||
| 	await Messaging.deleteMessage(data.messageId, socket.uid); | ||||
| }; | ||||
|  | ||||
| SocketModules.chats.restore = async function (socket, data) { | ||||
| @@ -204,7 +204,7 @@ SocketModules.chats.restore = async function (socket, data) { | ||||
| 		throw new Error('[[error:invalid-data]]'); | ||||
| 	} | ||||
| 	await Messaging.canDelete(data.messageId, socket.uid); | ||||
| 	await Messaging.restoreMessage(data.messageId); | ||||
| 	await Messaging.restoreMessage(data.messageId, socket.uid); | ||||
| }; | ||||
|  | ||||
| SocketModules.chats.canMessage = async function (socket, roomId) { | ||||
|   | ||||
| @@ -692,14 +692,9 @@ describe('Messaging Library', function () { | ||||
| 		it('should not show deleted message to other users', function (done) { | ||||
| 			socketModules.chats.getMessages({ uid: herpUid }, { uid: herpUid, roomId: roomId, start: 0 }, function (err, messages) { | ||||
| 				assert.ifError(err); | ||||
|  | ||||
| 				// Reduce messages to their mids | ||||
| 				var mids = messages.reduce(function (mids, cur) { | ||||
| 					mids.push(cur.messageId); | ||||
| 					return mids; | ||||
| 				}, []); | ||||
|  | ||||
| 				assert(!mids.includes(mid)); | ||||
| 				messages.forEach(function (msg) { | ||||
| 					assert(!msg.deleted || msg.content === '[[modules:chat.message-deleted]]', msg.content); | ||||
| 				}); | ||||
| 				done(); | ||||
| 			}); | ||||
| 		}); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user