mirror of
https://github.com/janishutz/libreevent.git
synced 2025-11-25 13:24:24 +00:00
make payment processing more robust
This commit is contained in:
@@ -12,7 +12,15 @@ const fs = require( 'fs' );
|
|||||||
|
|
||||||
const settings = JSON.parse( fs.readFileSync( path.join( __dirname + '/../../config/settings.config.json' ) ) );
|
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 = [ ',', '{' ];
|
const letters = [ ',', '{' ];
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ const path = require( 'path' );
|
|||||||
class JSONDB {
|
class JSONDB {
|
||||||
constructor () {
|
constructor () {
|
||||||
this.db = {};
|
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.isSaving = false;
|
||||||
this.awaitingSaving = true;
|
this.awaitingSaving = true;
|
||||||
}
|
}
|
||||||
@@ -26,8 +26,8 @@ class JSONDB {
|
|||||||
console.error( '[ JSON-DB ] CRITICAL INITIALIZATION FAILURE!' + err );
|
console.error( '[ JSON-DB ] CRITICAL INITIALIZATION FAILURE!' + err );
|
||||||
throw ( 'JSONDB failed to start!' );
|
throw ( 'JSONDB failed to start!' );
|
||||||
}
|
}
|
||||||
this.db = data[ 'db' ] ?? { 'libreevent_temp': {}, 'libreevent_admin': {}, 'libreevent_orders': {}, 'libreevent_users': {} };
|
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 };
|
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.db[ 'libreevent_temp' ] = {};
|
||||||
this.saveToDisk();
|
this.saveToDisk();
|
||||||
console.log( '[ JSON-DB ] Database initialized successfully' );
|
console.log( '[ JSON-DB ] Database initialized successfully' );
|
||||||
@@ -54,14 +54,14 @@ class JSONDB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async resetDB () {
|
async resetDB () {
|
||||||
this.db = { 'libreevent_temp': {}, 'libreevent_admin': {}, 'libreevent_orders': {}, 'libreevent_users': {} };
|
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 };
|
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 } ) );
|
fs.writeFile( path.join( __dirname + '/../../data/db.json' ), JSON.stringify( { 'db': this.db, 'index': this.dbIndex } ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
async setupDB () {
|
async setupDB () {
|
||||||
this.db = { 'libreevent_temp': {}, 'libreevent_admin': {}, 'libreevent_orders': {}, 'libreevent_users': {} };
|
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 };
|
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 } ) );
|
fs.writeFile( path.join( __dirname + '/../../data/db.json' ), JSON.stringify( { 'db': this.db, 'index': this.dbIndex } ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -50,12 +50,15 @@ class SQLDB {
|
|||||||
this.sqlConnection.query( 'DROP TABLE libreevent_admin;', ( error ) => {
|
this.sqlConnection.query( 'DROP TABLE libreevent_admin;', ( error ) => {
|
||||||
if ( error ) if ( error.code !== 'ER_BAD_TABLE_ERROR' ) throw error;
|
if ( error ) if ( error.code !== 'ER_BAD_TABLE_ERROR' ) throw error;
|
||||||
this.sqlConnection.query( 'DROP TABLE libreevent_temp;', ( error ) => {
|
this.sqlConnection.query( 'DROP TABLE libreevent_temp;', ( error ) => {
|
||||||
|
if ( error ) if ( error.code !== 'ER_BAD_TABLE_ERROR' ) throw error;
|
||||||
|
this.sqlConnection.query( 'DROP TABLE libreevent_processing_orders;', ( error ) => {
|
||||||
if ( error ) if ( error.code !== 'ER_BAD_TABLE_ERROR' ) throw error;
|
if ( error ) if ( error.code !== 'ER_BAD_TABLE_ERROR' ) throw error;
|
||||||
return 'done';
|
return 'done';
|
||||||
} );
|
} );
|
||||||
} );
|
} );
|
||||||
} );
|
} );
|
||||||
} );
|
} );
|
||||||
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
async setupDB ( ) {
|
async setupDB ( ) {
|
||||||
@@ -70,12 +73,15 @@ class SQLDB {
|
|||||||
this.sqlConnection.query( 'CREATE TABLE libreevent_admin ( account_id INT NOT NULL AUTO_INCREMENT, email TINYTEXT, pass TEXT, permissions VARCHAR( 1000 ), username TINYTEXT, two_fa TINYTEXT, PRIMARY KEY ( account_id ) );', ( error ) => {
|
this.sqlConnection.query( 'CREATE TABLE libreevent_admin ( account_id INT NOT NULL AUTO_INCREMENT, email TINYTEXT, pass TEXT, permissions VARCHAR( 1000 ), username TINYTEXT, two_fa TINYTEXT, PRIMARY KEY ( account_id ) );', ( error ) => {
|
||||||
if ( error ) if ( error.code !== 'ER_TABLE_EXISTS_ERROR' ) throw error;
|
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 ) => {
|
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;
|
||||||
|
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;
|
if ( error ) if ( error.code !== 'ER_TABLE_EXISTS_ERROR' ) throw error;
|
||||||
return 'DONE';
|
return 'DONE';
|
||||||
} );
|
} );
|
||||||
} );
|
} );
|
||||||
} );
|
} );
|
||||||
} );
|
} );
|
||||||
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
query ( operation, table ) {
|
query ( operation, table ) {
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ module.exports = ( app ) => {
|
|||||||
} );
|
} );
|
||||||
|
|
||||||
app.get( '/tickets/tickets.pdf', ( req, res ) => {
|
app.get( '/tickets/tickets.pdf', ( req, res ) => {
|
||||||
if ( req.session.id ) {
|
if ( req.session.lastOrderID ) {
|
||||||
fs.readFile( path.join( __dirname + '/../tickets/store/' + req.session.id + '.pdf' ), ( error, data ) => {
|
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' ) );
|
if ( error ) res.sendFile( path.join( __dirname + '/../../ui/en/errors/404.html' ) );
|
||||||
else res.send( data );
|
else res.send( data );
|
||||||
} );
|
} );
|
||||||
|
|||||||
@@ -58,7 +58,9 @@ module.exports = ( app, settings ) => {
|
|||||||
sessionReference[ session.id ] = { 'tok': req.session.id, 'email': req.session.username };
|
sessionReference[ session.id ] = { 'tok': req.session.id, 'email': req.session.username };
|
||||||
pendingPayments[ req.session.id ] = true;
|
pendingPayments[ req.session.id ] = true;
|
||||||
gatewayReference[ req.session.id ] = session.id;
|
gatewayReference[ req.session.id ] = session.id;
|
||||||
|
db.writeDataSimple( 'processingOrders', 'user_id', req.session.id, dat[ 0 ] ).then( () => {
|
||||||
res.send( session.link );
|
res.send( session.link );
|
||||||
|
} );
|
||||||
} else {
|
} else {
|
||||||
res.status( 500 ).send( 'ERR_PAYMENT' );
|
res.status( 500 ).send( 'ERR_PAYMENT' );
|
||||||
}
|
}
|
||||||
@@ -100,9 +102,10 @@ module.exports = ( app, settings ) => {
|
|||||||
clearInterval( ping );
|
clearInterval( ping );
|
||||||
setTimeout( () => {
|
setTimeout( () => {
|
||||||
response.write( 'data: ready\n\n' );
|
response.write( 'data: ready\n\n' );
|
||||||
response.end();
|
|
||||||
delete waitingClients[ request.session.id ];
|
delete waitingClients[ request.session.id ];
|
||||||
|
request.session.lastOrderID = request.session.id;
|
||||||
request.session.id = generator.generateToken( 30 );
|
request.session.id = generator.generateToken( 30 );
|
||||||
|
response.end();
|
||||||
}, 2000 );
|
}, 2000 );
|
||||||
} else if ( stat === 'noTicket' ) {
|
} else if ( stat === 'noTicket' ) {
|
||||||
clearInterval( ping );
|
clearInterval( ping );
|
||||||
@@ -122,6 +125,7 @@ module.exports = ( app, settings ) => {
|
|||||||
if ( !pendingPayments[ request.session.id ] ) {
|
if ( !pendingPayments[ request.session.id ] ) {
|
||||||
const stat = TicketGenerator.getGenerationStatus( request.session.id );
|
const stat = TicketGenerator.getGenerationStatus( request.session.id );
|
||||||
if ( stat === 'done' ) {
|
if ( stat === 'done' ) {
|
||||||
|
request.session.lastOrderID = request.session.id;
|
||||||
request.session.id = generator.generateToken( 30 );
|
request.session.id = generator.generateToken( 30 );
|
||||||
response.send( { 'status': 'ticketOk' } );
|
response.send( { 'status': 'ticketOk' } );
|
||||||
} else if ( stat === 'noTicket' ) {
|
} 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' );
|
waitingClients[ sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ].write( 'data: paymentOk\n\n' );
|
||||||
}
|
}
|
||||||
}, 1000 );
|
}, 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 => {
|
db.getDataSimple( 'users', 'email', sessionReference[ response.data.data[ 0 ].id ][ 'email' ] ).then( user => {
|
||||||
if ( user[ 0 ] ) {
|
if ( user[ 0 ] ) {
|
||||||
const tickets = JSON.parse( dat[ 0 ].data );
|
const tickets = JSON.parse( dat[ 0 ].data );
|
||||||
@@ -173,10 +177,18 @@ module.exports = ( app, settings ) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
db.writeJSONData( 'booked', booked ).then( () => {
|
db.writeJSONData( 'booked', booked ).then( () => {
|
||||||
|
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' ] ];
|
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 => {
|
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 );
|
||||||
} );
|
} );
|
||||||
} );
|
} );
|
||||||
} );
|
} );
|
||||||
|
|||||||
@@ -63,7 +63,9 @@ module.exports = ( app, settings ) => {
|
|||||||
const session = await stripe.checkout.sessions.create( purchase );
|
const session = await stripe.checkout.sessions.create( purchase );
|
||||||
sessionReference[ session.id ] = { 'tok': req.session.id, 'email': req.session.username };
|
sessionReference[ session.id ] = { 'tok': req.session.id, 'email': req.session.username };
|
||||||
pendingPayments[ req.session.id ] = true;
|
pendingPayments[ req.session.id ] = true;
|
||||||
|
db.writeDataSimple( 'processingOrders', 'user_id', req.session.id, dat[ 0 ] ).then( () => {
|
||||||
res.send( session.url );
|
res.send( session.url );
|
||||||
|
} );
|
||||||
} )();
|
} )();
|
||||||
} );
|
} );
|
||||||
} else {
|
} else {
|
||||||
@@ -102,9 +104,10 @@ module.exports = ( app, settings ) => {
|
|||||||
clearInterval( ping );
|
clearInterval( ping );
|
||||||
setTimeout( () => {
|
setTimeout( () => {
|
||||||
response.write( 'data: ready\n\n' );
|
response.write( 'data: ready\n\n' );
|
||||||
response.end();
|
|
||||||
delete waitingClients[ request.session.id ];
|
delete waitingClients[ request.session.id ];
|
||||||
|
request.session.lastOrderID = request.session.id;
|
||||||
request.session.id = generator.generateToken( 30 );
|
request.session.id = generator.generateToken( 30 );
|
||||||
|
response.end();
|
||||||
}, 2000 );
|
}, 2000 );
|
||||||
} else if ( stat === 'noTicket' ) {
|
} else if ( stat === 'noTicket' ) {
|
||||||
clearInterval( ping );
|
clearInterval( ping );
|
||||||
@@ -124,6 +127,7 @@ module.exports = ( app, settings ) => {
|
|||||||
if ( !pendingPayments[ request.session.id ] ) {
|
if ( !pendingPayments[ request.session.id ] ) {
|
||||||
const stat = TicketGenerator.getGenerationStatus( request.session.id );
|
const stat = TicketGenerator.getGenerationStatus( request.session.id );
|
||||||
if ( stat === 'done' ) {
|
if ( stat === 'done' ) {
|
||||||
|
request.session.lastOrderID = request.session.id;
|
||||||
request.session.id = generator.generateToken( 30 );
|
request.session.id = generator.generateToken( 30 );
|
||||||
response.send( { 'status': 'ticketOk' } );
|
response.send( { 'status': 'ticketOk' } );
|
||||||
} else if ( stat === 'noTicket' ) {
|
} else if ( stat === 'noTicket' ) {
|
||||||
@@ -157,7 +161,7 @@ module.exports = ( app, settings ) => {
|
|||||||
waitingClients[ sessionReference[ event.data.object.id ][ 'tok' ] ].write( 'data: paymentOk\n\n' );
|
waitingClients[ sessionReference[ event.data.object.id ][ 'tok' ] ].write( 'data: paymentOk\n\n' );
|
||||||
}
|
}
|
||||||
}, 1000 );
|
}, 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 => {
|
db.getDataSimple( 'users', 'email', sessionReference[ event.data.object.id ][ 'email' ] ).then( user => {
|
||||||
if ( user[ 0 ] ) {
|
if ( user[ 0 ] ) {
|
||||||
const tickets = JSON.parse( dat[ 0 ].data );
|
const tickets = JSON.parse( dat[ 0 ].data );
|
||||||
@@ -175,12 +179,16 @@ module.exports = ( app, settings ) => {
|
|||||||
}
|
}
|
||||||
db.writeJSONData( 'booked', booked ).then( () => {
|
db.writeJSONData( 'booked', booked ).then( () => {
|
||||||
db.deleteDataSimple( 'temp', 'user_id', sessionReference[ event.data.object.id ][ 'tok' ] ).then( () => {
|
db.deleteDataSimple( 'temp', 'user_id', sessionReference[ event.data.object.id ][ 'tok' ] ).then( () => {
|
||||||
|
db.deleteDataSimple( 'processingOrders', 'user_id', sessionReference[ event.data.object.id ][ 'tok' ] ).then( () => {
|
||||||
delete pendingPayments[ sessionReference[ event.data.object.id ][ 'tok' ] ];
|
delete pendingPayments[ sessionReference[ event.data.object.id ][ 'tok' ] ];
|
||||||
} ).catch( error => {
|
} ).catch( error => {
|
||||||
console.error( '[ STRIPE ] ERROR whilst deleting data from DB: ' + error );
|
console.error( '[ STRIPE ] ERROR whilst deleting data from DB: ' + error );
|
||||||
} );
|
} );
|
||||||
} ).catch( () => {
|
} ).catch( error => {
|
||||||
|
console.error( '[ STRIPE ] ERROR whilst deleting data from DB: ' + error );
|
||||||
|
} );
|
||||||
|
} ).catch( error => {
|
||||||
|
console.error( '[ STRIPE ] ERROR whilst getting data from DB: ' + error );
|
||||||
} );
|
} );
|
||||||
} );
|
} );
|
||||||
} );
|
} );
|
||||||
|
|||||||
7
src/server/setupDB.js
Normal file
7
src/server/setupDB.js
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
const db = require( './backend/db/db.js' );
|
||||||
|
|
||||||
|
( async () => {
|
||||||
|
await db.initDB();
|
||||||
|
db.reset();
|
||||||
|
console.log( 'DONE' );
|
||||||
|
} )();
|
||||||
Reference in New Issue
Block a user