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 @@