nodebb-plugin-dbsearch
Version:
A Plugin that lets users search posts and topics
66 lines (54 loc) • 2.14 kB
JavaScript
;
const db = module.parent.require('./database');
module.exports = {
name: 'Changing integer search indices to string',
timestamp: Date.UTC(2025, 0, 27),
method: async function () {
const { progress } = this;
const nconf = require.main.require('nconf');
const mainDB = nconf.get('database');
if (mainDB === 'redis') {
// redis is not affected, since everything is string already
return;
}
const batch = require.main.require('./src/batch');
async function convertIdToString(collection, docs) {
await batch.processArray(docs, async (docs) => {
await db.client.collection(collection).deleteMany({
_id: { $in: docs.map(doc => doc._id) },
});
const bulk = db.client.collection(collection).initializeUnorderedBulkOp();
docs.forEach(doc => bulk.insert({
...doc,
_id: doc._id.toString(),
}));
await bulk.execute();
progress.incr(docs.length);
}, {
batch: 500,
});
}
if (mainDB === 'mongo') {
const topics = await db.client.collection('searchtopic').find({}).toArray();
const posts = await db.client.collection('searchpost').find({}).toArray();
const chats = await db.client.collection('searchchat').find({}).toArray();
progress.total = topics.length + posts.length + chats.length;
await convertIdToString('searchtopic', topics);
await convertIdToString('searchpost', posts);
await convertIdToString('searchchat', chats);
return;
}
if (mainDB === 'postgres') {
try {
await db.client.query('ALTER TABLE searchtopic ALTER COLUMN id TYPE text USING id::bigint');
await db.client.query('ALTER TABLE searchtopic ALTER COLUMN uid TYPE text USING uid::bigint');
await db.client.query('ALTER TABLE searchpost ALTER COLUMN id TYPE text USING id::bigint');
await db.client.query('ALTER TABLE searchpost ALTER COLUMN uid TYPE text USING uid::bigint');
await db.client.query('ALTER TABLE searchchat ALTER COLUMN id TYPE text USING id::bigint');
await db.client.query('ALTER TABLE searchchat ALTER COLUMN uid TYPE text USING uid::bigint');
} catch (err) {
console.error(err.stack);
}
}
},
};