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

@@ -0,0 +1,3 @@
# Ticket Store
Here, all the tickets for all the orders are saved. You may delete the tickets here at any point. Should the user request their tickets once again, the tickets can simply be regenerated from the data stored in the database.

View File

@@ -0,0 +1,24 @@
/*
* libreevent - test.js
*
* Created by Janis Hutz 08/06/2023, Licensed under the GPL V3 License
* https://janishutz.com, development@janishutz.com
*
*
*/
const express = require( 'express' );
let app = express();
const ticket = require( './ticketGenerator.js' );
const TicketGenerator = new ticket();
const http = require( 'http' );
app.get( '/', ( request, response ) => {
response.send( 'ok' );
TicketGenerator.generateTickets( { 'tok': 'hGids5PVsHm_KiK-Wd-8ekvwxpuUPrUX', 'email': 'info@janishutz.com' } );
} );
const PORT = process.env.PORT || 8080;
http.createServer( app ).listen( PORT );

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 );
} );
} );
}