summaryrefslogtreecommitdiffstats
path: root/server/jobs/clear-old-data.js
diff options
context:
space:
mode:
Diffstat (limited to 'server/jobs/clear-old-data.js')
-rw-r--r--server/jobs/clear-old-data.js65
1 files changed, 65 insertions, 0 deletions
diff --git a/server/jobs/clear-old-data.js b/server/jobs/clear-old-data.js
new file mode 100644
index 0000000..cfd65a8
--- /dev/null
+++ b/server/jobs/clear-old-data.js
@@ -0,0 +1,65 @@
+const { R } = require("redbean-node");
+const { log } = require("../../src/util");
+const Database = require("../database");
+const { Settings } = require("../settings");
+const dayjs = require("dayjs");
+
+const DEFAULT_KEEP_PERIOD = 365;
+
+/**
+ * Clears old data from the heartbeat table and the stat_daily of the database.
+ * @returns {Promise<void>} A promise that resolves when the data has been cleared.
+ */
+const clearOldData = async () => {
+ await Database.clearHeartbeatData();
+ let period = await Settings.get("keepDataPeriodDays");
+
+ // Set Default Period
+ if (period == null) {
+ await Settings.set("keepDataPeriodDays", DEFAULT_KEEP_PERIOD, "general");
+ period = DEFAULT_KEEP_PERIOD;
+ }
+
+ // Try parse setting
+ let parsedPeriod;
+ try {
+ parsedPeriod = parseInt(period);
+ } catch (_) {
+ log.warn("clearOldData", "Failed to parse setting, resetting to default..");
+ await Settings.set("keepDataPeriodDays", DEFAULT_KEEP_PERIOD, "general");
+ parsedPeriod = DEFAULT_KEEP_PERIOD;
+ }
+
+ if (parsedPeriod < 1) {
+ log.info("clearOldData", `Data deletion has been disabled as period is less than 1. Period is ${parsedPeriod} days.`);
+ } else {
+ log.debug("clearOldData", `Clearing Data older than ${parsedPeriod} days...`);
+ const sqlHourOffset = Database.sqlHourOffset();
+
+ try {
+ // Heartbeat
+ await R.exec("DELETE FROM heartbeat WHERE time < " + sqlHourOffset, [
+ parsedPeriod * -24,
+ ]);
+
+ let timestamp = dayjs().subtract(parsedPeriod, "day").utc().startOf("day").unix();
+
+ // stat_daily
+ await R.exec("DELETE FROM stat_daily WHERE timestamp < ? ", [
+ timestamp,
+ ]);
+
+ if (Database.dbConfig.type === "sqlite") {
+ await R.exec("PRAGMA optimize;");
+ }
+ } catch (e) {
+ log.error("clearOldData", `Failed to clear old data: ${e.message}`);
+ }
+ }
+
+ log.debug("clearOldData", "Data cleared.");
+};
+
+module.exports = {
+ clearOldData,
+};