first commit

This commit is contained in:
DerJesen
2025-11-29 12:26:58 +01:00
parent 2fae31f20f
commit fe5bbc1410
142 changed files with 19585 additions and 1 deletions

View File

@@ -0,0 +1,15 @@
import { IsString, IsEmail, IsIn } from 'class-validator';
export class CreateTicketDto {
@IsString()
eventId: string;
@IsString()
attendeeName: string;
@IsEmail()
attendeeEmail: string;
@IsIn(['Klassenbester', '1er Schüler', 'Partyborner'])
ticketType: string;
}

View File

@@ -0,0 +1,4 @@
import { PartialType } from '@nestjs/mapped-types';
import { CreateTicketDto } from './create-ticket.dto';
export class UpdateTicketDto extends PartialType(CreateTicketDto) {}

View File

@@ -0,0 +1 @@
export class Ticket {}

View File

@@ -0,0 +1,33 @@
import { Controller, Get, Post, Body, Param, Delete, Put, Query } from '@nestjs/common';
import { TicketsService } from './tickets.service';
import { CreateTicketDto } from './dto/create-ticket.dto';
@Controller('tickets')
export class TicketsController {
constructor(private readonly ticketsService: TicketsService) {}
@Post()
create(@Body() createTicketDto: CreateTicketDto) {
return this.ticketsService.create(createTicketDto);
}
@Get()
findAll(@Query('eventId') eventId: string) {
return this.ticketsService.findAll(eventId);
}
@Post(':id/resend')
resendEmail(@Param('id') id: string) {
return this.ticketsService.resendEmail(id);
}
@Put(':id/status')
updateStatus(@Param('id') id: string, @Body('status') status: string) {
return this.ticketsService.updateStatus(id, status);
}
@Delete(':id')
remove(@Param('id') id: string) {
return this.ticketsService.remove(id);
}
}

View File

@@ -0,0 +1,12 @@
import { Module } from '@nestjs/common';
import { TicketsService } from './tickets.service';
import { TicketsController } from './tickets.controller';
import { PrismaModule } from '../prisma/prisma.module';
import { MailModule } from '../mail/mail.module';
@Module({
imports: [PrismaModule, MailModule],
controllers: [TicketsController],
providers: [TicketsService],
})
export class TicketsModule {}

View File

@@ -0,0 +1,101 @@
import { Injectable } from '@nestjs/common';
import { CreateTicketDto } from './dto/create-ticket.dto';
import { PrismaService } from '../prisma/prisma.service';
import { MailService } from '../mail/mail.service';
import * as QRCode from 'qrcode'; // Import qrcode library
@Injectable()
export class TicketsService {
constructor(
private prisma: PrismaService,
private mailService: MailService,
) {}
async create(createTicketDto: CreateTicketDto) {
const ticket = await this.prisma.ticket.create({
data: createTicketDto,
include: { event: true },
});
try {
// Generate QR code buffer from ticket ID
const qrCodeBuffer = await QRCode.toBuffer(ticket.id, {
errorCorrectionLevel: 'H', // High error correction
type: 'png', // Output as PNG image
width: 250, // QR code width
color: {
dark: '#000000', // Black dots
light: '#FFFFFF', // White background
},
});
await this.mailService.sendTicket(
ticket.attendeeEmail,
ticket.attendeeName,
ticket.id,
ticket.event.name,
qrCodeBuffer, // Pass the QR code buffer
);
} catch (error) {
console.error('Failed to send ticket email:', error);
// Optionally throw error or just log it.
// For now, we log it so the ticket creation doesn't fail if email fails (unless strict requirement).
}
return ticket;
}
findAll(eventId: string) {
return this.prisma.ticket.findMany({
where: { eventId },
});
}
async resendEmail(id: string) {
const ticket = await this.prisma.ticket.findUnique({
where: { id },
include: { event: true },
});
if (!ticket) {
throw new Error('Ticket not found');
}
try {
const qrCodeBuffer = await QRCode.toBuffer(ticket.id, {
errorCorrectionLevel: 'H',
type: 'png',
width: 250,
color: {
dark: '#000000',
light: '#FFFFFF',
},
});
await this.mailService.sendTicket(
ticket.attendeeEmail,
ticket.attendeeName,
ticket.id,
ticket.event.name,
qrCodeBuffer,
);
return { success: true, message: 'Email resent successfully' };
} catch (error) {
console.error('Failed to resend ticket email:', error);
throw new Error('Failed to send email');
}
}
updateStatus(id: string, status: string) {
return this.prisma.ticket.update({
where: { id },
data: { status },
});
}
remove(id: string) {
return this.prisma.ticket.delete({
where: { id },
});
}
}