first commit
This commit is contained in:
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