diff --git a/src/server/admin/adminAPIRoutes.js b/src/server/admin/adminAPIRoutes.js
new file mode 100644
index 0000000..ba4154c
--- /dev/null
+++ b/src/server/admin/adminAPIRoutes.js
@@ -0,0 +1,43 @@
+/*
+* libreevent - adminAPIRoutes.js
+*
+* Created by Janis Hutz 07/20/2023, Licensed under the GPL V3 License
+* https://janishutz.com, development@janishutz.com
+*
+*
+*/
+
+const posth = require( './api/postHandler.js' );
+const geth = require( './api/getHandler.js' );
+const postHandler = new posth();
+const getHandler = new geth();
+const path = require( 'path' );
+
+// settings is missing in arguments which shouldn't pose any problem
+module.exports = ( app ) => {
+ // Add specific routes here to have them be checked first to not get general handling
+
+ app.get( '/admin/getAPI/:call', ( req, res ) => {
+ if ( req.session.loggedInAdmin ) {
+ getHandler.handleCall( req.params.call, req.query ).then( data => {
+ res.send( data );
+ } ).catch( error => {
+ res.status( 500 ).send( error );
+ } );
+ } else {
+ res.status( 403 ).sendFile( path.join( __dirname + '/../ui/' + ( req.query.lang ?? 'en' ) + '/errors/403.html' ) );
+ }
+ } );
+
+ app.post( '/admin/API/:call', ( req, res ) => {
+ if ( req.session.loggedInAdmin ) {
+ postHandler.handleCall( req.params.call, req.body, req.query.lang ).then( data => {
+ res.send( data );
+ } ).catch( error => {
+ res.status( 500 ).send( error );
+ } );
+ } else {
+ res.status( 403 ).sendFile( path.join( __dirname + '/../ui/' + ( req.query.lang ?? 'en' ) + '/errors/403.html' ) );
+ }
+ } );
+};
\ No newline at end of file
diff --git a/src/server/admin/api/getHandler.js b/src/server/admin/api/getHandler.js
new file mode 100644
index 0000000..33f6b0c
--- /dev/null
+++ b/src/server/admin/api/getHandler.js
@@ -0,0 +1,48 @@
+/*
+* libreevent - getHandler.js
+*
+* Created by Janis Hutz 07/20/2023, Licensed under the GPL V3 License
+* https://janishutz.com, development@janishutz.com
+*
+*
+*/
+
+const db = require( '../../backend/db/db.js' );
+
+class GETHandler {
+ constructor () {
+
+ }
+
+ handleCall ( call, query ) {
+ return new Promise( ( resolve, reject ) => {
+ if ( call === 'getSeatplan' ) {
+ db.getJSONDataSimple( 'seatplan', query.location ).then( data => {
+ if ( Object.keys( data ).length > 0 ) {
+ resolve( data[ 'save' ] );
+ } else {
+ reject( 'No data found for this location' );
+ }
+ } ).catch( error => {
+ reject( error );
+ } );
+ } else if ( call === 'getSeatplanDraft' ) {
+ db.getJSONDataSimple( 'seatplan', query.location ).then( data => {
+ if ( Object.keys( data ).length > 0 ) {
+ if ( Object.keys( data[ 'draft' ] ).length > 0 ) {
+ resolve( data[ 'draft' ] );
+ } else {
+ resolve( data[ 'save' ] );
+ }
+ } else {
+ reject( 'No data found for this location' );
+ }
+ } ).catch( error => {
+ reject( error );
+ } );
+ }
+ } );
+ }
+}
+
+module.exports = GETHandler;
\ No newline at end of file
diff --git a/src/server/admin/api/postHandler.js b/src/server/admin/api/postHandler.js
new file mode 100644
index 0000000..94da952
--- /dev/null
+++ b/src/server/admin/api/postHandler.js
@@ -0,0 +1,41 @@
+/*
+* libreevent - postHandler.js
+*
+* Created by Janis Hutz 07/20/2023, Licensed under the GPL V3 License
+* https://janishutz.com, development@janishutz.com
+*
+*
+*/
+
+const db = require( '../../backend/db/db.js' );
+
+class POSTHandler {
+ constructor () {
+
+ }
+
+ handleCall ( call, data, lang ) {
+ return new Promise( ( resolve, reject ) => {
+ console.log( lang );
+ if ( call === 'saveSeatplanDraft' ) {
+ db.getJSONDataSimple( 'seatplan', data.location ).then( res => {
+ let dat = res;
+ dat[ 'draft' ] = data.data;
+ db.writeJSONDataSimple( 'seatplan', data.location, dat ).then( resp => {
+ resolve( resp );
+ } ).catch( error => {
+ reject( error );
+ } );
+ } );
+ } else if ( call === 'saveSeatplan' ) {
+ db.writeJSONDataSimple( 'seatplan', data.location, { 'draft': {}, 'save': data.data } ).then( resp => {
+ resolve( resp );
+ } ).catch( error => {
+ reject( error );
+ } );
+ }
+ } );
+ }
+}
+
+module.exports = POSTHandler;
\ No newline at end of file
diff --git a/src/server/app.js b/src/server/app.js
index 089dce3..25f4ead 100644
--- a/src/server/app.js
+++ b/src/server/app.js
@@ -48,6 +48,8 @@ let file = path.join( __dirname + '/../webapp/main/dist/index.html' );
if ( settings.init ) {
require( './admin/adminRoutes.js' )( app, settings ); // admin routes
+ require( './admin/adminAPIRoutes.js' )( app, settings ); // admin api routes
+ require( './backend/userAPIRoutes.js' )( app, settings ); // admin api routes
require( './backend/userRoutes.js' )( app, settings ); // user routes
} else {
require( './setup/setupRoutes.js' )( app, settings ); // setup routes
diff --git a/src/server/backend/api/getHandler.js b/src/server/backend/api/getHandler.js
new file mode 100644
index 0000000..b652907
--- /dev/null
+++ b/src/server/backend/api/getHandler.js
@@ -0,0 +1,34 @@
+/*
+* libreevent - getHandler.js
+*
+* Created by Janis Hutz 07/20/2023, Licensed under the GPL V3 License
+* https://janishutz.com, development@janishutz.com
+*
+*
+*/
+
+const db = require( '../db/db.js' );
+
+class GETHandler {
+ constructor () {
+
+ }
+
+ handleCall ( call, query ) {
+ return new Promise( ( resolve, reject ) => {
+ if ( call === 'getSeatplan' ) {
+ db.getJSONDataSimple( 'seatplan', query.location ).then( data => {
+ if ( Object.keys( data ).length > 0 ) {
+ resolve( data[ 'save' ] );
+ } else {
+ reject( 'No data found for this location' );
+ }
+ } ).catch( error => {
+ reject( error );
+ } );
+ }
+ } );
+ }
+}
+
+module.exports = GETHandler;
\ No newline at end of file
diff --git a/src/server/backend/api/postHandler.js b/src/server/backend/api/postHandler.js
new file mode 100644
index 0000000..7531b09
--- /dev/null
+++ b/src/server/backend/api/postHandler.js
@@ -0,0 +1,41 @@
+/*
+* libreevent - postHandler.js
+*
+* Created by Janis Hutz 07/20/2023, Licensed under the GPL V3 License
+* https://janishutz.com, development@janishutz.com
+*
+*
+*/
+
+const db = require( '../db/db.js' );
+
+class POSTHandler {
+ constructor () {
+
+ }
+
+ handleCall ( call, data, lang ) {
+ return new Promise( ( resolve, reject ) => {
+ console.log( lang );
+ if ( call === 'saveSeatplanDraft' ) {
+ db.getJSONDataSimple( 'seatplan', data.location ).then( res => {
+ let dat = res;
+ dat[ 'draft' ] = data.data;
+ db.writeJSONDataSimple( 'seatplan', data.location, dat ).then( resp => {
+ resolve( resp );
+ } ).catch( error => {
+ reject( error );
+ } );
+ } );
+ } else if ( call === 'saveSeatplan' ) {
+ db.writeJSONDataSimple( 'seatplan', data.location, { 'draft': {}, 'save': data.data } ).then( resp => {
+ resolve( resp );
+ } ).catch( error => {
+ reject( error );
+ } );
+ }
+ } );
+ }
+}
+
+module.exports = POSTHandler;
\ No newline at end of file
diff --git a/src/server/backend/db/data/seatplan.json b/src/server/backend/db/data/seatplan.json
new file mode 100644
index 0000000..cb710e8
--- /dev/null
+++ b/src/server/backend/db/data/seatplan.json
@@ -0,0 +1 @@
+{"test2":{"draft":{},"save":{"seatInfo":{"data":{"1":{"0":22},"2":{"0":9},"3":{"0":9}},"count":0},"data":{"1":{"x":299.02,"y":17.157,"h":564.951,"w":731.618,"active":false,"draggable":true,"resizable":true,"id":1,"origin":1,"shape":"rectangular","type":"seat","startingRow":1,"seatNumberingPosition":1,"sector":"A","text":{"text":"TestText","textSize":20,"colour":"#20FFFF"},"numberingDirection":"left","category":"1"},"2":{"x":359.069,"y":661.765,"h":121.324,"w":604.167,"active":false,"draggable":true,"resizable":true,"id":2,"origin":3,"shape":"rectangular","type":"stage","startingRow":1,"seatNumberingPosition":1,"sector":"A","text":{"text":"TestText","textSize":20,"colour":"#20FFFF"},"ticketCount":1,"numberingDirection":"left","category":"1"},"3":{"x":519.608,"y":671.569,"h":83.333,"w":306.373,"active":false,"draggable":true,"resizable":true,"id":3,"origin":1,"shape":"rectangular","type":"text","startingRow":1,"seatNumberingPosition":2,"sector":"A","text":{"text":"Stage","textSize":25,"colour":"#2160ff"},"ticketCount":1,"numberingDirection":"left","category":"1"}}}},"test":{"draft":{},"save":{"seatInfo":{"data":{"1":{"0":22}},"count":0},"data":{"1":{"x":122.549,"y":122.549,"h":371.324,"w":735.294,"active":false,"draggable":true,"resizable":true,"id":1,"origin":1,"shape":"rectangular","type":"seat","startingRow":1,"seatNumberingPosition":1,"sector":"A","text":{"text":"TestText","textSize":20,"colour":"#20FFFF"},"numberingDirection":"left","category":"1"}}}}}
\ No newline at end of file
diff --git a/src/server/backend/db/db.js b/src/server/backend/db/db.js
index 2ef5b5d..3baaa52 100644
--- a/src/server/backend/db/db.js
+++ b/src/server/backend/db/db.js
@@ -26,7 +26,7 @@ if ( settings.db === 'mysql' ) {
dbh.connect();
}
-module.exports.getDataSimple = function getData ( db, column, searchQuery ) {
+module.exports.getDataSimple = ( db, column, searchQuery ) => {
return new Promise( resolve => {
dbh.query( { 'command': 'getFilteredData', 'property': column, 'searchQuery': searchQuery }, dbRef[ db ] ).then( data => {
console.log( data );
@@ -37,23 +37,78 @@ module.exports.getDataSimple = function getData ( db, column, searchQuery ) {
} );
};
-module.exports.writeDataSimple = function writeData ( db, column, searchQuery ) {
+module.exports.writeDataSimple = ( db, column, searchQuery ) => {
return new Promise( ( resolve, reject ) => {
} );
};
-module.exports.getJSONData = function getData ( file ) {
+module.exports.getJSONData = ( file ) => {
return new Promise( ( resolve, reject ) => {
- fs.readFile( path.join( __dirname + '/../../' + file ), ( error, data ) => {
+ fs.readFile( path.join( __dirname + '/data/' + file + '.json' ), ( error, data ) => {
if ( error ) {
reject( 'Error occurred: Error trace: ' + error );
+ } else {
+ if ( data.byteLength > 0 ) {
+ resolve( JSON.parse( data ) ?? {} );
+ } else {
+ resolve( { } );
+ }
}
- resolve( JSON.parse( data ) );
} );
} );
};
-module.exports.getJSONDataSync = function getData ( file ) {
+module.exports.getJSONDataSimple = ( file, identifier ) => {
+ return new Promise( ( resolve, reject ) => {
+ fs.readFile( path.join( __dirname + '/data/' + file + '.json' ), ( error, data ) => {
+ if ( error ) {
+ reject( 'Error occurred: Error trace: ' + error );
+ } else {
+ if ( data.byteLength > 0 ) {
+ resolve( JSON.parse( data )[ identifier ] ?? {} );
+ } else {
+ resolve( { } );
+ }
+ }
+ } );
+ } );
+};
+
+module.exports.getJSONDataSync = ( file ) => {
return JSON.parse( fs.readFileSync( path.join( __dirname + '/../../' + file ) ) );
+};
+
+module.exports.writeJSONDataSimple = ( db, identifier, values ) => {
+ return new Promise( ( resolve, reject ) => {
+ fs.readFile( path.join( __dirname + '/data/' + db + '.json' ), ( error, data ) => {
+ if ( error ) {
+ reject( 'Error occurred: Error trace: ' + error );
+ } else {
+ let dat = {};
+ if ( data.byteLength > 0 ) {
+ dat = JSON.parse( data ) ?? {};
+ }
+ dat[ identifier ] = values;
+ fs.writeFile( path.join( __dirname + '/data/' + db + '.json' ), JSON.stringify( dat ), ( error ) => {
+ if ( error ) {
+ reject( 'Error occurred: Error trace: ' + error );
+ }
+ resolve( true );
+ } );
+ }
+ } );
+ } );
+};
+
+module.exports.writeJSONData = ( db, data ) => {
+ return new Promise( ( resolve, reject ) => {
+ fs.writeFile( path.join( __dirname + '/data/' + db + '.json' ), JSON.stringify( data ), ( error ) => {
+ if ( error ) {
+ reject( 'Error occurred: Error trace: ' + error );
+ } else {
+ resolve( true );
+ }
+ } );
+ } );
};
\ No newline at end of file
diff --git a/src/server/backend/db/db.json b/src/server/backend/db/db.json
index e69de29..9e26dfe 100644
--- a/src/server/backend/db/db.json
+++ b/src/server/backend/db/db.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/src/server/backend/userAPIRoutes.js b/src/server/backend/userAPIRoutes.js
new file mode 100644
index 0000000..8a95ec0
--- /dev/null
+++ b/src/server/backend/userAPIRoutes.js
@@ -0,0 +1,35 @@
+/*
+* libreevent - adminAPIRoutes.js
+*
+* Created by Janis Hutz 07/20/2023, Licensed under the GPL V3 License
+* https://janishutz.com, development@janishutz.com
+*
+*
+*/
+
+const posth = require( './api/postHandler.js' );
+const geth = require( './api/getHandler.js' );
+const postHandler = new posth();
+const getHandler = new geth();
+const path = require( 'path' );
+
+// settings is missing in arguments which shouldn't pose any problem
+module.exports = ( app ) => {
+ // Add specific routes here to have them be checked first to not get general handling
+
+ app.get( '/getAPI/:call', ( req, res ) => {
+ getHandler.handleCall( req.params.call, req.query ).then( data => {
+ res.send( data );
+ } ).catch( error => {
+ res.status( 500 ).send( error );
+ } );
+ } );
+
+ app.post( '/API/:call', ( req, res ) => {
+ postHandler.handleCall( req.params.call, req.body, req.query.lang ).then( data => {
+ res.send( data );
+ } ).catch( error => {
+ res.status( 500 ).send( error );
+ } );
+ } );
+};
\ No newline at end of file
diff --git a/src/server/test.js b/src/server/test.js
index ed8daa2..2add288 100644
--- a/src/server/test.js
+++ b/src/server/test.js
@@ -1,9 +1,19 @@
-const express = require( 'express' );
-let app = express();
-const http = require( 'http' );
+const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+let result = '';
-app.use( express.static( '.' ) );
+// https://stackoverflow.com/questions/36129721/convert-number-to-alphabet-letter
+function printToLetter( number ) {
+ let charIndex = number % alphabet.length;
+ let quotient = number / alphabet.length;
+ if ( charIndex - 1 === -1 ) {
+ charIndex = alphabet.length;
+ quotient --;
+ }
+ result = alphabet.charAt( charIndex - 1 ) + result;
+ if ( quotient >= 1 ) {
+ printToLetter( parseInt( quotient ) );
+ }
+}
-
-const PORT = process.env.PORT || 8081;
-http.createServer( app ).listen( PORT );
\ No newline at end of file
+printToLetter( 150036 );
+console.log( result );
\ No newline at end of file
diff --git a/src/server/ui/en/errors/403.html b/src/server/ui/en/errors/403.html
new file mode 100644
index 0000000..f5bcc1b
--- /dev/null
+++ b/src/server/ui/en/errors/403.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+ 403
+
+
+
403
+
+
\ No newline at end of file
diff --git a/src/webapp/main/src/components/seatplan/editor/properties.vue b/src/webapp/main/src/components/seatplan/editor/properties.vue
index 226912c..b33d9b2 100644
--- a/src/webapp/main/src/components/seatplan/editor/properties.vue
+++ b/src/webapp/main/src/components/seatplan/editor/properties.vue
@@ -106,9 +106,7 @@