Skip to content
Snippets Groups Projects
Unverified Commit 0cb1065c authored by dionisio-bot[bot]'s avatar dionisio-bot[bot] Committed by GitHub
Browse files

fix: Retention policy settings migration not running (#35099)

parent 331d3019
No related branches found
No related tags found
No related merge requests found
---
"@rocket.chat/meteor": patch
---
Fixes an issue with the retention policy max age settings not maintaning it's previous value when upgrading from version < 6.10
......@@ -73,6 +73,19 @@ export const createRetentionSettings = () =>
i18nDescription: 'RetentionPolicy_AppliesToChannels_Description',
enableQuery: globalQuery,
});
await this.add('RetentionPolicy_MaxAge_Channels', 30, {
type: 'int',
public: true,
hidden: true,
i18nLabel: 'RetentionPolicy_MaxAge_Channels',
enableQuery: [
{
_id: 'RetentionPolicy_AppliesToChannels',
value: true,
},
globalQuery,
],
});
await this.add('RetentionPolicy_TTL_Channels', THIRTY_DAYS, {
type: 'timespan',
......@@ -94,6 +107,19 @@ export const createRetentionSettings = () =>
i18nDescription: 'RetentionPolicy_AppliesToGroups_Description',
enableQuery: globalQuery,
});
await this.add('RetentionPolicy_MaxAge_Groups', 30, {
type: 'int',
public: true,
hidden: true,
i18nLabel: 'RetentionPolicy_MaxAge_Groups',
enableQuery: [
{
_id: 'RetentionPolicy_AppliesToGroups',
value: true,
},
globalQuery,
],
});
await this.add('RetentionPolicy_TTL_Groups', THIRTY_DAYS, {
type: 'timespan',
......@@ -115,6 +141,20 @@ export const createRetentionSettings = () =>
enableQuery: globalQuery,
});
await this.add('RetentionPolicy_MaxAge_DMs', 30, {
type: 'int',
public: true,
hidden: true,
i18nLabel: 'RetentionPolicy_MaxAge_DMs',
enableQuery: [
{
_id: 'RetentionPolicy_AppliesToDMs',
value: true,
},
globalQuery,
],
});
await this.add('RetentionPolicy_TTL_DMs', THIRTY_DAYS, {
type: 'timespan',
public: true,
......
import { Settings } from '@rocket.chat/models';
import type { UpdateResult } from 'mongodb';
import { settings } from '../../../app/settings/server';
import { addMigration } from '../../lib/migrations';
const maxAgeSettingMap = new Map([
['RetentionPolicy_MaxAge_Channels', 'RetentionPolicy_TTL_Channels'],
['RetentionPolicy_MaxAge_Groups', 'RetentionPolicy_TTL_Groups'],
['RetentionPolicy_MaxAge_DMs', 'RetentionPolicy_TTL_DMs'],
]);
addMigration({
version: 318,
name: 'Move retention policy settings',
async up() {
const convertDaysToMs = (days: number) => days * 24 * 60 * 60 * 1000;
const promises: Array<Promise<UpdateResult>> = [];
await Settings.find(
// we have to test value to avoid updating records that were changed before this version
{ _id: { $in: Array.from(maxAgeSettingMap.keys()) }, value: { $ne: -1 } },
{ projection: { _id: 1, value: 1 } },
).forEach(({ _id, value }) => {
const newSettingId = maxAgeSettingMap.get(_id);
if (!newSettingId) {
throw new Error(`moveRetentionSetting - Setting ${_id} equivalent does not exist`);
}
const newValue = convertDaysToMs(Number(value));
// TODO: audit
promises.push(
Settings.updateOne(
{
_id: maxAgeSettingMap.get(_id),
},
{
$set: {
value: newValue,
},
},
),
);
// This is necessary because the cachedCollection is started before watchDb is initialized
const currentCache = settings.getSetting(newSettingId);
if (!currentCache) {
return;
}
settings.set({ ...currentCache, value: newValue });
});
await Promise.all(promises);
await Settings.deleteMany({ _id: { $in: Array.from(maxAgeSettingMap.keys()) } });
},
});
import { Settings } from '@rocket.chat/models';
import type { UpdateResult } from 'mongodb';
import { upsertPermissions } from '../../../app/authorization/server/functions/upsertPermissions';
import { settings } from '../../../app/settings/server';
import { migrateDatabase, onServerVersionChange } from '../../lib/migrations';
import { ensureCloudWorkspaceRegistered } from '../cloudRegistration';
......@@ -6,11 +10,57 @@ const { MIGRATION_VERSION = 'latest' } = process.env;
const [version, ...subcommands] = MIGRATION_VERSION.split(',');
const maxAgeSettingMap = new Map([
['RetentionPolicy_MaxAge_Channels', 'RetentionPolicy_TTL_Channels'],
['RetentionPolicy_MaxAge_Groups', 'RetentionPolicy_TTL_Groups'],
['RetentionPolicy_MaxAge_DMs', 'RetentionPolicy_TTL_DMs'],
]);
const moveRetentionSetting = async () => {
const convertDaysToMs = (days: number) => days * 24 * 60 * 60 * 1000;
const promises: Array<Promise<UpdateResult>> = [];
await Settings.find(
{ _id: { $in: Array.from(maxAgeSettingMap.keys()) }, value: { $ne: -1 } },
{ projection: { _id: 1, value: 1 } },
).forEach(({ _id, value }) => {
const newSettingId = maxAgeSettingMap.get(_id);
if (!newSettingId) {
throw new Error(`moveRetentionSetting - Setting ${_id} equivalent does not exist`);
}
const newValue = convertDaysToMs(Number(value));
promises.push(
Settings.updateOne(
{
_id: maxAgeSettingMap.get(_id),
},
{
$set: {
value: newValue,
},
},
),
);
const currentCache = settings.getSetting(newSettingId);
if (!currentCache) {
return;
}
settings.set({ ...currentCache, value: newValue });
});
await Promise.all(promises);
await Settings.updateMany({ _id: { $in: Array.from(maxAgeSettingMap.keys()) } }, { $set: { value: -1 } });
};
export const performMigrationProcedure = async (): Promise<void> => {
await migrateDatabase(version === 'latest' ? version : parseInt(version), subcommands);
// perform operations when the server is starting with a different version
await onServerVersionChange(async () => {
await upsertPermissions();
await ensureCloudWorkspaceRegistered();
await moveRetentionSetting();
});
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment