first commit
This commit is contained in:
15
src/tickets/dto/create-ticket.dto.ts
Normal file
15
src/tickets/dto/create-ticket.dto.ts
Normal 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;
|
||||
}
|
||||
4
src/tickets/dto/update-ticket.dto.ts
Normal file
4
src/tickets/dto/update-ticket.dto.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
import { PartialType } from '@nestjs/mapped-types';
|
||||
import { CreateTicketDto } from './create-ticket.dto';
|
||||
|
||||
export class UpdateTicketDto extends PartialType(CreateTicketDto) {}
|
||||
1
src/tickets/entities/ticket.entity.ts
Normal file
1
src/tickets/entities/ticket.entity.ts
Normal file
@@ -0,0 +1 @@
|
||||
export class Ticket {}
|
||||
33
src/tickets/tickets.controller.ts
Normal file
33
src/tickets/tickets.controller.ts
Normal 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);
|
||||
}
|
||||
}
|
||||
12
src/tickets/tickets.module.ts
Normal file
12
src/tickets/tickets.module.ts
Normal 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 {}
|
||||
101
src/tickets/tickets.service.ts
Normal file
101
src/tickets/tickets.service.ts
Normal 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 },
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user