mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-12-23 17:00:24 +01:00
add upgrade script to set mid on msg objects
and create messages:mid for easy msg retrieval
This commit is contained in:
@@ -44,6 +44,7 @@ module.exports = function (Messaging) {
|
|||||||
const mid = await db.incrObjectField('global', 'nextMid');
|
const mid = await db.incrObjectField('global', 'nextMid');
|
||||||
const timestamp = data.timestamp || Date.now();
|
const timestamp = data.timestamp || Date.now();
|
||||||
let message = {
|
let message = {
|
||||||
|
mid: mid,
|
||||||
content: String(data.content),
|
content: String(data.content),
|
||||||
timestamp: timestamp,
|
timestamp: timestamp,
|
||||||
fromuid: uid,
|
fromuid: uid,
|
||||||
@@ -65,6 +66,7 @@ module.exports = function (Messaging) {
|
|||||||
const tasks = [
|
const tasks = [
|
||||||
Messaging.addMessageToRoom(roomId, mid, timestamp),
|
Messaging.addMessageToRoom(roomId, mid, timestamp),
|
||||||
Messaging.markRead(uid, roomId),
|
Messaging.markRead(uid, roomId),
|
||||||
|
db.sortedSetAdd('messages:mid', timestamp, mid),
|
||||||
];
|
];
|
||||||
if (roomData.public) {
|
if (roomData.public) {
|
||||||
tasks.push(
|
tasks.push(
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ const user = require('../user');
|
|||||||
const utils = require('../utils');
|
const utils = require('../utils');
|
||||||
const plugins = require('../plugins');
|
const plugins = require('../plugins');
|
||||||
|
|
||||||
const intFields = ['timestamp', 'edited', 'fromuid', 'roomId', 'deleted', 'system'];
|
const intFields = ['mid', 'timestamp', 'edited', 'fromuid', 'roomId', 'deleted', 'system'];
|
||||||
|
|
||||||
module.exports = function (Messaging) {
|
module.exports = function (Messaging) {
|
||||||
Messaging.newMessageCutoff = 1000 * 60 * 3;
|
Messaging.newMessageCutoff = 1000 * 60 * 3;
|
||||||
@@ -71,8 +71,6 @@ module.exports = function (Messaging) {
|
|||||||
|
|
||||||
message.newSet = false;
|
message.newSet = false;
|
||||||
message.roomId = String(message.roomId || roomId);
|
message.roomId = String(message.roomId || roomId);
|
||||||
message.deleted = !!message.deleted;
|
|
||||||
message.system = !!message.system;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
messages = await Promise.all(messages.map(async (message) => {
|
messages = await Promise.all(messages.map(async (message) => {
|
||||||
@@ -143,9 +141,6 @@ async function modifyMessage(message, fields, mid) {
|
|||||||
if (message.hasOwnProperty('edited')) {
|
if (message.hasOwnProperty('edited')) {
|
||||||
message.editedISO = utils.toISOString(message.edited);
|
message.editedISO = utils.toISOString(message.edited);
|
||||||
}
|
}
|
||||||
if (!fields.length || fields.includes('mid')) {
|
|
||||||
message.mid = parseInt(mid, 10);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const payload = await plugins.hooks.fire('filter:messaging.getFields', {
|
const payload = await plugins.hooks.fire('filter:messaging.getFields', {
|
||||||
|
|||||||
@@ -9,20 +9,23 @@ module.exports = function (Messaging) {
|
|||||||
|
|
||||||
async function doDeleteRestore(mid, state, uid) {
|
async function doDeleteRestore(mid, state, uid) {
|
||||||
const field = state ? 'deleted' : 'restored';
|
const field = state ? 'deleted' : 'restored';
|
||||||
const { content, deleted, roomId } = await Messaging.getMessageFields(mid, ['deleted', 'roomId', 'content']);
|
const msgData = await Messaging.getMessageFields(mid, [
|
||||||
if (deleted === state) {
|
'mid', 'fromuid', 'deleted', 'roomId', 'content', 'system',
|
||||||
|
]);
|
||||||
|
if (msgData.deleted === state) {
|
||||||
throw new Error(`[[error:chat-${field}-already]]`);
|
throw new Error(`[[error:chat-${field}-already]]`);
|
||||||
}
|
}
|
||||||
|
|
||||||
await Messaging.setMessageField(mid, 'deleted', state);
|
await Messaging.setMessageField(mid, 'deleted', state);
|
||||||
const ioRoom = sockets.in(`chat_room_${roomId}`);
|
msgData.deleted = state;
|
||||||
|
const ioRoom = sockets.in(`chat_room_${msgData.roomId}`);
|
||||||
if (state === 1 && ioRoom) {
|
if (state === 1 && ioRoom) {
|
||||||
ioRoom.emit('event:chats.delete', mid);
|
ioRoom.emit('event:chats.delete', mid);
|
||||||
plugins.hooks.fire('action:messaging.delete', { message: { mid, content, deleted: 1, roomId } });
|
plugins.hooks.fire('action:messaging.delete', { message: msgData });
|
||||||
} else if (state === 0 && ioRoom) {
|
} else if (state === 0 && ioRoom) {
|
||||||
const messages = await Messaging.getMessagesData([mid], uid, roomId, true);
|
const messages = await Messaging.getMessagesData([mid], uid, msgData.roomId, true);
|
||||||
ioRoom.emit('event:chats.restore', messages[0]);
|
ioRoom.emit('event:chats.restore', messages[0]);
|
||||||
plugins.hooks.fire('action:messaging.restore', { message: { ...messages[0], content } });
|
plugins.hooks.fire('action:messaging.restore', { message: msgData });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -31,7 +31,9 @@ module.exports = function (Messaging) {
|
|||||||
sockets.in(`chat_room_${roomId}`).emit('event:chats.edit', {
|
sockets.in(`chat_room_${roomId}`).emit('event:chats.edit', {
|
||||||
messages: messages,
|
messages: messages,
|
||||||
});
|
});
|
||||||
plugins.hooks.fire('action:messaging.edit', { message: messages[0] });
|
plugins.hooks.fire('action:messaging.edit', {
|
||||||
|
message: { ...messages[0], content: payload.content },
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const canEditDelete = async (messageId, uid, type) => {
|
const canEditDelete = async (messageId, uid, type) => {
|
||||||
|
|||||||
45
src/upgrades/3.3.0/chat_message_mids.js
Normal file
45
src/upgrades/3.3.0/chat_message_mids.js
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
const db = require('../../database');
|
||||||
|
const batch = require('../../batch');
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
name: 'Set mid on message objects and create messages:mid',
|
||||||
|
timestamp: Date.UTC(2023, 6, 27),
|
||||||
|
method: async function () {
|
||||||
|
const { progress } = this;
|
||||||
|
|
||||||
|
progress.total = await db.sortedSetCard(`chat:rooms`);
|
||||||
|
await batch.processSortedSet(`chat:rooms`, async (roomIds) => {
|
||||||
|
progress.incr(roomIds.length);
|
||||||
|
await Promise.all(roomIds.map(async (roomId) => {
|
||||||
|
await batch.processSortedSet(`chat:room:${roomId}:mids`, async (mids) => {
|
||||||
|
let messageData = await db.getObjects(mids.map(mid => `message:${mid}`));
|
||||||
|
messageData.forEach((m, idx) => {
|
||||||
|
if (m) {
|
||||||
|
m.mid = parseInt(mids[idx], 10);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
messageData = messageData.filter(Boolean);
|
||||||
|
|
||||||
|
const bulkSet = messageData.map(
|
||||||
|
msg => [`message:${msg.mid}`, { mid: msg.mid }]
|
||||||
|
);
|
||||||
|
|
||||||
|
await db.setObjectBulk(bulkSet);
|
||||||
|
await db.sortedSetAdd(
|
||||||
|
'messages:mid',
|
||||||
|
messageData.map(msg => msg.timestamp),
|
||||||
|
messageData.map(msg => msg.mid)
|
||||||
|
);
|
||||||
|
}, {
|
||||||
|
batch: 500,
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
}, {
|
||||||
|
batch: 500,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user