Files
QR-Invoice/src/routes/invoice.routes.ts
2026-01-12 13:12:46 +01:00

35 lines
1.2 KiB
TypeScript

import type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';
import { qrInvoiceRequestSchema, type QRInvoiceRequestInput } from '../schemas/qr-invoice.schema.js';
import { qrBillService } from '../services/qr-bill.service.js';
import { ApiError } from '../errors/error-handler.js';
export async function invoiceRoutes(fastify: FastifyInstance): Promise<void> {
fastify.post(
'/api/v1/invoice/qr-bill',
async (request: FastifyRequest<{ Body: QRInvoiceRequestInput }>, reply: FastifyReply) => {
// Validierung mit Zod
const parseResult = qrInvoiceRequestSchema.safeParse(request.body);
if (!parseResult.success) {
throw ApiError.validationError(
parseResult.error.errors.map(e => ({
path: e.path.join('.'),
message: e.message,
}))
);
}
// PDF generieren
const pdfBuffer = await qrBillService.generateQRBill(parseResult.data);
// Response Headers setzen
reply
.header('Content-Type', 'application/pdf')
.header('Content-Disposition', `attachment; filename="qr-bill-${Date.now()}.pdf"`)
.header('Content-Length', pdfBuffer.length);
return reply.send(pdfBuffer);
}
);
}