Skip to content
Snippets Groups Projects
Unverified Commit 4b111499 authored by Kevin Aleman's avatar Kevin Aleman Committed by GitHub
Browse files

Chore: Migrate retention-policy to ts (#25582)

parent 1e86788f
No related branches found
No related tags found
No related merge requests found
import { SyncedCron } from 'meteor/littledata:synced-cron';
import { IRoomWithRetentionPolicy } from '@rocket.chat/core-typings';
import { settings } from '../../settings/server';
import { Rooms } from '../../models/server';
import { cleanRoomHistory } from '../../lib';
import { cleanRoomHistory } from '../../lib/server';
let types = [];
const oldest = new Date('0001-01-01T00:00:00Z');
interface IParser {
cron(val: string): string;
}
const maxTimes = {
c: 0,
......@@ -14,14 +15,18 @@ const maxTimes = {
d: 0,
};
const toDays = (d) => d * 1000 * 60 * 60 * 24;
let types: (keyof typeof maxTimes)[] = [];
const oldest = new Date('0001-01-01T00:00:00Z');
const toDays = (d: number): number => d * 1000 * 60 * 60 * 24;
function job() {
function job(): void {
const now = new Date();
const filesOnly = settings.get('RetentionPolicy_FilesOnly');
const excludePinned = settings.get('RetentionPolicy_DoNotPrunePinned');
const ignoreDiscussion = settings.get('RetentionPolicy_DoNotPruneDiscussion');
const ignoreThreads = settings.get('RetentionPolicy_DoNotPruneThreads');
const filesOnly = settings.get<boolean>('RetentionPolicy_FilesOnly');
const excludePinned = settings.get<boolean>('RetentionPolicy_DoNotPrunePinned');
const ignoreDiscussion = settings.get<boolean>('RetentionPolicy_DoNotPruneDiscussion');
const ignoreThreads = settings.get<boolean>('RetentionPolicy_DoNotPruneThreads');
// get all rooms with default values
types.forEach((type) => {
......@@ -35,7 +40,7 @@ function job() {
'retention.overrideGlobal': { $ne: true },
},
{ fields: { _id: 1 } },
).forEach(({ _id: rid }) => {
).forEach(({ _id: rid }: IRoomWithRetentionPolicy) => {
cleanRoomHistory({
rid,
latest,
......@@ -52,7 +57,7 @@ function job() {
'retention.enabled': { $eq: true },
'retention.overrideGlobal': { $eq: true },
'retention.maxAge': { $gte: 0 },
}).forEach((room) => {
}).forEach((room: IRoomWithRetentionPolicy) => {
const { maxAge = 30, filesOnly, excludePinned, ignoreThreads } = room.retention;
const latest = new Date(now.getTime() - toDays(maxAge));
cleanRoomHistory({
......@@ -67,7 +72,7 @@ function job() {
});
}
function getSchedule(precision) {
function getSchedule(precision: '0' | '1' | '2' | '3'): string {
switch (precision) {
case '0':
return '*/30 * * * *'; // 30 minutes
......@@ -82,8 +87,8 @@ function getSchedule(precision) {
const pruneCronName = 'Prune old messages by retention policy';
function deployCron(precision) {
const schedule = (parser) => parser.cron(precision);
function deployCron(precision: string): void {
const schedule = (parser: IParser): string => parser.cron(precision);
SyncedCron.remove(pruneCronName);
SyncedCron.add({
......@@ -129,7 +134,7 @@ settings.watchMultiple(
maxTimes.d = settings.get('RetentionPolicy_MaxAge_DMs');
const precision =
(settings.get('RetentionPolicy_Advanced_Precision') && settings.get('RetentionPolicy_Advanced_Precision_Cron')) ||
(settings.get<boolean>('RetentionPolicy_Advanced_Precision') && settings.get<string>('RetentionPolicy_Advanced_Precision_Cron')) ||
getSchedule(settings.get('RetentionPolicy_Precision'));
return deployCron(precision);
......
......@@ -262,3 +262,12 @@ export type RoomAdminFieldsType =
| 'broadcast'
| 'uids'
| 'avatarETag';
export interface IRoomWithRetentionPolicy extends IRoom {
retention: {
maxAge: number;
filesOnly: boolean;
excludePinned: boolean;
ignoreThreads: boolean;
};
}
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