diff --git a/src/server/backend/db/db.js b/src/server/backend/db/db.js index 68fdcd8..f01dd59 100644 --- a/src/server/backend/db/db.js +++ b/src/server/backend/db/db.js @@ -12,7 +12,15 @@ const fs = require( 'fs' ); const settings = JSON.parse( fs.readFileSync( path.join( __dirname + '/../../config/settings.config.json' ) ) ); -const dbRef = { 'user': 'libreevent_users', 'admin': 'libreevent_admin', 'order': 'libreevent_orders', 'users': 'libreevent_users', 'orders': 'libreevent_orders', 'temp': 'libreevent_temp' }; +const dbRef = { + 'user': 'libreevent_users', + 'admin': 'libreevent_admin', + 'order': 'libreevent_orders', + 'users': 'libreevent_users', + 'orders': 'libreevent_orders', + 'temp': 'libreevent_temp', + 'processingOrders': 'libreevent_processing_orders' +}; const letters = [ ',', '{' ]; diff --git a/src/server/backend/db/jsondb.js b/src/server/backend/db/jsondb.js index 91bb23b..d52f87b 100644 --- a/src/server/backend/db/jsondb.js +++ b/src/server/backend/db/jsondb.js @@ -13,7 +13,7 @@ const path = require( 'path' ); class JSONDB { constructor () { this.db = {}; - this.dbIndex = { 'libreevent_temp': 0, 'libreevent_admin': 0, 'libreevent_orders': 0, 'libreevent_users': 0 }; + this.dbIndex = { 'libreevent_temp': 0, 'libreevent_admin': 0, 'libreevent_orders': 0, 'libreevent_users': 0, 'libreevent_processing_orders': 0 }; this.isSaving = false; this.awaitingSaving = true; } @@ -26,8 +26,8 @@ class JSONDB { console.error( '[ JSON-DB ] CRITICAL INITIALIZATION FAILURE!' + err ); throw ( 'JSONDB failed to start!' ); } - this.db = data[ 'db' ] ?? { 'libreevent_temp': {}, 'libreevent_admin': {}, 'libreevent_orders': {}, 'libreevent_users': {} }; - this.dbIndex = data[ 'index' ] ?? { 'libreevent_temp': 0, 'libreevent_admin': 0, 'libreevent_orders': 0, 'libreevent_users': 0 }; + this.db = data[ 'db' ] ?? { 'libreevent_temp': {}, 'libreevent_admin': {}, 'libreevent_orders': {}, 'libreevent_users': {}, 'libreevent_processing_orders': {} }; + this.dbIndex = data[ 'index' ] ?? { 'libreevent_temp': 0, 'libreevent_admin': 0, 'libreevent_orders': 0, 'libreevent_users': 0, 'libreevent_processing_orders': 0 }; this.db[ 'libreevent_temp' ] = {}; this.saveToDisk(); console.log( '[ JSON-DB ] Database initialized successfully' ); @@ -54,14 +54,14 @@ class JSONDB { } async resetDB () { - this.db = { 'libreevent_temp': {}, 'libreevent_admin': {}, 'libreevent_orders': {}, 'libreevent_users': {} }; - this.dbIndex = { 'libreevent_temp': 0, 'libreevent_admin': 0, 'libreevent_orders': 0, 'libreevent_users': 0 }; + this.db = { 'libreevent_temp': {}, 'libreevent_admin': {}, 'libreevent_orders': {}, 'libreevent_users': {}, 'libreevent_processing_orders': {} }; + this.dbIndex = { 'libreevent_temp': 0, 'libreevent_admin': 0, 'libreevent_orders': 0, 'libreevent_users': 0, 'libreevent_processing_orders': 0 }; fs.writeFile( path.join( __dirname + '/../../data/db.json' ), JSON.stringify( { 'db': this.db, 'index': this.dbIndex } ) ); } async setupDB () { - this.db = { 'libreevent_temp': {}, 'libreevent_admin': {}, 'libreevent_orders': {}, 'libreevent_users': {} }; - this.dbIndex = { 'libreevent_temp': 0, 'libreevent_admin': 0, 'libreevent_orders': 0, 'libreevent_users': 0 }; + this.db = { 'libreevent_temp': {}, 'libreevent_admin': {}, 'libreevent_orders': {}, 'libreevent_users': {}, 'libreevent_processing_orders': {} }; + this.dbIndex = { 'libreevent_temp': 0, 'libreevent_admin': 0, 'libreevent_orders': 0, 'libreevent_users': 0, 'libreevent_processing_orders': 0 }; fs.writeFile( path.join( __dirname + '/../../data/db.json' ), JSON.stringify( { 'db': this.db, 'index': this.dbIndex } ) ); } diff --git a/src/server/backend/db/mysqldb.js b/src/server/backend/db/mysqldb.js index c3d350e..288c25c 100644 --- a/src/server/backend/db/mysqldb.js +++ b/src/server/backend/db/mysqldb.js @@ -51,7 +51,10 @@ class SQLDB { if ( error ) if ( error.code !== 'ER_BAD_TABLE_ERROR' ) throw error; this.sqlConnection.query( 'DROP TABLE libreevent_temp;', ( error ) => { if ( error ) if ( error.code !== 'ER_BAD_TABLE_ERROR' ) throw error; - return 'done'; + this.sqlConnection.query( 'DROP TABLE libreevent_processing_orders;', ( error ) => { + if ( error ) if ( error.code !== 'ER_BAD_TABLE_ERROR' ) throw error; + return 'done'; + } ); } ); } ); } ); @@ -71,7 +74,10 @@ class SQLDB { if ( error ) if ( error.code !== 'ER_TABLE_EXISTS_ERROR' ) throw error; this.sqlConnection.query( 'CREATE TABLE libreevent_temp ( entry_id INT NOT NULL AUTO_INCREMENT, user_id TINYTEXT, data VARCHAR( 60000 ), timestamp TINYTEXT, PRIMARY KEY ( entry_id ) );', ( error ) => { if ( error ) if ( error.code !== 'ER_TABLE_EXISTS_ERROR' ) throw error; - return 'DONE'; + this.sqlConnection.query( 'CREATE TABLE libreevent_processing_orders ( entry_id INT NOT NULL AUTO_INCREMENT, user_id TINYTEXT, data VARCHAR( 60000 ), timestamp TINYTEXT, PRIMARY KEY ( entry_id ) );', ( error ) => { + if ( error ) if ( error.code !== 'ER_TABLE_EXISTS_ERROR' ) throw error; + return 'DONE'; + } ); } ); } ); } ); diff --git a/src/server/backend/payments/paymentRoutes.js b/src/server/backend/payments/paymentRoutes.js index 7246514..bdf1488 100644 --- a/src/server/backend/payments/paymentRoutes.js +++ b/src/server/backend/payments/paymentRoutes.js @@ -22,8 +22,8 @@ module.exports = ( app ) => { } ); app.get( '/tickets/tickets.pdf', ( req, res ) => { - if ( req.session.id ) { - fs.readFile( path.join( __dirname + '/../tickets/store/' + req.session.id + '.pdf' ), ( error, data ) => { + if ( req.session.lastOrderID ) { + fs.readFile( path.join( __dirname + '/../tickets/store/' + req.session.lastOrderID + '.pdf' ), ( error, data ) => { if ( error ) res.sendFile( path.join( __dirname + '/../../ui/en/errors/404.html' ) ); else res.send( data ); } ); diff --git a/src/server/backend/plugins/payments/payrexx/payrexxRoutes.js b/src/server/backend/plugins/payments/payrexx/payrexxRoutes.js index 6793610..502734b 100644 --- a/src/server/backend/plugins/payments/payrexx/payrexxRoutes.js +++ b/src/server/backend/plugins/payments/payrexx/payrexxRoutes.js @@ -58,7 +58,9 @@ module.exports = ( app, settings ) => { sessionReference[ session.id ] = { 'tok': req.session.id, 'email': req.session.username }; pendingPayments[ req.session.id ] = true; gatewayReference[ req.session.id ] = session.id; - res.send( session.link ); + db.writeDataSimple( 'processingOrders', 'user_id', req.session.id, dat[ 0 ] ).then( () => { + res.send( session.link ); + } ); } else { res.status( 500 ).send( 'ERR_PAYMENT' ); } @@ -100,9 +102,10 @@ module.exports = ( app, settings ) => { clearInterval( ping ); setTimeout( () => { response.write( 'data: ready\n\n' ); - response.end(); delete waitingClients[ request.session.id ]; + request.session.lastOrderID = request.session.id; request.session.id = generator.generateToken( 30 ); + response.end(); }, 2000 ); } else if ( stat === 'noTicket' ) { clearInterval( ping ); @@ -122,6 +125,7 @@ module.exports = ( app, settings ) => { if ( !pendingPayments[ request.session.id ] ) { const stat = TicketGenerator.getGenerationStatus( request.session.id ); if ( stat === 'done' ) { + request.session.lastOrderID = request.session.id; request.session.id = generator.generateToken( 30 ); response.send( { 'status': 'ticketOk' } ); } else if ( stat === 'noTicket' ) { @@ -155,7 +159,7 @@ module.exports = ( app, settings ) => { waitingClients[ sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ].write( 'data: paymentOk\n\n' ); } }, 1000 ); - db.getDataSimple( 'temp', 'user_id', sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ).then( dat => { + db.getDataSimple( 'processingOrders', 'user_id', sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ).then( dat => { db.getDataSimple( 'users', 'email', sessionReference[ response.data.data[ 0 ].id ][ 'email' ] ).then( user => { if ( user[ 0 ] ) { const tickets = JSON.parse( dat[ 0 ].data ); @@ -173,10 +177,18 @@ module.exports = ( app, settings ) => { } } db.writeJSONData( 'booked', booked ).then( () => { - delete pendingPayments[ sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ]; + db.deleteDataSimple( 'temp', 'user_id', sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ).then( () => { + db.deleteDataSimple( 'processingOrders', 'user_id', sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ).then( () => { + delete pendingPayments[ sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ]; + } ).catch( error => { + console.error( '[ PAYREXX ] ERROR whilst deleting data from DB: ' + error ); + } ); + } ).catch( error => { + console.error( '[ PAYREXX ] ERROR whilst deleting data from DB: ' + error ); + } ); } ); db.deleteDataSimple( 'temp', 'user_id', sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ).catch( error => { - console.error( '[ STRIPE ] ERROR whilst deleting data from DB: ' + error ); + console.error( '[ PAYREXX ] ERROR whilst deleting data from DB: ' + error ); } ); } ); } ); diff --git a/src/server/backend/plugins/payments/stripe/stripeRoutes.js b/src/server/backend/plugins/payments/stripe/stripeRoutes.js index 0c79938..ead47fe 100644 --- a/src/server/backend/plugins/payments/stripe/stripeRoutes.js +++ b/src/server/backend/plugins/payments/stripe/stripeRoutes.js @@ -63,7 +63,9 @@ 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 ); + db.writeDataSimple( 'processingOrders', 'user_id', req.session.id, dat[ 0 ] ).then( () => { + res.send( session.url ); + } ); } )(); } ); } else { @@ -102,9 +104,10 @@ module.exports = ( app, settings ) => { clearInterval( ping ); setTimeout( () => { response.write( 'data: ready\n\n' ); - response.end(); delete waitingClients[ request.session.id ]; + request.session.lastOrderID = request.session.id; request.session.id = generator.generateToken( 30 ); + response.end(); }, 2000 ); } else if ( stat === 'noTicket' ) { clearInterval( ping ); @@ -124,6 +127,7 @@ module.exports = ( app, settings ) => { if ( !pendingPayments[ request.session.id ] ) { const stat = TicketGenerator.getGenerationStatus( request.session.id ); if ( stat === 'done' ) { + request.session.lastOrderID = request.session.id; request.session.id = generator.generateToken( 30 ); response.send( { 'status': 'ticketOk' } ); } else if ( stat === 'noTicket' ) { @@ -157,7 +161,7 @@ module.exports = ( app, settings ) => { waitingClients[ sessionReference[ event.data.object.id ][ 'tok' ] ].write( 'data: paymentOk\n\n' ); } }, 1000 ); - db.getDataSimple( 'temp', 'user_id', sessionReference[ event.data.object.id ][ 'tok' ] ).then( dat => { + db.getDataSimple( 'processingOrders', '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 ] ) { const tickets = JSON.parse( dat[ 0 ].data ); @@ -175,12 +179,16 @@ module.exports = ( app, settings ) => { } db.writeJSONData( 'booked', booked ).then( () => { db.deleteDataSimple( 'temp', 'user_id', sessionReference[ event.data.object.id ][ 'tok' ] ).then( () => { - delete pendingPayments[ sessionReference[ event.data.object.id ][ 'tok' ] ]; + db.deleteDataSimple( 'processingOrders', 'user_id', sessionReference[ event.data.object.id ][ 'tok' ] ).then( () => { + delete pendingPayments[ sessionReference[ event.data.object.id ][ 'tok' ] ]; + } ).catch( error => { + console.error( '[ STRIPE ] ERROR whilst deleting data from DB: ' + error ); + } ); } ).catch( error => { console.error( '[ STRIPE ] ERROR whilst deleting data from DB: ' + error ); } ); - } ).catch( () => { - + } ).catch( error => { + console.error( '[ STRIPE ] ERROR whilst getting data from DB: ' + error ); } ); } ); } ); diff --git a/src/server/setupDB.js b/src/server/setupDB.js new file mode 100644 index 0000000..b12f8f5 --- /dev/null +++ b/src/server/setupDB.js @@ -0,0 +1,7 @@ +const db = require( './backend/db/db.js' ); + +( async () => { + await db.initDB(); + db.reset(); + console.log( 'DONE' ); +} )(); \ No newline at end of file