diff --git a/src/server/backend/plugins/payments/stripe/stripeRoutes.js b/src/server/backend/plugins/payments/stripe/stripeRoutes.js index 4d441a1..dcb9645 100644 --- a/src/server/backend/plugins/payments/stripe/stripeRoutes.js +++ b/src/server/backend/plugins/payments/stripe/stripeRoutes.js @@ -20,6 +20,7 @@ const endpointSecret = stripConfig[ 'endpointSecret' ]; let sessionReference = {}; let waitingClients = {}; +let pendingPayments = {}; let paymentOk = {}; // TODO: Remove all selected tickets if timestamp more than user defined amount ago @@ -40,7 +41,6 @@ module.exports = ( app, settings ) => { if ( dat[ 0 ] ) { db.getJSONData( 'events' ).then( events => { let data = JSON.parse( dat[ 0 ].data ); - console.log( data ); ( async () => { for ( let event in data ) { for ( let item in data[ event ] ) { @@ -58,6 +58,7 @@ module.exports = ( app, settings ) => { } const session = await stripe.checkout.sessions.create( purchase ); sessionReference[ session.id ] = { 'tok': req.session.id, 'email': req.session.username }; + pendingPayments[ req.session.id ] = true; res.send( session.url ); } )(); } ); @@ -84,19 +85,21 @@ module.exports = ( app, settings ) => { response.write( 'data: connected\n\n' ); waitingClients[ request.session.id ] = response; const ping = setInterval( () => { - const stat = TicketGenerator.getGenerationStatus( request.session.id ); - if ( stat === 'done' ) { - clearInterval( ping ); - setTimeout( () => { - response.write( 'data: ready\n\n' ); + if ( !pendingPayments[ request.session.id ] ) { + const stat = TicketGenerator.getGenerationStatus( request.session.id ); + if ( stat === 'done' ) { + clearInterval( ping ); + setTimeout( () => { + response.write( 'data: ready\n\n' ); + response.end(); + delete waitingClients[ request.session.id ]; + }, 2000 ); + } else if ( stat === 'noTicket' ) { + clearInterval( ping ); + response.write( 'data: noData\n\n' ); response.end(); delete waitingClients[ request.session.id ]; - }, 2000 ); - } else if ( stat === 'noTicket' ) { - clearInterval( ping ); - response.write( 'data: noData\n\n' ); - response.end(); - delete waitingClients[ request.session.id ]; + } } }, 2000 ); } ); @@ -139,26 +142,26 @@ module.exports = ( app, settings ) => { db.getDataSimple( 'temp', 'user_id', sessionReference[ event.data.object.id ][ 'tok' ] ).then( dat => { db.getDataSimple( 'users', 'email', sessionReference[ event.data.object.id ][ 'email' ] ).then( user => { if ( user[ 0 ] ) { - console.log( sessionReference[ event.data.object.id ][ 'tok' ] ); const tickets = JSON.parse( dat[ 0 ].data ); db.writeDataSimple( 'orders', 'account_id', user[ 0 ].account_id, { 'account_id': user[ 0 ].account_id, 'tickets': dat[ 0 ].data, 'order_name': sessionReference[ event.data.object.id ][ 'tok' ] } ).then( () => { + console.log( sessionReference[ event.data.object.id ][ 'tok' ] ); + delete pendingPayments[ sessionReference[ event.data.object.id ][ 'tok' ] ]; TicketGenerator.generateTickets( sessionReference[ event.data.object.id ] ); - } ); - db.getJSONData( 'booked' ).then( ret => { - let booked = ret ?? {}; - for ( let event in tickets ) { - if ( !booked[ String( event ) ] ) { - booked[ String( event ) ] = {}; + db.getJSONData( 'booked' ).then( ret => { + let booked = ret ?? {}; + for ( let event in tickets ) { + if ( !booked[ String( event ) ] ) { + booked[ String( event ) ] = {}; + } + for ( let tik in tickets[ event ] ) { + booked[ event ][ tik ] = tickets[ event ][ tik ]; + } } - for ( let tik in tickets[ event ] ) { - booked[ event ][ tik ] = tickets[ event ][ tik ]; - } - } - db.writeJSONData( 'booked', booked ); - } ); - - db.deleteDataSimple( 'temp', 'user_id', sessionReference[ event.data.object.id ][ 'tok' ] ).catch( error => { - console.error( '[ STRIPE ] ERROR whilst deleting data from DB: ' + error ); + db.writeJSONData( 'booked', booked ); + db.deleteDataSimple( 'temp', 'user_id', sessionReference[ event.data.object.id ][ 'tok' ] ).catch( error => { + console.error( '[ STRIPE ] ERROR whilst deleting data from DB: ' + error ); + } ); + } ); } ); } else { console.log( sessionReference[ event.data.object.id ][ 'email' ] ); diff --git a/src/server/backend/tickets/ticketGenerator.js b/src/server/backend/tickets/ticketGenerator.js index 1f578a1..a71a706 100644 --- a/src/server/backend/tickets/ticketGenerator.js +++ b/src/server/backend/tickets/ticketGenerator.js @@ -35,11 +35,10 @@ class TicketGenerator { this.runningTickets = {}; } - // TODO: Save to disk / DB in case of crash of server / reboot / whatever - // and continue processing once back online + // TODO: continue processing once back online generateTickets ( order ) { this.ticketQueue[ this.jobId ] = { 'order': order }; - this.runningTickets[ order ] = 'processing'; + this.runningTickets[ order.tok ] = 'processing'; this.jobId += 1; this.queueHandler(); } diff --git a/src/server/ui/en/payments/ticketMail.html b/src/server/ui/en/payments/ticketMail.html index a43e17f..e8ff201 100644 --- a/src/server/ui/en/payments/ticketMail.html +++ b/src/server/ui/en/payments/ticketMail.html @@ -8,7 +8,6 @@ body { font-family: sans-serif; width: 100%; - height: 800px; margin: 0; display: flex; justify-content: center; @@ -18,7 +17,7 @@ .content { width: 80%; - height: 90%; + height: 800px; display: flex; justify-content: center; align-items: center; diff --git a/src/webapp/main/src/components/noseatplan.vue b/src/webapp/main/src/components/noseatplan.vue index 92788c6..48a92fb 100644 --- a/src/webapp/main/src/components/noseatplan.vue +++ b/src/webapp/main/src/components/noseatplan.vue @@ -16,7 +16,7 @@