This commit is contained in:
Bastian Wagner
2026-03-13 15:09:09 +01:00
parent fbfbbf2b1a
commit 7271c7bc79
7 changed files with 1771 additions and 6 deletions

1708
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -20,7 +20,9 @@
"test:e2e": "jest --config ./test/jest-e2e.json" "test:e2e": "jest --config ./test/jest-e2e.json"
}, },
"dependencies": { "dependencies": {
"@aws-sdk/client-s3": "^3.1008.0",
"@nestjs/common": "^11.0.1", "@nestjs/common": "^11.0.1",
"@nestjs/config": "^4.0.3",
"@nestjs/core": "^11.0.1", "@nestjs/core": "^11.0.1",
"@nestjs/platform-express": "^11.0.1", "@nestjs/platform-express": "^11.0.1",
"puppeteer-core": "^24.39.0", "puppeteer-core": "^24.39.0",

View File

@@ -2,9 +2,18 @@ import { Module } from '@nestjs/common';
import { AppController } from './app.controller'; import { AppController } from './app.controller';
import { AppService } from './app.service'; import { AppService } from './app.service';
import { PdfModule } from './pdf/pdf.module'; import { PdfModule } from './pdf/pdf.module';
import { StorageModule } from './storage/storage.module';
import { ConfigModule } from '@nestjs/config';
@Module({ @Module({
imports: [PdfModule], imports: [
PdfModule
, StorageModule
, ConfigModule.forRoot({
envFilePath: ['.env'],
isGlobal: true,
}),
],
controllers: [AppController], controllers: [AppController],
providers: [AppService], providers: [AppService],
}) })

View File

@@ -1,9 +1,11 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { PdfController } from './pdf.controller'; import { PdfController } from './pdf.controller';
import { PdfService } from './pdf.service'; import { PdfService } from './pdf.service';
import { StorageModule } from 'src/storage/storage.module';
@Module({ @Module({
controllers: [PdfController], controllers: [PdfController],
providers: [PdfService] providers: [PdfService],
imports: [StorageModule]
}) })
export class PdfModule {} export class PdfModule {}

View File

@@ -1,9 +1,13 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import puppeteer from 'puppeteer-core'; import puppeteer from 'puppeteer-core';
import { KeyHandoverDto } from 'src/model/key-handover.dto'; import { KeyHandoverDto } from 'src/model/key-handover.dto';
import { MinioService } from 'src/storage/minio/minio.service';
@Injectable() @Injectable()
export class PdfService { export class PdfService {
constructor(private minioService: MinioService) {}
async generateTestPdf(): Promise<Buffer> { async generateTestPdf(): Promise<Buffer> {
const browser = await puppeteer.launch({ const browser = await puppeteer.launch({
executablePath: process.env.PUPPETEER_EXECUTABLE_PATH || '/usr/bin/chromium', executablePath: process.env.PUPPETEER_EXECUTABLE_PATH || '/usr/bin/chromium',
@@ -68,7 +72,7 @@ export class PdfService {
} }
} }
async generatePdf(dto: KeyHandoverDto): Promise<Buffer> { async generatePdf(dto: KeyHandoverDto): Promise<string> {
const browser = await puppeteer.launch({ const browser = await puppeteer.launch({
executablePath: process.env.PUPPETEER_EXECUTABLE_PATH || '/usr/bin/chromium', executablePath: process.env.PUPPETEER_EXECUTABLE_PATH || '/usr/bin/chromium',
headless: true, headless: true,
@@ -110,9 +114,10 @@ export class PdfService {
</div> </div>
`, `,
}); });
const fileName = crypto.randomUUID();
const buffer = Buffer.from(pdf); const buffer = Buffer.from(pdf);
return buffer; this.minioService.uploadPdf('keyvault-pro', fileName, buffer)
return fileName;
} finally { } finally {
await browser.close(); await browser.close();
} }

View File

@@ -0,0 +1,33 @@
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { PutObjectCommand, S3Client } from '@aws-sdk/client-s3';
@Injectable()
export class MinioService {
private readonly client: S3Client;
constructor(private configService: ConfigService) {
this.client = new S3Client({
region: 'us-east-1',
endpoint: this.configService.get('MINIOHOST') || '',
credentials: {
accessKeyId: this.configService.get('MINIOUSER') || '',
secretAccessKey: this.configService.get('MINIOACCESSKEY') || '',
},
forcePathStyle: true,
});
}
async uploadPdf(bucket: string, key: string, pdfBuffer: Buffer): Promise<void> {
await this.client.send(
new PutObjectCommand({
Bucket: bucket,
Key: key,
Body: pdfBuffer,
ContentType: 'application/pdf',
}),
);
}
}

View File

@@ -0,0 +1,8 @@
import { Module } from '@nestjs/common';
import { MinioService } from './minio/minio.service';
@Module({
providers: [MinioService],
exports: [MinioService]
})
export class StorageModule {}