diff --git a/install/package.json b/install/package.json index b0d2579660..a7de7d2996 100644 --- a/install/package.json +++ b/install/package.json @@ -104,10 +104,10 @@ "nodebb-plugin-ntfy": "1.7.4", "nodebb-plugin-spam-be-gone": "2.2.2", "nodebb-rewards-essentials": "1.0.0", - "nodebb-theme-harmony": "1.2.61", + "nodebb-theme-harmony": "1.2.62", "nodebb-theme-lavender": "7.1.8", - "nodebb-theme-peace": "2.2.5", - "nodebb-theme-persona": "13.3.23", + "nodebb-theme-peace": "2.2.6", + "nodebb-theme-persona": "13.3.24", "nodebb-widget-essentials": "7.0.16", "nodemailer": "6.9.13", "nprogress": "0.2.0", diff --git a/src/topics/events.js b/src/topics/events.js index 5d163f4977..f63f4b32a8 100644 --- a/src/topics/events.js +++ b/src/topics/events.js @@ -120,7 +120,11 @@ Events.get = async (tid, uid, reverse = false) => { const timestamps = eventIds.map(obj => obj.score); eventIds = eventIds.map(obj => obj.value); let events = await db.getObjects(keys); - events = await modifyEvent({ tid, uid, eventIds, timestamps, events }); + events.forEach((e, idx) => { + e.timestamp = timestamps[idx]; + }); + await addEventsFromPostQueue(tid, uid, events); + events = await modifyEvent({ uid, events }); if (reverse) { events.reverse(); } @@ -144,8 +148,7 @@ async function getCategoryInfo(cids) { return _.zipObject(uniqCids, catData); } -async function modifyEvent({ tid, uid, eventIds, timestamps, events }) { - // Add posts from post queue +async function addEventsFromPostQueue(tid, uid, events) { const isPrivileged = await user.isPrivileged(uid); if (isPrivileged) { const queuedPosts = await posts.getQueuedPosts({ tid }, { metadata: false }); @@ -155,11 +158,10 @@ async function modifyEvent({ tid, uid, eventIds, timestamps, events }) { timestamp: item.data.timestamp || Date.now(), uid: item.data.uid, }))); - queuedPosts.forEach((item) => { - timestamps.push(item.data.timestamp || Date.now()); - }); } +} +async function modifyEvent({ uid, events }) { const [users, fromCategories, userSettings] = await Promise.all([ getUserInfo(events.map(event => event.uid).filter(Boolean)), getCategoryInfo(events.map(event => event.fromCid).filter(Boolean)), @@ -183,10 +185,8 @@ async function modifyEvent({ tid, uid, eventIds, timestamps, events }) { events = events.filter(event => Events._types.hasOwnProperty(event.type)); // Add user & metadata - events.forEach((event, idx) => { - event.id = parseInt(eventIds[idx], 10); - event.timestamp = timestamps[idx]; - event.timestampISO = new Date(timestamps[idx]).toISOString(); + events.forEach((event) => { + event.timestampISO = utils.toISOString(event.timestamp); if (event.hasOwnProperty('uid')) { event.user = users.get(event.uid === 'system' ? 'system' : parseInt(event.uid, 10)); } @@ -221,16 +221,15 @@ Events.log = async (tid, payload) => { } const eventId = await db.incrObjectField('global', 'nextTopicEventId'); + payload.id = eventId; await Promise.all([ db.setObject(`topicEvent:${eventId}`, payload), db.sortedSetAdd(`topic:${tid}:events`, timestamp, eventId), ]); - + payload.timestamp = timestamp; let events = await modifyEvent({ uid: payload.uid, - eventIds: [eventId], - timestamps: [timestamp], events: [payload], }); diff --git a/src/upgrades/3.8.3/topic-event-ids.js b/src/upgrades/3.8.3/topic-event-ids.js new file mode 100644 index 0000000000..b85963db6e --- /dev/null +++ b/src/upgrades/3.8.3/topic-event-ids.js @@ -0,0 +1,38 @@ +/* eslint-disable no-await-in-loop */ + +'use strict'; + +const db = require('../../database'); +const batch = require('../../batch'); + +module.exports = { + name: 'Add id field to all topic events', + timestamp: Date.UTC(2024, 5, 24), + method: async function () { + const { progress } = this; + + let nextId = await db.getObjectField('global', 'nextTopicEventId'); + nextId = parseInt(nextId, 10) || 0; + const ids = []; + for (let i = 1; i < nextId; i++) { + ids.push(i); + } + await batch.processArray(ids, async (eids) => { + const eventData = await db.getObjects(eids.map(eid => `topicEvent:${eid}`)); + const bulkSet = []; + eventData.forEach((event, idx) => { + if (event && event.type) { + const id = eids[idx]; + bulkSet.push( + [`topicEvent:${id}`, { id: id }] + ); + } + }); + await db.setObjectBulk(bulkSet); + progress.incr(eids.length); + }, { + batch: 500, + progress, + }); + }, +};