3
0
Fork 0
mirror of https://github.com/ZeppelinBot/Zeppelin.git synced 2025-03-18 15:00:00 +00:00
zeppelin/backend/src/data/cleanup/configs.ts
2024-04-09 20:57:18 +03:00

95 lines
2.2 KiB
TypeScript

import moment from "moment-timezone";
import { In } from "typeorm";
import { DBDateFormat } from "../../utils.js";
import { dataSource } from "../dataSource.js";
import { Config } from "../entities/Config.js";
const CLEAN_PER_LOOP = 50;
export async function cleanupConfigs() {
const configRepository = dataSource.getRepository(Config);
// FIXME: The query below doesn't work on MySQL 8.0. Pending an update.
return;
let cleaned = 0;
let rows;
// >1 month old: 1 config retained per month
const oneMonthCutoff = moment.utc().subtract(30, "days").format(DBDateFormat);
do {
rows = await dataSource.query(
`
WITH _configs
AS (
SELECT
id,
\`key\`,
YEAR(edited_at) AS \`year\`,
MONTH(edited_at) AS \`month\`,
ROW_NUMBER() OVER (
PARTITION BY \`key\`, \`year\`, \`month\`
ORDER BY edited_at
) AS row_num
FROM
configs
WHERE
is_active = 0
AND edited_at < ?
)
SELECT *
FROM _configs
WHERE row_num > 1
`,
[oneMonthCutoff],
);
if (rows.length > 0) {
await configRepository.delete({
id: In(rows.map((r) => r.id)),
});
}
cleaned += rows.length;
} while (rows.length === CLEAN_PER_LOOP);
// >2 weeks old: 1 config retained per day
const twoWeekCutoff = moment.utc().subtract(2, "weeks").format(DBDateFormat);
do {
rows = await dataSource.query(
`
WITH _configs
AS (
SELECT
id,
\`key\`,
DATE(edited_at) AS \`date\`,
ROW_NUMBER() OVER (
PARTITION BY \`key\`, \`date\`
ORDER BY edited_at
) AS row_num
FROM
configs
WHERE
is_active = 0
AND edited_at < ?
AND edited_at >= ?
)
SELECT *
FROM _configs
WHERE row_num > 1
`,
[twoWeekCutoff, oneMonthCutoff],
);
if (rows.length > 0) {
await configRepository.delete({
id: In(rows.map((r) => r.id)),
});
}
cleaned += rows.length;
} while (rows.length === CLEAN_PER_LOOP);
return cleaned;
}