ily.li/src/DeleteOldFilesJobComponent.ts

64 lines
1.9 KiB
TypeScript
Raw Normal View History

2021-03-30 16:31:23 +02:00
import config from "config";
2022-02-18 20:46:34 +01:00
import ApplicationComponent from "swaf/ApplicationComponent";
2021-03-30 16:31:23 +02:00
import MysqlComponent from "swaf/components/MysqlComponent";
2022-02-18 20:46:34 +01:00
import {WhereTest} from "swaf/db/ModelQuery";
import {logger} from "swaf/Logger";
import FileController from "./controllers/FileController.js";
import FileModel from "./models/FileModel.js";
2021-03-30 16:31:23 +02:00
import Timeout = NodeJS.Timeout;
export default class DeleteOldFilesJobComponent extends ApplicationComponent {
private timeout?: Timeout;
private readonly interval: number = config.get<number>('delete_old_files_interval');
public async start(): Promise<void> {
2022-02-18 20:46:34 +01:00
if (this.getApp().as(MysqlComponent).isReady()) {
2021-03-30 16:31:23 +02:00
await this.run();
}
this.schedule();
}
public async stop(): Promise<void> {
if (this.timeout) {
clearInterval(this.timeout);
this.timeout = undefined;
}
}
private schedule(): void {
if (this.timeout) {
clearInterval(this.timeout);
this.timeout = undefined;
}
this.timeout = setInterval(() => {
2022-02-18 20:46:34 +01:00
if (this.getApp().as(MysqlComponent).isReady()) {
2021-03-30 16:31:23 +02:00
this.run().catch(err => logger.error(err));
}
}, this.interval);
logger.info(`Scheduled old file deletion job every ${this.interval}ms`);
}
private async run(): Promise<void> {
const filesToDelete = await FileModel.select()
.where('expires_at', new Date(), WhereTest.LE)
.get();
if (filesToDelete.length > 0) {
logger.info('Deleting old files...');
} else {
logger.info('No old file to delete.');
return;
}
for (const file of filesToDelete) {
logger.info(`Deleting ${file.id}`);
if (!file.shouldBeDeleted()) throw new Error('File should not be deleted.');
await FileController.deleteFile(file);
}
}
}