summaryrefslogtreecommitdiff
path: root/packages/backend/src/daemons/ActivityLogCleanupService.ts
diff options
context:
space:
mode:
authorHazelnoot <acomputerdog@gmail.com>2024-11-14 12:11:37 -0500
committerHazelnoot <acomputerdog@gmail.com>2025-02-16 19:25:02 -0500
commitb65b4ecadcd364adeede80f71a2f106671fb434f (patch)
tree3eb2446c9caeef850444cccc0c905823b66cf039 /packages/backend/src/daemons/ActivityLogCleanupService.ts
parentmerge: Merge upstream 2025.2.0 (!886) (diff)
downloadsharkey-b65b4ecadcd364adeede80f71a2f106671fb434f.tar.gz
sharkey-b65b4ecadcd364adeede80f71a2f106671fb434f.tar.bz2
sharkey-b65b4ecadcd364adeede80f71a2f106671fb434f.zip
add inbound activity logger for debugging
Diffstat (limited to 'packages/backend/src/daemons/ActivityLogCleanupService.ts')
-rw-r--r--packages/backend/src/daemons/ActivityLogCleanupService.ts64
1 files changed, 64 insertions, 0 deletions
diff --git a/packages/backend/src/daemons/ActivityLogCleanupService.ts b/packages/backend/src/daemons/ActivityLogCleanupService.ts
new file mode 100644
index 0000000000..e2ffef3c5f
--- /dev/null
+++ b/packages/backend/src/daemons/ActivityLogCleanupService.ts
@@ -0,0 +1,64 @@
+/*
+ * SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { Inject, Injectable, type OnApplicationShutdown } from '@nestjs/common';
+import { LessThan } from 'typeorm';
+import { DI } from '@/di-symbols.js';
+import type { Config } from '@/config.js';
+import { bindThis } from '@/decorators.js';
+import type { ActivityLogsRepository } from '@/models/_.js';
+
+// 10 minutes
+export const scanInterval = 1000 * 60 * 10;
+
+@Injectable()
+export class ActivityLogCleanupService implements OnApplicationShutdown {
+ private scanTimer: NodeJS.Timeout | null = null;
+
+ constructor(
+ @Inject(DI.config)
+ private readonly config: Config,
+
+ @Inject(DI.activityLogsRepository)
+ private readonly activityLogsRepository: ActivityLogsRepository,
+ ) {}
+
+ @bindThis
+ public async start(): Promise<void> {
+ // Just in case start() gets called multiple times.
+ this.dispose();
+
+ // Prune at startup, in case the server was rebooted during the interval.
+ // noinspection ES6MissingAwait
+ this.tick();
+
+ // Prune on a regular interval for the lifetime of the server.
+ this.scanTimer = setInterval(this.tick, scanInterval);
+ }
+
+ @bindThis
+ private async tick(): Promise<void> {
+ // This is the date in UTC of the oldest log to KEEP
+ const oldestAllowed = new Date(Date.now() - this.config.activityLogging.maxAge);
+
+ // Delete all logs older than the threshold.
+ await this.activityLogsRepository.delete({
+ at: LessThan(oldestAllowed),
+ });
+ }
+
+ @bindThis
+ public onApplicationShutdown(): void {
+ this.dispose();
+ }
+
+ @bindThis
+ public dispose(): void {
+ if (this.scanTimer) {
+ clearInterval(this.scanTimer);
+ this.scanTimer = null;
+ }
+ }
+}