init
This commit is contained in:
22
src/app.controller.spec.ts
Normal file
22
src/app.controller.spec.ts
Normal 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
12
src/app.controller.ts
Normal 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
11
src/app.module.ts
Normal 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
8
src/app.service.ts
Normal 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
8
src/main.ts
Normal 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();
|
||||
18
src/pdf/pdf.controller.spec.ts
Normal file
18
src/pdf/pdf.controller.spec.ts
Normal 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
17
src/pdf/pdf.controller.ts
Normal 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
9
src/pdf/pdf.module.ts
Normal 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 {}
|
||||
18
src/pdf/pdf.service.spec.ts
Normal file
18
src/pdf/pdf.service.spec.ts
Normal 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
69
src/pdf/pdf.service.ts
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user