mirror of
https://github.com/janishutz/libreevent.git
synced 2025-11-25 13:24:24 +00:00
ticket generation working
This commit is contained in:
3
src/server/backend/tickets/store/README.md
Normal file
3
src/server/backend/tickets/store/README.md
Normal 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.
|
||||
24
src/server/backend/tickets/test.js
Normal file
24
src/server/backend/tickets/test.js
Normal 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 );
|
||||
@@ -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 );
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user