diff --git a/src/config/config.js b/src/config/config.js index 0ea9d6ed76184b475e86afa289198f945d3cabb1..e662a8414f2a7ff7591be8538cadd4a9ce5ac622 100644 --- a/src/config/config.js +++ b/src/config/config.js @@ -59,6 +59,8 @@ const envVarsSchema = Joi.object() // Admin emails ADMIN_EMAILS: Joi.string().description('Admin emails'), ADMIN_PASSWORD: Joi.string().description('Admin password'), + // Change Logs max size + LOGS_MAX_SIZE: Joi.number().default(100).description('Max size of change logs in megabytes'), }) .unknown(); @@ -178,6 +180,7 @@ const config = { }, adminEmails: envVars.ADMIN_EMAILS?.split(',') || [], adminPassword: envVars.ADMIN_PASSWORD, + logsMaxSize: envVars.LOGS_MAX_SIZE, }; if (config.env === 'development') { diff --git a/src/index.js b/src/index.js index c79d6ce002f9e6ecc027b0a806817eda51b91e80..299a17a4f5a07b66f58be072e4ace98fcc2c2b61 100644 --- a/src/index.js +++ b/src/index.js @@ -4,12 +4,13 @@ const config = require('./config/config'); const logger = require('./config/logger'); const initializeRoles = require('./utils/initializeRoles'); const { init } = require('./config/socket'); -const setupScheduledCheck = require('./scripts/checkVSSUpdate'); -const assignAdmins = require('./scripts/assignAdmins'); +const { setupScheduledCheck, assignAdmins, convertLogsCap } = require('./scripts'); let server; mongoose.connect(config.mongoose.url, config.mongoose.options).then(() => { logger.info('Connected to MongoDB '); + + convertLogsCap(); initializeRoles().then(() => assignAdmins()); server = app.listen(config.port, () => { logger.info(`Listening to port ${config.port}`); diff --git a/src/models/changeLog.model.js b/src/models/changeLog.model.js index 6d34fd31843e0a1a2df0f83b3e093050710daa53..979f17e62d73b2e0cec5213185a26cc1e06be124 100644 --- a/src/models/changeLog.model.js +++ b/src/models/changeLog.model.js @@ -46,6 +46,7 @@ const changeLogSchema = new mongoose.Schema( changeLogSchema.plugin(toJSON); changeLogSchema.plugin(paginate); +changeLogSchema.index({ ref: 1 }); const ChangeLog = mongoose.model('ChangeLog', changeLogSchema); diff --git a/src/scripts/convertLogsCap.js b/src/scripts/convertLogsCap.js new file mode 100644 index 0000000000000000000000000000000000000000..d4eda67ca863dca7e21ba7345f8c7d8af640e682 --- /dev/null +++ b/src/scripts/convertLogsCap.js @@ -0,0 +1,43 @@ +const mongoose = require('mongoose'); +const logger = require('../config/logger'); +const config = require('../config/config'); +const ChangeLog = require('../models/changeLog.model'); + +async function setLogsCap() { + const db = mongoose.connection.db; + const name = 'changelogs'; + const max = config.logsMaxSize * 1024 * 1024; // 100MB capped + + try { + const collInfo = await db.listCollections({ name }).next(); + + if (!collInfo) { + await db.createCollection(name, { capped: true, size: max }); + return logger.info(`Created capped collection ${name} with ${max} bytes`); + } + + const stats = await db.collection(name).stats(); + if (stats.capped && stats.maxSize === max) { + return logger.info(`Collection ${name} is already capped to ${max} bytes. Skipping...`); + } + + await db.command({ + convertToCapped: name, + size: max, + }); + logger.info(`Capped collection ${name} to ${max} bytes`); + } catch (error) { + logger.error(`Error capping collection ${name}: %o`, error?.message || error); + } +} + +async function convertLogsCap() { + try { + await setLogsCap(); + await ChangeLog.createIndexes(); + } catch (error) { + logger.error('Error converting logs cap: %o', error.message || error); + } +} + +module.exports = convertLogsCap; diff --git a/src/scripts/index.js b/src/scripts/index.js new file mode 100644 index 0000000000000000000000000000000000000000..120605caba97c41180815fd421fe5d8f90e9121d --- /dev/null +++ b/src/scripts/index.js @@ -0,0 +1,3 @@ +module.exports.assignAdmins = require('./assignAdmins'); +module.exports.setupScheduledCheck = require('./setupScheduledCheck'); +module.exports.convertLogsCap = require('./convertLogsCap'); diff --git a/src/scripts/checkVSSUpdate.js b/src/scripts/setupScheduledCheck.js similarity index 100% rename from src/scripts/checkVSSUpdate.js rename to src/scripts/setupScheduledCheck.js