Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | import { Injectable, Logger } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { Model } from 'mongoose'; import { PdfGeneration } from './schemas/pdf.schema'; import { TemplateService } from '../templates/template.service'; import { StorageHubService } from '../storage/storage-hub.service'; // Simulate puppeteer or similar for PDF generation // import * as puppeteer from 'puppeteer'; @Injectable() export class PdfService { private readonly logger = new Logger(PdfService.name); constructor( @InjectModel(PdfGeneration.name) private pdfModel: Model<PdfGeneration>, private readonly templateService: TemplateService, private readonly storageService: StorageHubService, ) {} async generatePdf( tenantId: string, templateId: string, data: any, generatedBy: string, ): Promise<PdfGeneration> { const job = await this.pdfModel.create({ tenantId, templateId, status: 'pending', generatedBy, }); this.processPdfGeneration(job, data).catch((err) => { this.logger.error(`PDF generation failed in background: ${err.message}`); }); return job; } private async processPdfGeneration(job: any, data: any) { job.status = 'processing'; await job.save(); try { // 1. Render template const htmlContent = await this.templateService.renderTemplate( job.tenantId, job.templateId, data, ); // 2. Convert HTML to PDF (Mocking actual puppeteer implementation for now) // const browser = await puppeteer.launch(); // const page = await browser.newPage(); // await page.setContent(htmlContent); // const pdfBuffer = await page.pdf({ format: 'A4' }); // await browser.close(); const pdfBuffer = Buffer.from( `MOCK PDF CONTENT GENERATED FROM HTML: ${htmlContent.substring(0, 50)}...`, ); // 3. Save to storage const filename = `document_${job._id}.pdf`; const storageKey = `tenants/${job.tenantId}/pdfs`; const uploaded = await this.storageService.uploadFile(job.tenantId, { key: storageKey, filename, mimeType: 'application/pdf', buffer: pdfBuffer, }); job.storageKey = uploaded.key; job.status = 'completed'; await job.save(); } catch (error: any) { job.status = 'failed'; job.errorMessage = error.message; await job.save(); } } async getJobStatus(tenantId: string, jobId: string): Promise<PdfGeneration> { const job = await this.pdfModel.findOne({ _id: jobId, tenantId }).exec(); if (!job) { throw new Error('PDF generation job not found'); } return job; } } |