mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2025-11-18 18:51:32 +10:00
Add scheduled deletion for cached PDF files
This commit is contained in:
@ -1,18 +1,17 @@
|
||||
import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common';
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
import { SchedulerRegistry } from '@nestjs/schedule';
|
||||
import { PageConfig } from '@reactive-resume/schema';
|
||||
import { access, mkdir, readdir, unlink, writeFile } from 'fs/promises';
|
||||
import { join } from 'path';
|
||||
import { PDFDocument } from 'pdf-lib';
|
||||
import { Browser, chromium } from 'playwright-chromium';
|
||||
|
||||
export const DELETION_TIME = 10 * 1000; // 10 seconds
|
||||
|
||||
@Injectable()
|
||||
export class PrinterService implements OnModuleInit, OnModuleDestroy {
|
||||
private browser: Browser;
|
||||
|
||||
constructor(private readonly configService: ConfigService) {}
|
||||
constructor(private readonly schedulerRegistry: SchedulerRegistry, private readonly configService: ConfigService) {}
|
||||
|
||||
async onModuleInit() {
|
||||
this.browser = await chromium.launch({
|
||||
@ -31,20 +30,29 @@ export class PrinterService implements OnModuleInit, OnModuleDestroy {
|
||||
const filename = `RxResume_PDFExport_${username}_${slug}_${lastUpdated}.pdf`;
|
||||
const publicUrl = `${serverUrl}/assets/exports/${filename}`;
|
||||
|
||||
try { // check if file already exists
|
||||
try {
|
||||
// check if file already exists
|
||||
await access(join(directory, filename));
|
||||
} catch { // create file as it doesn't exist
|
||||
// delete old files
|
||||
} catch {
|
||||
// delete old files and scheduler jobs
|
||||
const activeSchedulerTimeouts = this.schedulerRegistry.getTimeouts();
|
||||
await readdir(directory).then(async (files) => {
|
||||
await Promise.all(files.map(async (file) => {
|
||||
if (file.startsWith(`RxResume_PDFExport_${username}_${slug}`)) {
|
||||
await unlink(join(directory, file));
|
||||
}
|
||||
}));
|
||||
await Promise.all(
|
||||
files.map(async (file) => {
|
||||
if (file.startsWith(`RxResume_PDFExport_${username}_${slug}`)) {
|
||||
await unlink(join(directory, file));
|
||||
if (activeSchedulerTimeouts[`delete-${file}`]) {
|
||||
this.schedulerRegistry.deleteTimeout(`delete-${file}`);
|
||||
}
|
||||
}
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
// create file as it doesn't exist
|
||||
const url = this.configService.get<string>('app.url');
|
||||
const secretKey = this.configService.get<string>('app.secretKey');
|
||||
const pdfDeletionTime = this.configService.get<number>('cache.pdfDeletionTime');
|
||||
|
||||
const page = await this.browser.newPage();
|
||||
|
||||
@ -87,6 +95,19 @@ export class PrinterService implements OnModuleInit, OnModuleDestroy {
|
||||
|
||||
await mkdir(directory, { recursive: true });
|
||||
await writeFile(join(directory, filename), pdfBytes);
|
||||
|
||||
// Delete PDF artifacts after pdfDeletionTime ms
|
||||
const timeout = setTimeout(async () => {
|
||||
try {
|
||||
await unlink(join(directory, filename));
|
||||
|
||||
this.schedulerRegistry.deleteTimeout(`delete-${filename}`);
|
||||
} catch {
|
||||
// pass through
|
||||
}
|
||||
}, pdfDeletionTime);
|
||||
|
||||
this.schedulerRegistry.addTimeout(`delete-${filename}`, timeout);
|
||||
}
|
||||
|
||||
return publicUrl;
|
||||
|
||||
Reference in New Issue
Block a user