From 19874cd00768ae258bdc0bc6d1e1051fa0a64d48 Mon Sep 17 00:00:00 2001 From: Janis Hutz Date: Thu, 3 Aug 2023 11:11:16 +0200 Subject: [PATCH] fix various bugs in seat plan selector --- src/server/backend/api/postHandler.js | 53 ++++++-- .../seatplan/userApp/userWindow.vue | 124 +++++++++--------- .../main/src/views/purchasing/CartView.vue | 14 +- 3 files changed, 114 insertions(+), 77 deletions(-) diff --git a/src/server/backend/api/postHandler.js b/src/server/backend/api/postHandler.js index d255f9d..f9551b1 100644 --- a/src/server/backend/api/postHandler.js +++ b/src/server/backend/api/postHandler.js @@ -11,8 +11,8 @@ const db = require( '../db/db.js' ); class POSTHandler { constructor () { - this.allSelectedSeats = { 'TestEvent2': [ { 'id': 'secAr1s1', 'component': 1 } ] }; - this.ticketTotals = { 'TestEvent2': { 'ticket1': 5, 'ticket2': 5 } }; + this.allSelectedSeats = { 'test2': [ { 'id': 'secAr1s1', 'component': 1 } ] }; + this.ticketTotals = { 'test2': { 'ticket1': 5, 'ticket2': 5 } }; this.settings = { 'maxTickets': 10 }; } @@ -24,13 +24,16 @@ class POSTHandler { let transmit = {}; if ( dat.length > 0 ) { transmit = JSON.parse( dat[ 0 ].data ); - } else { - transmit[ data.eventID ] = {}; } + if ( !this.allSelectedSeats[ data.eventID ] ) { this.allSelectedSeats[ data.eventID ] = []; } + if ( !transmit[ data.eventID ] ) { + transmit[ data.eventID ] = {}; + } + if ( this.allSelectedSeats[ data.eventID ].includes( data.id ) && !data.count ) { reject( { 'code': 409, 'message': 'ERR_SEAT_SELECTED' } ); return; @@ -62,37 +65,59 @@ class POSTHandler { } db.writeDataSimple( 'temp', 'user_id', session.id, { 'user_id': session.id, 'data': JSON.stringify( transmit ), 'timestamp': new Date().toString() } ).then( () => { resolve( 'ok' ); - } ).catch( () => { + } ).catch( error => { + console.error( error ); reject( { 'code': 500, 'message': 'ERR_DB' } ); } ); } else { reject( { 'code': 418, 'message': 'ERR_TOO_MANY_TICKETS' } ); return; } - } ).catch( () => { + } ).catch( error => { + console.error( error ); reject( { 'code': 500, 'message': 'ERR_DB' } ); } ); } else if ( call === 'deselectTicket' ) { db.getDataSimple( 'temp', 'user_id', session.id ).then( dat => { - let transmit = JSON.parse( dat[ 0 ].data ); - if ( transmit[ data.eventID ] ) { - if ( transmit[ data.eventID ][ data.id ] ) { - delete transmit[ data.eventID ][ data.id ]; + let transmit = {}; + if ( dat[ 0 ] ) { + transmit = JSON.parse( dat[ 0 ].data ); + if ( transmit[ data.eventID ] ) { + if ( transmit[ data.eventID ][ data.id ] ) { + delete transmit[ data.eventID ][ data.id ]; + } else { + reject( { 'code': 404, 'message': 'ERR_DATA_NOT_FOUND' } ); + } + if ( Object.keys( transmit[ data.eventID ] ).length < 1 ) { + delete transmit[ data.eventID ]; + } } else { reject( { 'code': 404, 'message': 'ERR_DATA_NOT_FOUND' } ); } - if ( Object.keys( transmit[ data.eventID ] ).length < 1 ) { - delete transmit[ data.eventID ]; + + const allSeats = this.allSelectedSeats[ data.eventID ]; + for ( let seat in allSeats ) { + if ( allSeats[ seat ].component === data.component ) { + if ( allSeats[ seat ].id === data.id ) { + delete this.allSelectedSeats[ data.eventID ][ seat ]; + } + } } } else { reject( { 'code': 404, 'message': 'ERR_DATA_NOT_FOUND' } ); + return; } + + + db.writeDataSimple( 'temp', 'user_id', session.id, { 'user_id': session.id, 'data': JSON.stringify( transmit ) } ).then( () => { resolve( 'ok' ); - } ).catch( () => { + } ).catch( error => { + console.error( error ); reject( { 'code': 500, 'message': 'ERR_DB' } ); } ); - } ).catch( () => { + } ).catch( error => { + console.error( error ); reject( { 'code': 500, 'message': 'ERR_DB' } ); } ); } diff --git a/src/webapp/main/src/components/seatplan/userApp/userWindow.vue b/src/webapp/main/src/components/seatplan/userApp/userWindow.vue index e1d50fd..3f54322 100644 --- a/src/webapp/main/src/components/seatplan/userApp/userWindow.vue +++ b/src/webapp/main/src/components/seatplan/userApp/userWindow.vue @@ -171,26 +171,31 @@ if ( res.status === 200 ) { let unavailableSeats = {}; res.json().then( data => { - console.log( data ); for ( let seat in data.booked ) { - if ( !unavailableSeats[ data.booked[ seat ].component ] ) { - unavailableSeats[ data.booked[ seat ].component ]; + if ( data.booked[ seat ] ) { + if ( !unavailableSeats[ data.booked[ seat ].component ] ) { + unavailableSeats[ data.booked[ seat ].component ]; + } + unavailableSeats[ data.booked[ seat ].component ][ data.booked[ seat ].id ] = 'nav'; } - unavailableSeats[ data.booked[ seat ].component ][ data.booked[ seat ].id ] = 'nav'; } for ( let seat in data.reserved ) { - if ( !unavailableSeats[ data.reserved[ seat ].component ] ) { - unavailableSeats[ data.reserved[ seat ].component ] = {}; + if ( data.reserved[ seat ] ) { + if ( !unavailableSeats[ data.reserved[ seat ].component ] ) { + unavailableSeats[ data.reserved[ seat ].component ] = {}; + } + unavailableSeats[ data.reserved[ seat ].component ][ data.reserved[ seat ].id ] = 'nav'; } - unavailableSeats[ data.reserved[ seat ].component ][ data.reserved[ seat ].id ] = 'nav'; } for ( let seat in data.user ) { - if ( !unavailableSeats[ data.user[ seat ].component ] ) { - unavailableSeats[ data.reserved[ seat ].component ] = {}; + if ( data.user[ seat ] ) { + if ( !unavailableSeats[ data.user[ seat ].component ] ) { + unavailableSeats[ data.reserved[ seat ].component ] = {}; + } + unavailableSeats[ data.user[ seat ].component ][ data.user[ seat ].id ] = 'sel'; } - unavailableSeats[ data.user[ seat ].component ][ data.user[ seat ].id ] = 'sel'; } let tickets = {}; @@ -302,10 +307,10 @@ if ( this.cart[ this.event.eventID ] ) { let tickets = this.cart[ this.event.eventID ][ 'tickets' ]; for ( let seat in tickets ) { - if ( !unavailableSeats[ data.user[ seat ].component ] ) { - unavailableSeats[ data.reserved[ seat ].component ] = {}; + if ( !this.unavailableSeats[ data.user[ seat ].component ] ) { + this.unavailableSeats[ data.reserved[ seat ].component ] = {}; } - unavailableSeats[ tickets[ seat ].component ][ tickets[ seat ].id ] = 'sel'; + this.unavailableSeats[ tickets[ seat ].component ][ tickets[ seat ].id ] = 'sel'; } } @@ -400,17 +405,13 @@ // Make call to server to deselect ticket const options = { method: 'post', - body: JSON.stringify( { 'id': seat[ 'id' ], 'eventID': this.event.eventID } ), + body: JSON.stringify( { 'id': seat[ 'id' ], 'eventID': this.event.eventID, 'component': seat.component } ), headers: { 'Content-Type': 'application/json', 'charset': 'utf-8' } }; - fetch( localStorage.getItem( 'url' ) + '/API/deselectTicket', options ).then( res => { - res.text().then( text => { - console.log( text ); - } ); - } ); + fetch( localStorage.getItem( 'url' ) + '/API/deselectTicket', options ); }, standing ( id ) { const d = this.draggables[ id ]; @@ -445,47 +446,51 @@ } for ( let group in data.data ) { - if ( !this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ] ) { - if ( data.data[ group ] > 0 ) { - const options = { - method: 'post', - // TODO: Add correct name here as well once it is working at all - body: JSON.stringify( { 'id': 'ticket' + data.component + '_' + group, 'component': data.component, 'ticketOption': '', 'eventID': this.event.eventID, 'count': data.data[ group ], 'category': this.draggables[ data.component ].category, 'name': 'Ticket ' } ), - headers: { - 'Content-Type': 'application/json', - 'charset': 'utf-8' - } - }; - fetch( localStorage.getItem( 'url' ) + '/API/reserveTicket', options ).then( res => { - if ( res.status === 200 ) { - this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ] = { 'displayName': 'Ticket ' + data.component + ' (' + this.event.ageGroups[ group ].name + ')', 'price': this.event.categories[ this.draggables[ data.component ].category ].price[ group ], 'id': 'ticket' + data.component + '_' + group, 'count': data.data[ group ], 'comp': data.component }; - } else if ( res.status === 409 ) { - setTimeout( () => { - this.$refs.popups.openPopup( 'Unfortunately, the seat you just tried to select was reserved by somebody else since the last time the seat plan was refreshed. Please select another one. We are sorry for the inconvenience.', {}, 'string' ); - }, 300 ); - } - if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length < 1 ) { - delete this.cart[ this.event.eventID ]; - } + if ( data.data[ group ] > 0 ) { + const options = { + method: 'post', + // TODO: Add correct name here as well once it is working at all + body: JSON.stringify( { 'id': 'ticket' + data.component + '_' + group, 'component': data.component, 'ticketOption': '', 'eventID': this.event.eventID, 'count': data.data[ group ], 'category': this.draggables[ data.component ].category, 'name': 'Ticket ' } ), + headers: { + 'Content-Type': 'application/json', + 'charset': 'utf-8' + } + }; + fetch( localStorage.getItem( 'url' ) + '/API/reserveTicket', options ).then( res => { + if ( res.status === 200 ) { + this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ] = { 'displayName': 'Ticket ' + data.component + ' (' + this.event.ageGroups[ group ].name + ')', 'price': this.event.categories[ this.draggables[ data.component ].category ].price[ group ], 'id': 'ticket' + data.component + '_' + group, 'count': data.data[ group ], 'comp': data.component }; + } else if ( res.status === 409 ) { + setTimeout( () => { + this.$refs.popups.openPopup( 'Unfortunately, the seat you just tried to select was reserved by somebody else since the last time the seat plan was refreshed. Please select another one. We are sorry for the inconvenience.', {}, 'string' ); + }, 300 ); + } + if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length < 1 ) { + delete this.cart[ this.event.eventID ]; + } - this.$refs.cart.calculateTotal(); - localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); - } ); - } else { - delete this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ]; - const options = { - method: 'post', - body: JSON.stringify( { 'id': 'ticket' + data.component + '_' + group, 'eventID': this.event.eventID } ), - headers: { - 'Content-Type': 'application/json', - 'charset': 'utf-8' + this.$refs.cart.calculateTotal(); + localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); + } ); + } else { + if ( this.cart[ this.event.eventID ] ) { + if ( this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ] ) { + delete this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ]; + if ( this.cart[ this.event.eventID ] ) { + if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length < 1 ) { + delete this.cart[ this.event.eventID ]; + } } - }; - fetch( localStorage.getItem( 'url' ) + '/API/deselectTicket', options ).then( res => { - res.text().then( text => { - console.log( text ); - } ); - } ); + const options = { + method: 'post', + body: JSON.stringify( { 'id': 'ticket' + data.component + '_' + group, 'eventID': this.event.eventID, 'component': data.component } ), + headers: { + 'Content-Type': 'application/json', + 'charset': 'utf-8' + } + }; + fetch( localStorage.getItem( 'url' ) + '/API/deselectTicket', options ); + localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); + } } } } @@ -504,8 +509,6 @@