Add old file deletion daily job
This commit is contained in:
parent
c8d7c664e2
commit
1dcbb6b414
@ -54,4 +54,7 @@
|
|||||||
],
|
],
|
||||||
default_url_domain_for_files: 0,
|
default_url_domain_for_files: 0,
|
||||||
default_url_domain_for_urls: 1,
|
default_url_domain_for_urls: 1,
|
||||||
|
|
||||||
|
// 1 hour in ms
|
||||||
|
delete_old_files_interval: 3600000,
|
||||||
}
|
}
|
||||||
|
@ -26,4 +26,7 @@
|
|||||||
],
|
],
|
||||||
default_url_domain_for_files: 0,
|
default_url_domain_for_files: 0,
|
||||||
default_url_domain_for_urls: 0,
|
default_url_domain_for_urls: 0,
|
||||||
|
|
||||||
|
// 1 day in ms
|
||||||
|
delete_old_files_interval: 86400000
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,7 @@ import MagicLinkController from "swaf/auth/magic_link/MagicLinkController";
|
|||||||
import AddUsedToMagicLinksMigration from "swaf/auth/magic_link/AddUsedToMagicLinksMigration";
|
import AddUsedToMagicLinksMigration from "swaf/auth/magic_link/AddUsedToMagicLinksMigration";
|
||||||
import MakeMagicLinksSessionNotUniqueMigration from "swaf/auth/magic_link/MakeMagicLinksSessionNotUniqueMigration";
|
import MakeMagicLinksSessionNotUniqueMigration from "swaf/auth/magic_link/MakeMagicLinksSessionNotUniqueMigration";
|
||||||
import AddPasswordToUsersMigration from "swaf/auth/password/AddPasswordToUsersMigration";
|
import AddPasswordToUsersMigration from "swaf/auth/password/AddPasswordToUsersMigration";
|
||||||
import DropNameFromUsers from "swaf/auth/migrations/DropNameFromUsers";
|
import DeleteOldFilesJobComponent from "./DeleteOldFilesJobComponent";
|
||||||
import packageJson = require('./package.json');
|
import packageJson = require('./package.json');
|
||||||
import ReplaceTtlWithExpiresAtFilesTable from "./migrations/ReplaceTtlWithExpiresAtFilesTable";
|
import ReplaceTtlWithExpiresAtFilesTable from "./migrations/ReplaceTtlWithExpiresAtFilesTable";
|
||||||
|
|
||||||
@ -117,6 +117,10 @@ export default class App extends Application {
|
|||||||
|
|
||||||
// WebSocket server
|
// WebSocket server
|
||||||
this.use(new WebSocketServerComponent(this, this.as(ExpressAppComponent), this.as(RedisComponent)));
|
this.use(new WebSocketServerComponent(this, this.as(ExpressAppComponent), this.as(RedisComponent)));
|
||||||
|
|
||||||
|
|
||||||
|
// Jobs
|
||||||
|
this.use(new DeleteOldFilesJobComponent());
|
||||||
}
|
}
|
||||||
|
|
||||||
private registerWebSocketListeners() {
|
private registerWebSocketListeners() {
|
||||||
|
62
src/DeleteOldFilesJobComponent.ts
Normal file
62
src/DeleteOldFilesJobComponent.ts
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
import ApplicationComponent from "swaf/ApplicationComponent";
|
||||||
|
import FileModel from "./models/FileModel";
|
||||||
|
import {logger} from "swaf/Logger";
|
||||||
|
import config from "config";
|
||||||
|
import {WhereTest} from "swaf/db/ModelQuery";
|
||||||
|
import MysqlComponent from "swaf/components/MysqlComponent";
|
||||||
|
import FileController from "./controllers/FileController";
|
||||||
|
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> {
|
||||||
|
if (this.getApp().as(MysqlComponent).canServe()) {
|
||||||
|
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(() => {
|
||||||
|
if (this.getApp().as(MysqlComponent).canServe()) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user