This commit is contained in:
Bastian Wagner
2026-03-12 14:13:08 +01:00
commit faa5003df0
22 changed files with 12332 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
import { Test, TestingModule } from '@nestjs/testing';
import { AppController } from './app.controller';
import { AppService } from './app.service';
describe('AppController', () => {
let appController: AppController;
beforeEach(async () => {
const app: TestingModule = await Test.createTestingModule({
controllers: [AppController],
providers: [AppService],
}).compile();
appController = app.get<AppController>(AppController);
});
describe('root', () => {
it('should return "Hello World!"', () => {
expect(appController.getHello()).toBe('Hello World!');
});
});
});

12
src/app.controller.ts Normal file
View File

@@ -0,0 +1,12 @@
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}

11
src/app.module.ts Normal file
View File

@@ -0,0 +1,11 @@
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { PdfModule } from './pdf/pdf.module';
@Module({
imports: [PdfModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}

8
src/app.service.ts Normal file
View File

@@ -0,0 +1,8 @@
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}

8
src/main.ts Normal file
View File

@@ -0,0 +1,8 @@
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(process.env.PORT ?? 3000);
}
bootstrap();

View File

@@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { PdfController } from './pdf.controller';
describe('PdfController', () => {
let controller: PdfController;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [PdfController],
}).compile();
controller = module.get<PdfController>(PdfController);
});
it('should be defined', () => {
expect(controller).toBeDefined();
});
});

17
src/pdf/pdf.controller.ts Normal file
View File

@@ -0,0 +1,17 @@
import { Controller, Get, Header, Res } from "@nestjs/common";
import { PdfService } from "./pdf.service";
import { Response } from 'express';
@Controller('pdf')
export class PdfController {
constructor(private readonly pdfService: PdfService) {}
@Get('test')
@Header('Content-Type', 'application/pdf')
async getTestPdf(@Res() res: Response): Promise<void> {
const pdfBuffer = await this.pdfService.generateTestPdf();
res.setHeader('Content-Disposition', 'inline; filename="test.pdf"');
res.send(pdfBuffer);
}
}

9
src/pdf/pdf.module.ts Normal file
View File

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

View File

@@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { PdfService } from './pdf.service';
describe('PdfService', () => {
let service: PdfService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [PdfService],
}).compile();
service = module.get<PdfService>(PdfService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});

69
src/pdf/pdf.service.ts Normal file
View File

@@ -0,0 +1,69 @@
import { Injectable } from '@nestjs/common';
import puppeteer from 'puppeteer-core';
@Injectable()
export class PdfService {
async generateTestPdf(): Promise<Buffer> {
const browser = await puppeteer.launch({
executablePath: process.env.PUPPETEER_EXECUTABLE_PATH || '/usr/bin/chromium',
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox'],
});
const page = await browser.newPage();
const html = `
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<title>PDF Test</title>
<style>
body {
font-family: Arial, sans-serif;
padding: 40px;
}
h1 {
margin-bottom: 16px;
}
.box {
border: 1px solid #ccc;
padding: 16px;
margin-top: 20px;
}
ul {
margin-top: 12px;
}
</style>
</head>
<body>
<h1>PDF Test erfolgreich</h1>
<p>Wenn du dieses PDF siehst, läuft NestJS + Docker + Chromium.</p>
<div class="box">
<strong>Dummy-Daten:</strong>
<ul>
<li>Name: Testkunde GmbH</li>
<li>Projekt: PDF Deployment Check</li>
<li>Status: OK</li>
</ul>
</div>
</body>
</html>
`;
try {
await page.setContent(html, { waitUntil: 'networkidle0' });
const pdf = await page.pdf({
format: 'A4',
printBackground: true,
});
return Buffer.from(pdf);
} finally {
await page.close();
await browser.close();
}
}
}