ticket generation working

This commit is contained in:
2023-08-06 18:37:21 +02:00
parent 2812ab9055
commit 32ed36b93f
26 changed files with 594 additions and 96 deletions

View File

@@ -10,18 +10,34 @@
const pdfme = require( '@pdfme/generator' );
const db = require( '../db/db.js' );
const pdfLib = require( 'pdf-lib' );
const fs = require( 'fs' );
const path = require( 'path' );
const mm = require( '../mail/mailSender.js' );
const mailManager = new mm();
let createSSRApp = require( 'vue' ).createSSRApp;
let renderToString = require( 'vue/server-renderer' ).renderToString;
const settings = JSON.parse( fs.readFileSync( path.join( __dirname + '/../../config/settings.config.json' ) ) );
class TicketGenerator {
constructor () {
this.ticketQueue = {};
this.jobId = 0;
this.currentlyRunningJob = 0;
this.isRunning = false;
db.getJSONData( 'tickets' ).then( tickets => {
this.tickets = tickets;
} );
db.getJSONData( 'events' ).then( events => {
this.events = events;
} );
}
// TODO: Save to disk in case of crash of server / reboot / whatever
// and continue processing once back online
generateTicket ( event, data ) {
this.ticketQueue [ this.jobId ] = { 'event': event, 'data': data };
generateTickets ( order ) {
this.ticketQueue [ this.jobId ] = { 'order': order };
this.jobId += 1;
this.queueHandler();
}
@@ -30,28 +46,78 @@ class TicketGenerator {
queueHandler () {
if ( !this.isRunning ) {
this.isRunning = true;
this.ticketGenerator( this.ticketQueue[ this.jobId ][ 'event' ], this.ticketQueue[ this.jobId ][ 'data' ] ).then( pdf => {
console.log( pdf );
// TODO: Maybe write to disk
this.isRunning = false;
this.queueHandler();
} ).catch( error => {
console.error( '[ PDF GENERATOR ] ERROR: ' + error );
this.isRunning = false;
this.queueHandler();
// TODO: Add to FAILED db
} );
if ( this.ticketQueue[ this.currentlyRunningJob ] ) {
this.ticketGenerator( this.ticketQueue[ this.currentlyRunningJob ][ 'order' ] ).then( res => {
this.currentlyRunningJob += 1;
if ( res.status ) {
db.getDataSimple( 'users', 'account_id', res.user ).then( dat => {
if ( dat[ 0 ] ) {
( async () => {
const app = createSSRApp( {
data() {
return {
host: settings.yourDomain,
pageName: settings.name,
};
},
template: '' + fs.readFileSync( path.join( __dirname + '/../../ui/en/payments/ticketMail.html' ) )
} );
console.log( dat[ 0 ].email );
mailManager.sendMailWithAttachment( dat[ 0 ].email, await renderToString( app ), 'Thank you for your order', [
{
'filename': 'tickets.pdf',
'path': res.file,
}
], settings.mailSender
);
// db.writeDataSimple( 'orders', 'order_name', res.order, { 'processed': 'true' } );
} )();
}
} );
}
this.isRunning = false;
this.queueHandler();
} ).catch( error => {
console.error( '[ PDF GENERATOR ] ERROR: ' + error );
this.isRunning = false;
// TODO: Add to FAILED db
} );
}
}
}
ticketGenerator ( event, data ) {
ticketGenerator ( order ) {
return new Promise( ( resolve, reject ) => {
db.getJSONDataSimple( event ).then( template => {
pdfme.generate( { template, data } ).then( pdf => {
resolve( pdf );
} ).catch( error => {
reject( error );
} );
db.getDataSimple( 'orders', 'order_name', order.tok ).then( ord => {
if ( ord[ 0 ] ) {
( async () => {
let doc = await pdfLib.PDFDocument.create();
let pages = [];
const order = JSON.parse( ord[ 0 ].tickets );
for ( let event in order ) {
const template = this.tickets[ event ];
for ( let ticket in order[ event ] ) {
const data = [ {
'locationAndTime': this.events[ event ][ 'date' ],
'ticketName': order[ event ][ ticket ][ 'name' ],
'ticketQRCode': ord[ 0 ].order_name + '_' + order[ event ][ ticket ][ 'id' ],
} ];
const page = await pdfLib.PDFDocument.load( await pdfme.generate( { 'template': template, 'inputs': data } ) );
const p = await doc.copyPages( page, page.getPageIndices() );
pages.push( p );
p.forEach( ( page ) => doc.addPage( page ) );
}
}
const f = path.join( __dirname + '/store/' + ord[ 0 ].order_name + '.pdf' );
fs.writeFileSync( f, await doc.save() );
resolve( { 'status': true, 'file': f, 'user': ord[ 0 ].account_id, 'order': ord[ 0 ].order_name } );
} )();
} else {
reject( 'ERR_NO_ORDER' );
}
} ).catch( err => {
console.error( err );
} );
} );
}