From 1633cedec214679c8f4b4ec454308adad0804198 Mon Sep 17 00:00:00 2001 From: Janis Hutz Date: Wed, 11 Oct 2023 11:01:57 +0200 Subject: [PATCH] reset database, update imports, prepare for build --- src/server/app.js | 11 +- src/server/backend/db/db.js | 20 ++- src/server/backend/db/mysqldb.js | 2 +- src/server/backend/mail/mailSender.js | 2 +- .../payments/payrexx/module.payrexx.js | 2 +- .../plugins/payments/stripe/stripeRoutes.js | 2 +- src/server/config/settings.config.json | 16 +- src/server/data/booked.json | 2 +- src/server/data/eventDrafts.json | 2 +- src/server/data/events.json | 2 +- src/server/data/locations.json | 2 +- src/server/data/rootAccount.json | 5 +- src/server/data/seatplan.json | 2 +- src/server/data/tickets.json | 2 +- src/server/setup/setupRoutes.js | 35 +++- .../seatplan/userApp/userWindow.vue | 2 + .../setup/src/components/notifications.vue | 159 +++++++++++------- src/webapp/setup/src/views/AdminLoginView.vue | 18 +- src/webapp/setup/src/views/BasicSetupView.vue | 7 +- src/webapp/setup/src/views/SetupRootView.vue | 11 +- 20 files changed, 192 insertions(+), 112 deletions(-) diff --git a/src/server/app.js b/src/server/app.js index bb6b727..419657d 100644 --- a/src/server/app.js +++ b/src/server/app.js @@ -15,7 +15,6 @@ const cookieParser = require( 'cookie-parser' ); const http = require( 'http' ); const fs = require( 'fs' ); const token = require( './backend/token.js' ); -const db = require( './backend/db/db.js' ); console.log( ` @@ -59,14 +58,6 @@ if ( settings.setupDone ) { } ); } -if ( !settings.init ) { - db.initDB(); - db.reset(); - let mutSettings = settings; - mutSettings[ 'init' ] = true; - db.saveSettings( mutSettings ); -} - // Set up static routes for static file serving (performance wise not // that good, but way easier to set up) @@ -94,8 +85,8 @@ app.use( cookieParser() ); let file = path.join( __dirname + '/webapp/main/dist/index.html' ); -console.log( '[ Server ] loading backend components' ); if ( settings.setupDone ) { + console.log( '[ Server ] loading backend components' ); require( './backend/helperRoutes.js' )( app, settings ); // Helper routes require( './admin/adminRoutes.js' )( app, settings ); // admin routes require( './admin/adminAPIRoutes.js' )( app, settings ); // admin api routes diff --git a/src/server/backend/db/db.js b/src/server/backend/db/db.js index bf90675..68fdcd8 100644 --- a/src/server/backend/db/db.js +++ b/src/server/backend/db/db.js @@ -31,21 +31,23 @@ if ( settings.db === 'mysql' ) { module.exports.initDB = () => { ( async() => { console.log( '[ DB ] Setting up...' ); - await dbh.setupDB(); + await dbh.resetDB(); + setTimeout( () => { + dbh.setupDB(); + }, 2000 ); console.log( '[ DB ] Setting up complete!' ); } )(); }; module.exports.reset = () => { console.log( '[ DB ] Resetting...' ); - this.writeJSONData( 'booked', '{}' ); - this.writeJSONData( 'eventDrafts', '{}' ); - this.writeJSONData( 'events', '{}' ); - this.writeJSONData( 'locations', '{}' ); - this.writeJSONData( 'events', '{}' ); - this.writeJSONData( 'rootAccount', '{}' ); - this.writeJSONData( 'seatplan', '{}' ); - this.writeJSONData( 'tickets', '{}' ); + this.writeJSONData( 'booked', {} ); + this.writeJSONData( 'eventDrafts', {} ); + this.writeJSONData( 'events', {} ); + this.writeJSONData( 'locations', {} ); + this.writeJSONData( 'events', {} ); + this.writeJSONData( 'seatplan', {} ); + this.writeJSONData( 'tickets', {} ); console.log( '[ DB ] Reset complete!' ); }; diff --git a/src/server/backend/db/mysqldb.js b/src/server/backend/db/mysqldb.js index 91ef1d3..c3d350e 100644 --- a/src/server/backend/db/mysqldb.js +++ b/src/server/backend/db/mysqldb.js @@ -16,7 +16,7 @@ const path = require( 'path' ); class SQLDB { constructor ( ) { - this.sqlConnection = mysql.createConnection( JSON.parse( fs.readFileSync( path.join( __dirname + '/../../config/db.config.secret.json' ) ) ) ); + this.sqlConnection = mysql.createConnection( JSON.parse( fs.readFileSync( path.join( __dirname + '/../../config/db.config.json' ) ) ) ); } connect ( ) { diff --git a/src/server/backend/mail/mailSender.js b/src/server/backend/mail/mailSender.js index ee404b4..0208a41 100644 --- a/src/server/backend/mail/mailSender.js +++ b/src/server/backend/mail/mailSender.js @@ -12,7 +12,7 @@ const html2text = require( 'html-to-text' ); const db = require( '../db/db.js' ); -let transporter = mailer.createTransport( db.getJSONDataSync( '/config/mail.config.secret.json' ) ); +let transporter = mailer.createTransport( db.getJSONDataSync( '/config/mail.config.json' ) ); class MailManager { diff --git a/src/server/backend/plugins/payments/payrexx/module.payrexx.js b/src/server/backend/plugins/payments/payrexx/module.payrexx.js index 84ccac8..553d3c0 100644 --- a/src/server/backend/plugins/payments/payrexx/module.payrexx.js +++ b/src/server/backend/plugins/payments/payrexx/module.payrexx.js @@ -13,7 +13,7 @@ const qs = require( 'qs' ); const axios = require( 'axios' ); const Base64 = require( 'crypto-js/enc-base64' ); const hmacSHA256 = require( 'crypto-js/hmac-sha256' ); -const payrexxConfig = JSON.parse( fs.readFileSync( path.join( __dirname + '/config.payments.secret.json' ) ) ); +const payrexxConfig = JSON.parse( fs.readFileSync( path.join( __dirname + '/config.payments.json' ) ) ); const baseUrl = 'https://api.payrexx.com/v1.0/'; diff --git a/src/server/backend/plugins/payments/stripe/stripeRoutes.js b/src/server/backend/plugins/payments/stripe/stripeRoutes.js index cc5e78e..1128a99 100644 --- a/src/server/backend/plugins/payments/stripe/stripeRoutes.js +++ b/src/server/backend/plugins/payments/stripe/stripeRoutes.js @@ -11,7 +11,7 @@ const fs = require( 'fs' ); const path = require( 'path' ); const db = require( '../../../db/db.js' ); // TODO: update config files to non-secret version for final version -const stripeConfig = JSON.parse( fs.readFileSync( path.join( __dirname + '/config.payments.secret.json' ) ) ); +const stripeConfig = JSON.parse( fs.readFileSync( path.join( __dirname + '/config.payments.json' ) ) ); const stripe = require( 'stripe' )( stripeConfig[ 'APIKey' ] ); const bodyParser = require( 'body-parser' ); const ticket = require( '../../../tickets/ticketGenerator.js' ); diff --git a/src/server/config/settings.config.json b/src/server/config/settings.config.json index a4115a8..60a4d41 100644 --- a/src/server/config/settings.config.json +++ b/src/server/config/settings.config.json @@ -1,17 +1,17 @@ { - "init":true, - "setupDone":true, - "twoFA":"enforce", - "twoFAMode":"enhanced", + "init":false, + "setupDone":false, + "twoFA":"allow", + "twoFAMode":"simple", "db":"mysql", "payments":"stripe", "name":"libreevent", - "yourDomain":"http://localhost:8080", - "mailSender":"libreevent ", + "yourDomain":"", + "mailSender":"", "maxTickets":10, - "currency":"CHF", + "currency":"USD", "gcInterval":300, "ticketTimeout":900, - "startPage":"modern", + "startPage":"default", "version":"1.0.0" } \ No newline at end of file diff --git a/src/server/data/booked.json b/src/server/data/booked.json index 50a9f77..9e26dfe 100644 --- a/src/server/data/booked.json +++ b/src/server/data/booked.json @@ -1 +1 @@ -{"test4":{"secAr4s7":{"id":"secAr4s7","component":1,"ticketOption":"1","eventID":"test4","category":"1","name":"Row 5, Seat 8"},"secAr6s14":{"id":"secAr6s14","component":1,"ticketOption":"2","eventID":"test4","category":"1","name":"Row 7, Seat 15"},"secAr6s10":{"id":"secAr6s10","component":1,"ticketOption":"2","eventID":"test4","category":"1","name":"Row 7, Seat 11"},"comp1secAr5s11":{"id":"comp1secAr5s11","component":1,"ticketOption":"2","eventID":"test4","category":"1","name":"Row 6, Seat 12"}},"test3":{"ticket1_1":{"id":"ticket1_1","component":1,"ticketOption":"1","eventID":"test3","count":10,"category":"1","name":"Category 1 (Child)"},"ticket1":{"id":"ticket1_1","component":1,"ticketOption":"1","eventID":"test3","count":1,"category":"1","name":"Category 1 (Child)"}},"complexLocationTest":{"comp4secAr2s25":{"id":"comp4secAr2s25","component":4,"ticketOption":"2","eventID":"complexLocationTest","category":"2","name":"Row 3, Seat 26"},"comp4secAr2s26":{"id":"comp4secAr2s26","component":4,"ticketOption":"2","eventID":"complexLocationTest","category":"2","name":"Row 3, Seat 27"}}} \ No newline at end of file +{} \ No newline at end of file diff --git a/src/server/data/eventDrafts.json b/src/server/data/eventDrafts.json index d601346..9e26dfe 100644 --- a/src/server/data/eventDrafts.json +++ b/src/server/data/eventDrafts.json @@ -1 +1 @@ -{"test4":{"name":"Test4Event","description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras imperdiet augue ac vestibulum tincidunt. Sed a fringilla purus, ac efficitur neque. In hac habitasse platea dictumst. Pellentesque fermentum accumsan odio, non auctor ligula. Nam metus felis, aliquam non tristique gravida, mattis sit amet nisl. Aliquam ut augue ut dui tempus condimentum sit amet eu tortor. Etiam rutrum, est a faucibus sagittis, purus augue tincidunt elit, ut lobortis augue neque vel leo. Nam non tortor maximus, feugiat tortor sed, venenatis felis. In turpis nisi, congue et varius sit amet, vehicula eget mi. Curabitur id nisi nec nisl gravida tempus sed finibus augue. Suspendisse eget nibh non risus pulvinar egestas at sed libero. Vivamus nisi augue, porttitor quis nibh in, tristique interdum erat. Sed dignissim risus non aliquam aliquam. Etiam pharetra condimentum lorem eget hendrerit. Donec aliquet mi nec nisi dapibus, varius varius lacus cursus. Ut enim nisi, blandit ut dolor vel, varius ullamcorper mauris.\n\nPraesent dignissim tellus mi, semper vulputate elit rhoncus ut. Donec posuere nibh a dolor vestibulum, vitae molestie metus rutrum. Fusce ex elit, eleifend ac finibus at, dapibus vel nunc. Sed a turpis bibendum, rutrum odio eget, dignissim nisl. Fusce nec erat aliquet, tristique tellus sit amet, vehicula dolor. Praesent id finibus ex. Maecenas neque tellus, blandit eget pretium vel, sodales sed magna. Suspendisse eu accumsan nisi, sed pulvinar risus. Morbi ultrices metus non massa faucibus, nec tempor ex venenatis. Cras bibendum elit quis ex tempor semper. Sed varius risus odio. Duis consectetur tempor dui sit amet mattis. Cras quis tristique justo.\n\nQuisque posuere risus eu tellus tristique rutrum. Sed lobortis vel felis vitae luctus. Praesent ut lectus elementum justo vulputate placerat a sit amet nulla. Suspendisse commodo fermentum risus commodo rhoncus. Etiam imperdiet volutpat tincidunt. Nunc at auctor nisl. Fusce tristique quam lacus, vel molestie nisl viverra vitae.\n\nIn tortor sem, aliquam vitae ligula vel, semper ornare quam. Morbi commodo maximus magna, et accumsan augue. Phasellus molestie lacinia blandit. Curabitur hendrerit, ligula eget hendrerit semper, lectus lacus euismod est, ac porta quam nisl vel urna. Vivamus accumsan ultricies mauris. Donec id turpis elementum, placerat arcu sed, elementum neque. Donec fermentum, risus quis luctus iaculis, quam tortor aliquam sem, vitae tincidunt augue augue quis felis. Curabitur eu rhoncus diam.\n\nMauris sollicitudin ipsum eu felis fermentum, consequat congue risus volutpat. Aenean vehicula vehicula blandit. Proin sit amet nibh fringilla, sodales orci ac, suscipit nisi. Integer sit amet sapien aliquam, vulputate velit eu, consequat sapien. Donec magna purus, finibus et mauris in, placerat blandit est. Sed ac scelerisque magna. Aenean eu gravida nunc, in tempor lorem. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In sed lectus auctor, tempus tortor at, accumsan nibh. Aenean dolor orci, malesuada eu accumsan non, cursus in leo. Sed quis ligula eu justo lacinia aliquam at at ipsum.\n\nEtiam eget justo non nisi euismod dapibus in sit amet orci. Quisque nisi eros, interdum bibendum malesuada efficitur, egestas sodales nulla. Morbi porta nulla condimentum, viverra risus vitae, laoreet orci. Integer sit amet eros eget ligula feugiat tincidunt et nec augue. Sed at ipsum at enim eleifend lacinia. Ut at molestie tortor. Donec lobortis, ante sollicitudin eleifend eleifend, felis risus gravida orci, quis pharetra elit sem id dolor. Maecenas fermentum est risus, in rhoncus mauris gravida dignissim. Aliquam ultrices ipsum in lorem aliquet, vitae posuere lacus porta. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vivamus vel augue vestibulum, ullamcorper massa et, gravida ligula. Donec auctor, lacus sed volutpat posuere, urna lorem sollicitudin ligula, at rutrum odio purus sed ante. Praesent egestas elementum augue sed convallis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eu lectus suscipit, cursus lacus sit amet, iaculis magna.\n\nIn commodo vitae mauris nec molestie. Suspendisse potenti. Proin luctus tellus velit, a venenatis velit faucibus id. Cras ac nibh ex. Nulla faucibus dolor ut lectus ullamcorper, ac malesuada ipsum efficitur. Ut imperdiet, risus vitae viverra malesuada, nibh eros commodo sem, at vulputate elit nulla vehicula eros. Donec vitae arcu sit amet elit convallis elementum eu id nisl. Maecenas tristique diam quis porttitor bibendum. Sed nisi eros, luctus ut justo ut, hendrerit congue dolor.\n\nSed vel risus ut erat sollicitudin pellentesque a eu ipsum. Aliquam risus lectus, blandit eget lacus vel, ultrices bibendum metus. Pellentesque eget condimentum est. Nullam lacus libero, ornare quis fermentum non, molestie et turpis. Vestibulum id sem non arcu rhoncus semper. Cras dignissim ipsum nisl, a malesuada quam pretium eu. Cras sit amet lorem sem.\n\nIn nunc urna, eleifend sed tortor nec, efficitur eleifend magna. Proin sed dui in magna fermentum fringilla. Praesent placerat turpis nec semper rutrum. Pellentesque tincidunt ligula non nulla egestas egestas. In consectetur ante id mi viverra, id vestibulum tortor faucibus. Nullam at vulputate leo, vel bibendum orci. Fusce bibendum efficitur maximus. Proin sit amet libero nibh. Duis eu dolor a ipsum rutrum commodo et ac mauris. Nullam venenatis justo orci, eget volutpat lorem pretium eu. Aenean nec faucibus nisl, sed vestibulum sapien. Fusce convallis interdum nunc in pulvinar. Maecenas feugiat ullamcorper enim et ornare. Phasellus lectus est, tempus ac dui non, volutpat rutrum turpis. Suspendisse potenti.\n\nNam luctus, augue non varius mollis, justo tortor rhoncus orci, eget consectetur dui nunc eget mauris. Praesent id urna urna. Donec lobortis arcu non urna varius convallis. Nam nec nisl erat. Fusce bibendum ante arcu. Cras posuere, quam eget facilisis pretium, lorem metus vulputate lorem, vel varius lacus nulla sed arcu. Cras at lobortis ex. Etiam at ultrices ligula, quis dictum mauris. Integer id urna et magna porttitor aliquet. In vel scelerisque velit. Integer id urna interdum purus ultrices mattis. Vivamus sed nunc luctus, facilisis ante eu, fermentum purus. Maecenas at nunc at nulla porta congue. Sed consectetur nulla quis odio iaculis, eu volutpat nisl tempor. In odio lorem, sollicitudin pretium justo vel, dictum accumsan nulla. ","location":"test2","date":"2023-10-30T10:00:00.000Z","categories":{"1":{"price":{"1":20,"2":30},"bg":"#ff0000","fg":"#ff0000","name":"Category 1","id":"1","ticketCount":1}},"ageGroups":{"1":{"id":1,"name":"Child","age":"0 - 15.99"},"2":{"id":2,"name":"Adult"}},"maxTickets":0,"eventID":"test4","time":"10:00:00.000","startingPrice":20,"currency":"CHF","isDraft":true,"locationName":"TestLocation2","hasSeatplan":true,"totalSeats":353},"test3":{"name":"TestEvent3","description":"This is another test event, this time without seat plan","location":"test","date":"2023-11-25T19:00:00.000Z","categories":{"1":{"price":{"1":20,"2":25},"bg":"#FFFFFF","fg":"#000000","name":"Category 1","id":1,"ticketCount":50},"2":{"price":{"1":30,"2":35},"bg":"#FFFFFF","fg":"#000000","name":"Category 2","id":2,"ticketCount":50}},"ageGroups":{"1":{"id":1,"name":"Child","age":"0 - 15.99"},"2":{"id":2,"name":"Adult"}},"maxTickets":0,"eventID":"test3","time":"19:00:00.000","startingPrice":20,"currency":"CHF","locationName":"TestLocation","hasSeatplan":false,"totalSeats":100},"testStanding":{"name":"Standing Test event","description":"Teststsatahadsf","location":"testLocationNoSeatplan","date":"2023-11-25T10:00:00.000Z","categories":{"1":{"price":{"1":10,"2":15},"bg":"#FFFFFF","fg":"#ff0000","name":"Category 1","id":"1","ticketCount":1}},"ageGroups":{"1":{"id":1,"name":"Child","age":"0 - 15.99"},"2":{"id":2,"name":"Adult"}},"maxTickets":0,"eventID":"testStanding","time":"10:00:00.000","startingPrice":10,"currency":"CHF","locationName":"TestLocationWithoutSeatplan","hasSeatplan":true,"totalSeats":51},"complexLocationTest":{"name":"Complex Location Testing","description":"asfoigup agsöjkhdf gasjklgadfslkj","location":"complexSeatplan","date":"2024-01-17T10:00:00.000Z","categories":{"1":{"price":{"1":10,"2":20},"bg":"#FFFFFF","fg":"#0040ff","name":"Category 1","id":"1","ticketCount":1},"2":{"price":{"1":20,"2":30},"bg":"#FFFFFF","fg":"#ff0000","name":"Category 2","id":2,"ticketCount":1}},"ageGroups":{"1":{"id":1,"name":"Child","age":"0 - 15.99"},"2":{"id":2,"name":"Adult"}},"maxTickets":0,"eventID":"complexLocationTest","time":"10:00:00.000","startingPrice":10,"currency":"CHF","locationName":"Complex Seat Plan","hasSeatplan":true,"totalSeats":246}} \ No newline at end of file +{} \ No newline at end of file diff --git a/src/server/data/events.json b/src/server/data/events.json index d601346..9e26dfe 100644 --- a/src/server/data/events.json +++ b/src/server/data/events.json @@ -1 +1 @@ -{"test4":{"name":"Test4Event","description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras imperdiet augue ac vestibulum tincidunt. Sed a fringilla purus, ac efficitur neque. In hac habitasse platea dictumst. Pellentesque fermentum accumsan odio, non auctor ligula. Nam metus felis, aliquam non tristique gravida, mattis sit amet nisl. Aliquam ut augue ut dui tempus condimentum sit amet eu tortor. Etiam rutrum, est a faucibus sagittis, purus augue tincidunt elit, ut lobortis augue neque vel leo. Nam non tortor maximus, feugiat tortor sed, venenatis felis. In turpis nisi, congue et varius sit amet, vehicula eget mi. Curabitur id nisi nec nisl gravida tempus sed finibus augue. Suspendisse eget nibh non risus pulvinar egestas at sed libero. Vivamus nisi augue, porttitor quis nibh in, tristique interdum erat. Sed dignissim risus non aliquam aliquam. Etiam pharetra condimentum lorem eget hendrerit. Donec aliquet mi nec nisi dapibus, varius varius lacus cursus. Ut enim nisi, blandit ut dolor vel, varius ullamcorper mauris.\n\nPraesent dignissim tellus mi, semper vulputate elit rhoncus ut. Donec posuere nibh a dolor vestibulum, vitae molestie metus rutrum. Fusce ex elit, eleifend ac finibus at, dapibus vel nunc. Sed a turpis bibendum, rutrum odio eget, dignissim nisl. Fusce nec erat aliquet, tristique tellus sit amet, vehicula dolor. Praesent id finibus ex. Maecenas neque tellus, blandit eget pretium vel, sodales sed magna. Suspendisse eu accumsan nisi, sed pulvinar risus. Morbi ultrices metus non massa faucibus, nec tempor ex venenatis. Cras bibendum elit quis ex tempor semper. Sed varius risus odio. Duis consectetur tempor dui sit amet mattis. Cras quis tristique justo.\n\nQuisque posuere risus eu tellus tristique rutrum. Sed lobortis vel felis vitae luctus. Praesent ut lectus elementum justo vulputate placerat a sit amet nulla. Suspendisse commodo fermentum risus commodo rhoncus. Etiam imperdiet volutpat tincidunt. Nunc at auctor nisl. Fusce tristique quam lacus, vel molestie nisl viverra vitae.\n\nIn tortor sem, aliquam vitae ligula vel, semper ornare quam. Morbi commodo maximus magna, et accumsan augue. Phasellus molestie lacinia blandit. Curabitur hendrerit, ligula eget hendrerit semper, lectus lacus euismod est, ac porta quam nisl vel urna. Vivamus accumsan ultricies mauris. Donec id turpis elementum, placerat arcu sed, elementum neque. Donec fermentum, risus quis luctus iaculis, quam tortor aliquam sem, vitae tincidunt augue augue quis felis. Curabitur eu rhoncus diam.\n\nMauris sollicitudin ipsum eu felis fermentum, consequat congue risus volutpat. Aenean vehicula vehicula blandit. Proin sit amet nibh fringilla, sodales orci ac, suscipit nisi. Integer sit amet sapien aliquam, vulputate velit eu, consequat sapien. Donec magna purus, finibus et mauris in, placerat blandit est. Sed ac scelerisque magna. Aenean eu gravida nunc, in tempor lorem. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In sed lectus auctor, tempus tortor at, accumsan nibh. Aenean dolor orci, malesuada eu accumsan non, cursus in leo. Sed quis ligula eu justo lacinia aliquam at at ipsum.\n\nEtiam eget justo non nisi euismod dapibus in sit amet orci. Quisque nisi eros, interdum bibendum malesuada efficitur, egestas sodales nulla. Morbi porta nulla condimentum, viverra risus vitae, laoreet orci. Integer sit amet eros eget ligula feugiat tincidunt et nec augue. Sed at ipsum at enim eleifend lacinia. Ut at molestie tortor. Donec lobortis, ante sollicitudin eleifend eleifend, felis risus gravida orci, quis pharetra elit sem id dolor. Maecenas fermentum est risus, in rhoncus mauris gravida dignissim. Aliquam ultrices ipsum in lorem aliquet, vitae posuere lacus porta. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vivamus vel augue vestibulum, ullamcorper massa et, gravida ligula. Donec auctor, lacus sed volutpat posuere, urna lorem sollicitudin ligula, at rutrum odio purus sed ante. Praesent egestas elementum augue sed convallis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eu lectus suscipit, cursus lacus sit amet, iaculis magna.\n\nIn commodo vitae mauris nec molestie. Suspendisse potenti. Proin luctus tellus velit, a venenatis velit faucibus id. Cras ac nibh ex. Nulla faucibus dolor ut lectus ullamcorper, ac malesuada ipsum efficitur. Ut imperdiet, risus vitae viverra malesuada, nibh eros commodo sem, at vulputate elit nulla vehicula eros. Donec vitae arcu sit amet elit convallis elementum eu id nisl. Maecenas tristique diam quis porttitor bibendum. Sed nisi eros, luctus ut justo ut, hendrerit congue dolor.\n\nSed vel risus ut erat sollicitudin pellentesque a eu ipsum. Aliquam risus lectus, blandit eget lacus vel, ultrices bibendum metus. Pellentesque eget condimentum est. Nullam lacus libero, ornare quis fermentum non, molestie et turpis. Vestibulum id sem non arcu rhoncus semper. Cras dignissim ipsum nisl, a malesuada quam pretium eu. Cras sit amet lorem sem.\n\nIn nunc urna, eleifend sed tortor nec, efficitur eleifend magna. Proin sed dui in magna fermentum fringilla. Praesent placerat turpis nec semper rutrum. Pellentesque tincidunt ligula non nulla egestas egestas. In consectetur ante id mi viverra, id vestibulum tortor faucibus. Nullam at vulputate leo, vel bibendum orci. Fusce bibendum efficitur maximus. Proin sit amet libero nibh. Duis eu dolor a ipsum rutrum commodo et ac mauris. Nullam venenatis justo orci, eget volutpat lorem pretium eu. Aenean nec faucibus nisl, sed vestibulum sapien. Fusce convallis interdum nunc in pulvinar. Maecenas feugiat ullamcorper enim et ornare. Phasellus lectus est, tempus ac dui non, volutpat rutrum turpis. Suspendisse potenti.\n\nNam luctus, augue non varius mollis, justo tortor rhoncus orci, eget consectetur dui nunc eget mauris. Praesent id urna urna. Donec lobortis arcu non urna varius convallis. Nam nec nisl erat. Fusce bibendum ante arcu. Cras posuere, quam eget facilisis pretium, lorem metus vulputate lorem, vel varius lacus nulla sed arcu. Cras at lobortis ex. Etiam at ultrices ligula, quis dictum mauris. Integer id urna et magna porttitor aliquet. In vel scelerisque velit. Integer id urna interdum purus ultrices mattis. Vivamus sed nunc luctus, facilisis ante eu, fermentum purus. Maecenas at nunc at nulla porta congue. Sed consectetur nulla quis odio iaculis, eu volutpat nisl tempor. In odio lorem, sollicitudin pretium justo vel, dictum accumsan nulla. ","location":"test2","date":"2023-10-30T10:00:00.000Z","categories":{"1":{"price":{"1":20,"2":30},"bg":"#ff0000","fg":"#ff0000","name":"Category 1","id":"1","ticketCount":1}},"ageGroups":{"1":{"id":1,"name":"Child","age":"0 - 15.99"},"2":{"id":2,"name":"Adult"}},"maxTickets":0,"eventID":"test4","time":"10:00:00.000","startingPrice":20,"currency":"CHF","isDraft":true,"locationName":"TestLocation2","hasSeatplan":true,"totalSeats":353},"test3":{"name":"TestEvent3","description":"This is another test event, this time without seat plan","location":"test","date":"2023-11-25T19:00:00.000Z","categories":{"1":{"price":{"1":20,"2":25},"bg":"#FFFFFF","fg":"#000000","name":"Category 1","id":1,"ticketCount":50},"2":{"price":{"1":30,"2":35},"bg":"#FFFFFF","fg":"#000000","name":"Category 2","id":2,"ticketCount":50}},"ageGroups":{"1":{"id":1,"name":"Child","age":"0 - 15.99"},"2":{"id":2,"name":"Adult"}},"maxTickets":0,"eventID":"test3","time":"19:00:00.000","startingPrice":20,"currency":"CHF","locationName":"TestLocation","hasSeatplan":false,"totalSeats":100},"testStanding":{"name":"Standing Test event","description":"Teststsatahadsf","location":"testLocationNoSeatplan","date":"2023-11-25T10:00:00.000Z","categories":{"1":{"price":{"1":10,"2":15},"bg":"#FFFFFF","fg":"#ff0000","name":"Category 1","id":"1","ticketCount":1}},"ageGroups":{"1":{"id":1,"name":"Child","age":"0 - 15.99"},"2":{"id":2,"name":"Adult"}},"maxTickets":0,"eventID":"testStanding","time":"10:00:00.000","startingPrice":10,"currency":"CHF","locationName":"TestLocationWithoutSeatplan","hasSeatplan":true,"totalSeats":51},"complexLocationTest":{"name":"Complex Location Testing","description":"asfoigup agsöjkhdf gasjklgadfslkj","location":"complexSeatplan","date":"2024-01-17T10:00:00.000Z","categories":{"1":{"price":{"1":10,"2":20},"bg":"#FFFFFF","fg":"#0040ff","name":"Category 1","id":"1","ticketCount":1},"2":{"price":{"1":20,"2":30},"bg":"#FFFFFF","fg":"#ff0000","name":"Category 2","id":2,"ticketCount":1}},"ageGroups":{"1":{"id":1,"name":"Child","age":"0 - 15.99"},"2":{"id":2,"name":"Adult"}},"maxTickets":0,"eventID":"complexLocationTest","time":"10:00:00.000","startingPrice":10,"currency":"CHF","locationName":"Complex Seat Plan","hasSeatplan":true,"totalSeats":246}} \ No newline at end of file +{} \ No newline at end of file diff --git a/src/server/data/locations.json b/src/server/data/locations.json index b13cb14..9e26dfe 100644 --- a/src/server/data/locations.json +++ b/src/server/data/locations.json @@ -1 +1 @@ -{"test2":{"locationID":"test2","name":"TestLocation2","seatplan-enabled":true,"totalSeats":352},"test":{"locationID":"test","name":"TestLocation","seatplan-enabled":false},"testLocationNoSeatplan":{"locationID":"testLocationNoSeatplan","name":"TestLocationWithoutSeatplan","seatplan-enabled":true,"totalSeats":50},"complexSeatplan":{"locationID":"complexSeatplan","name":"Complex Seat Plan","seatplan-enabled":true,"totalSeats":244}} \ No newline at end of file +{} \ No newline at end of file diff --git a/src/server/data/rootAccount.json b/src/server/data/rootAccount.json index 6d5c77a..9e26dfe 100644 --- a/src/server/data/rootAccount.json +++ b/src/server/data/rootAccount.json @@ -1,4 +1 @@ -{ - "pass": "$2b$10$56u70OdMWo/Jv5lrqaNq8OV7TxTDOPGC9tP8Ea.1zhGluHYTzuTd.", - "email": "development@janishutz.com" -} \ No newline at end of file +{} \ No newline at end of file diff --git a/src/server/data/seatplan.json b/src/server/data/seatplan.json index 4214ea0..9e26dfe 100644 --- a/src/server/data/seatplan.json +++ b/src/server/data/seatplan.json @@ -1 +1 @@ -{"test2":{"draft":{"seatInfo":{"data":{"1":{"0":22,"1":22,"2":22,"3":22,"4":22,"5":22,"6":22,"7":22,"8":22,"9":22,"10":22,"11":22,"12":22,"13":22,"14":22,"15":22}},"count":352},"data":{"1":{"x":296.892,"y":13.495,"h":560.66,"w":728.735,"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":357.007,"y":660.033,"h":117.775,"w":601.145,"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":517.721,"y":669.847,"h":80.971,"w":304.253,"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"}}},"save":{"seatInfo":{"data":{"1":{"0":22,"1":22,"2":22,"3":22,"4":22,"5":22,"6":22,"7":22,"8":22,"9":22,"10":22,"11":22,"12":22,"13":22,"14":22,"15":22}},"count":0},"data":{"1":{"x":296.892,"y":13.495,"h":560.66,"w":728.735,"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":357.375,"y":660.049,"h":117.775,"w":601.145,"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":517.828,"y":670.99,"h":80.971,"w":304.253,"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":427.696,"y":160.539,"h":371.324,"w":734.069,"active":false,"draggable":true,"resizable":true,"id":1,"origin":1,"shape":"rectangular","type":"stand","startingRow":1,"seatNumberingPosition":1,"sector":"A","text":{"text":"TestText","textSize":20,"colour":"#20FFFF"},"numberingDirection":"left","category":"1","ticketCount":50}}}},"testLocationNoSeatplan":{"draft":{"seatInfo":{"details":{"1":{"0":9,"1":9,"2":9,"startingRow":1}},"count":50,"data":{"A":{"1":{"0":9,"1":9,"2":9,"startingRow":1}}}},"data":{"1":{"x":369.755,"y":163.899,"h":287.15,"w":744.755,"active":false,"draggable":true,"resizable":true,"id":1,"origin":1,"shape":"rectangular","type":"stand","startingRow":1,"seatNumberingPosition":1,"sector":"A","text":{"text":"TestText","textSize":20,"colour":"#20FFFF"},"numberingDirection":"left","category":"1","ticketCount":50}}},"save":{"seatInfo":{"data":{"1":{"0":13,"1":13,"2":13,"3":13,"4":13,"startingRow":1}},"count":50},"data":{"1":{"x":370.138,"y":164.1,"h":288.088,"w":745.746,"active":false,"draggable":true,"resizable":true,"id":1,"origin":1,"shape":"rectangular","type":"stand","startingRow":1,"seatNumberingPosition":1,"sector":"A","text":{"text":"TestText","textSize":20,"colour":"#20FFFF"},"numberingDirection":"left","category":"1","ticketCount":50}}}},"complexSeatplan":{"draft":{"seatInfo":{"details":{"1":{"0":14,"1":14,"2":14,"3":14,"4":14,"5":14,"6":14,"7":14,"startingRow":1},"2":{"0":2,"1":4,"2":5,"3":7,"4":8,"5":10,"6":11,"7":13,"startingRow":1},"3":{"0":2,"1":4,"2":6,"3":8,"4":10,"5":12,"startingRow":1},"4":{"0":9,"1":9,"2":9,"startingRow":1}},"count":244,"data":{"A":{"1":{"0":2,"1":4,"2":6,"3":8,"4":10,"5":12,"startingRow":1},"2":{"0":14,"1":14,"2":14,"3":14,"4":14,"5":14,"6":14,"7":14,"startingRow":1},"3":{"0":2,"1":4,"2":5,"3":7,"4":8,"5":10,"6":11,"7":13,"startingRow":1},"4":{"0":9,"1":9,"2":9,"startingRow":1}}}},"data":{"1":{"x":574.098,"y":146.907,"h":282.216,"w":475.515,"active":false,"draggable":true,"resizable":true,"id":1,"origin":1,"shape":"rectangular","type":"seat","startingRow":1,"seatNumberingPosition":2,"sector":"A","text":{"text":"TestText","textSize":20,"colour":"#20FFFF"},"numberingDirection":"left","category":"1"},"2":{"x":1036.082,"y":162.371,"h":297.68,"w":589.562,"active":false,"draggable":true,"resizable":true,"id":2,"origin":1,"shape":"circular","type":"seat","startingRow":1,"seatNumberingPosition":3,"sector":"A","text":{"text":"TestText","textSize":20,"colour":"#20FFFF"},"ticketCount":1,"numberingDirection":"left","category":"1"},"3":{"x":262.887,"y":135.309,"h":322.809,"w":317.01,"active":false,"draggable":true,"resizable":true,"id":3,"origin":2,"shape":"trapezoid","type":"seat","startingRow":1,"seatNumberingPosition":1,"sector":"A","text":{"text":"TestText","textSize":20,"colour":"#20FFFF"},"ticketCount":1,"numberingDirection":"left","category":"1"},"4":{"x":715.206,"y":606.959,"h":119.845,"w":303.479,"active":false,"draggable":true,"resizable":true,"id":4,"origin":1,"shape":"rectangular","type":"seat","startingRow":1,"seatNumberingPosition":4,"sector":"A","text":{"text":"TestText","textSize":20,"colour":"#20FFFF"},"ticketCount":1,"numberingDirection":"left","category":"2"}}},"save":{"seatInfo":{"details":{"1":{"0":14,"1":14,"2":14,"3":14,"4":14,"5":14,"6":14,"7":14,"startingRow":1},"2":{"0":2,"1":4,"2":5,"3":7,"4":8,"5":10,"6":11,"7":13,"startingRow":1},"3":{"0":2,"1":4,"2":6,"3":8,"4":10,"5":12,"startingRow":1},"4":{"0":9,"1":9,"2":9,"startingRow":1}},"count":244,"data":{"A":{"1":{"0":2,"1":4,"2":6,"3":8,"4":10,"5":12,"startingRow":1},"2":{"0":14,"1":14,"2":14,"3":14,"4":14,"5":14,"6":14,"7":14,"startingRow":1},"3":{"0":2,"1":4,"2":5,"3":7,"4":8,"5":10,"6":11,"7":13,"startingRow":1},"4":{"0":9,"1":9,"2":9,"startingRow":1}}}},"data":{"1":{"x":574.098,"y":146.907,"h":282.216,"w":475.515,"active":false,"draggable":true,"resizable":true,"id":1,"origin":1,"shape":"rectangular","type":"seat","startingRow":1,"seatNumberingPosition":2,"sector":"A","text":{"text":"TestText","textSize":20,"colour":"#20FFFF"},"numberingDirection":"left","category":"1"},"2":{"x":1037.99,"y":164.215,"h":297.68,"w":589.562,"active":false,"draggable":true,"resizable":true,"id":2,"origin":1,"shape":"circular","type":"seat","startingRow":1,"seatNumberingPosition":3,"sector":"A","text":{"text":"TestText","textSize":20,"colour":"#20FFFF"},"ticketCount":1,"numberingDirection":"left","category":"1"},"3":{"x":262.887,"y":137.24,"h":322.809,"w":317.01,"active":false,"draggable":true,"resizable":true,"id":3,"origin":2,"shape":"trapezoid","type":"seat","startingRow":1,"seatNumberingPosition":1,"sector":"A","text":{"text":"TestText","textSize":20,"colour":"#20FFFF"},"ticketCount":1,"numberingDirection":"left","category":"1"},"4":{"x":715.206,"y":606.961,"h":119.845,"w":303.479,"active":false,"draggable":true,"resizable":true,"id":4,"origin":1,"shape":"rectangular","type":"seat","startingRow":1,"seatNumberingPosition":4,"sector":"A","text":{"text":"TestText","textSize":20,"colour":"#20FFFF"},"ticketCount":1,"numberingDirection":"left","category":"2"}}}}} \ No newline at end of file +{} \ No newline at end of file diff --git a/src/server/data/tickets.json b/src/server/data/tickets.json index eb27a54..9e26dfe 100644 --- a/src/server/data/tickets.json +++ b/src/server/data/tickets.json @@ -1 +1 @@ -{"test2":{"basePdf":"data:application/pdf;base64,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LTEuNDAuMjUgKFRlWCBMaXZlIDIwMjMvQXJjaCBMaW51eCkga3BhdGhzZWEgdmVyc2lvbiA2LjMuNSkKPj4KZW5kb2JqCjggMCBvYmoKPDwKL1R5cGUgL09ialN0bQovTiAxMAovRmlyc3QgNjIKL0xlbmd0aCA2MzEgICAgICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42o1UTW/bMAy9+1fwuGGoKVm2bANBsCZd2q3rUCTZ1iHIQXU0x1hqB7ZStP9+pGw0aXfZwYL0+Pj4YUoJCIgh1yAhEvRBpCQoWgkREKUxyAh0qiCFXOaQE6olSIKlUMFoFODyeW8Bb01pA5w2tbO160CT7DzAue2aQ1vYjmJ44MZuKjNpnmAlCEjyJIxSDVkswyxfB6TSkjtFYfJ4zPpAorumXexNYSkxMnAw52xbU7b++OnJXS6ccZaKYCDAGeUBoxHgTHHmDJIa3rZNsbAOViRxMQNc2icH6z4Q4L78/bEwMhTeszDA2/HYW3uK5+zb8h5WLznghX2sCju/nKw5xkopFVL/0jTMIBHiv7/e43RN/RqnURgNa4+kiYBUZBQljTyqVZiDzkSoQScRM7I4TD1PaRlKSCQzem8dJfQn9WAfMO87qCvNHknCSK/PPPqkiF7C06clSx8Lfbs7aYEXi+M4jF/tleD9kdF7DGh01Mh8S3vOkd0zVC6pFJV7vSyjMk+s65MB5ZG4sF3RVnvXtP2IfDMPZPlydTe9vP4wvZlLQfjOlDSuPWHiR/UsFnAW+Q6InGunST3vCp5UnRNzavZXtiq3dMxUgByFbWeSjZ+d2VXFeV3uLJD8wtmHH+QW4N3gEytJElvT8mS+wyX+QoP3WKDFErfP+62tscI/uMMHrLHBprbYYocOD/j4vs9zVpG6lCfX5qRqCnq4d/7IIEWbmM76K/K29lc94pvvL+2sajvHGUKcBPjVDAcpswB/Vhu37fit8NRl872uimZD2ah/s+FHouNX4kCxKY/ratPBKmHi+jVzaqhtTRn0LscH4S82riOxCmVuZHN0cmVhbQplbmRvYmoKMTYgMCBvYmoKPDwKL1R5cGUgL1hSZWYKL0luZGV4IFswIDE3XQovU2l6ZSAxNwovVyBbMSAyIDFdCi9Sb290IDE0IDAgUgovSW5mbyAxNSAwIFIKL0lEIFs8QThGQURBNEJENDA3NjdFMzY5MDY3MDI0NjNBQTI5N0E+IDxBOEZBREE0QkQ0MDc2N0UzNjkwNjcwMjQ2M0FBMjk3QT5dCi9MZW5ndGggNjAgICAgICAgIAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjYGD4z8TAwQTEzEDMAsSMQMzAyMDPAKTZGS3aQDQHELMyMmmC2GyMJs4gmpPRvIyB0TqLAQCCZgRYCmVuZHN0cmVhbQplbmRvYmoKc3RhcnR4cmVmCjE1MjEwCiUlRU9GCg==","schemas":[{"locationAndTime":{"type":"text","position":{"x":90,"y":70},"width":85,"height":10,"fontName":"Roboto"},"eventName":{"type":"text","position":{"x":89.7,"y":30},"width":85,"height":15,"alignment":"left","fontSize":18,"characterSpacing":0,"lineHeight":1,"fontName":"Roboto"},"ticketName":{"type":"text","position":{"x":90,"y":55},"width":85,"height":10,"fontName":"Roboto","alignment":"left"},"ticketQRCode":{"type":"qrcode","position":{"x":25,"y":30.05},"width":50,"height":50}}],"columns":["locationAndTime","eventName","ticketName","ticketQRCode"],"sampledata":[{"locationAndTime":"Time and date of event","eventName":"Your Event name goes here","ticketName":"Ticket details go here (Ticket name)","ticketQRCode":"QR-Code for entry control will appear here"}]}} \ No newline at end of file +{} \ No newline at end of file diff --git a/src/server/setup/setupRoutes.js b/src/server/setup/setupRoutes.js index d51c4f2..a497e11 100644 --- a/src/server/setup/setupRoutes.js +++ b/src/server/setup/setupRoutes.js @@ -7,15 +7,15 @@ * */ -// let db = null; -let db = require( '../backend/db/db.js' ); -const pwm = require( '../admin/pwdmanager.js' ); +let db = null; +let pwm = null; const fs = require( 'fs' ); const path = require( 'path' ); const bodyParser = require( 'body-parser' ); -// const db = require( '../backend/db/db.js' ); + module.exports = ( app, settings ) => { + let isSetupComplete = settings.setupDone; /* Setup start route that checks if setup key was correct */ @@ -40,9 +40,17 @@ module.exports = ( app, settings ) => { app.post( '/setup/saveBasicSettings', bodyParser.json(), ( req, res ) => { if ( req.session.setupKeyOk ) { fs.writeFileSync( path.join( __dirname + '/../config/db.config.json' ), JSON.stringify( req.body.db ) ); - fs.writeFileSync( path.join( __dirname + '/../config/mail.config.json' ), JSON.stringify( req.body.email ) ); + let emailSettings = {}; + emailSettings[ 'host' ] = req.body.email.host; + emailSettings[ 'port' ] = req.body.email.port; + emailSettings[ 'secure' ] = false; + emailSettings[ 'auth' ] = { 'user': req.body.email.user, 'pass': req.body.email.pass }; + let hostSplit = req.body.email.host.split( '.' ); + emailSettings[ 'tls' ] = { 'servername': ( hostSplit[ hostSplit.length - 2 ] + '.' + hostSplit[ hostSplit.length - 1 ] ) }; + fs.writeFileSync( path.join( __dirname + '/../config/mail.config.json' ), JSON.stringify( emailSettings ) ); if ( db === null ) { db = require( '../backend/db/db.js' ); + pwm = require( '../admin/pwdmanager.js' ); } let updatedSettings = settings; updatedSettings[ 'name' ] = req.body.websiteName; @@ -56,20 +64,29 @@ module.exports = ( app, settings ) => { app.post( '/setup/saveRootAccount', bodyParser.json(), ( req, res ) => { if ( req.session.setupKeyOk ) { + if ( db === null ) { + db = require( '../backend/db/db.js' ); + pwm = require( '../admin/pwdmanager.js' ); + } pwm.hashPassword( req.body.password ).then( hash => { db.writeJSONData( 'rootAccount', { 'pass': hash, 'email': req.body.mail } ); let updatedSettings = settings; updatedSettings[ 'setupDone' ] = true; + updatedSettings[ 'init' ] = true; db.saveSettings( updatedSettings ); - res.send( 'ok' ); + isSetupComplete = true; + ( async () => { + await db.initDB(); + db.reset(); + res.send( 'ok' ); + } )(); } ); } else { res.status( 403 ).send( 'unauthorized' ); } } ); - app.get( '/test/login', ( req, res ) => { - req.session.setupKeyOk = true; - res.send( 'ok' ); + app.get( '/getSetupStatus', ( req, res ) => { + res.send( isSetupComplete ); } ); }; \ No newline at end of file diff --git a/src/webapp/main/src/components/seatplan/userApp/userWindow.vue b/src/webapp/main/src/components/seatplan/userApp/userWindow.vue index b2c1710..06d8230 100644 --- a/src/webapp/main/src/components/seatplan/userApp/userWindow.vue +++ b/src/webapp/main/src/components/seatplan/userApp/userWindow.vue @@ -368,6 +368,7 @@ export default { reserveTicket ( option ) { if ( option.status == 'ok' && option.data ) { // Make call to server to reserve ticket to have server also keep track of reserved tickets + let progressNot = this.$refs.notification.createNotification( 'Reserving ticket...', 20, 'progress', 'normal' ); const options = { method: 'post', body: JSON.stringify( { 'id': this.selectedSeat[ 'id' ], 'component': this.selectedSeat[ 'componentID' ], 'ticketOption': option.data, 'eventID': this.event.eventID, 'category': this.draggables[ this.selectedSeat[ 'componentID' ] ].category, 'name': this.selectedSeat.displayName } ), @@ -378,6 +379,7 @@ export default { }; fetch( localStorage.getItem( 'url' ) + '/API/reserveTicket', options ).then( res => { if ( res.status === 200 ) { + this.$refs.notification.cancelNotification( progressNot ); this.$refs[ 'component' + this.selectedSeat.componentID ][ 0 ].validateSeatSelection( this.selectedSeat, option.data ); this.cartHandling( 'select', option.data ); } else if ( res.status === 409 ) { diff --git a/src/webapp/setup/src/components/notifications.vue b/src/webapp/setup/src/components/notifications.vue index 8072b39..f5a86bf 100644 --- a/src/webapp/setup/src/components/notifications.vue +++ b/src/webapp/setup/src/components/notifications.vue @@ -1,3 +1,4 @@ +