diff --git a/package.json b/package.json index ff3f7f4..d1c5bf6 100644 --- a/package.json +++ b/package.json @@ -6,11 +6,15 @@ "start": "cds-serve" }, "dependencies": { - "@cap-js/hana": ">=2.1.2", "@sap/cds": ">=9" }, "devDependencies": { "@cap-js/sqlite": ">=2" }, + "cds": { + "requires": { + "messaging": true + } + }, "license": "Apache-2.0" } diff --git a/srv/data-service.cds b/srv/data-service.cds index 4cd49bc..b3abb10 100644 --- a/srv/data-service.cds +++ b/srv/data-service.cds @@ -30,7 +30,8 @@ service FlightsService { // Custom actions and events to sync with consumers about flight seat availability action BookingCreated ( flight: Flights:ID, date: Flights:date, seats: array of Integer); action BookingDeleted ( flight: Flights:ID, date: Flights:date, seats: array of Integer); - event FlightsUpdated { flight: Flights:ID; date: Flights:date; free_seats: Integer; } + // Restrict payload to identity as messages can overtake each other in the ether + event FlightsUpdated { flight: Flights:ID; date: Flights:date; }; } diff --git a/srv/data-service.js b/srv/data-service.js index 7052fdf..c66d471 100644 --- a/srv/data-service.js +++ b/srv/data-service.js @@ -5,14 +5,18 @@ class DataService extends cds.ApplicationService { init() { this.on ('BookingCreated', async req => { const { flight, date, seats = [null] } = req.data - await UPDATE (Flights, { flight_ID:flight, date }) - .set `occupied_seats = occupied_seats + ${seats.length}` + const confirmed = await UPDATE (Flights, { flight_ID:flight, date }) + .set `occupied_seats = occupied_seats + ${seats.length}` + .where `free_seats >= ${seats.length}` + if (!confirmed) req.reject('Flight is fully booked') + this.emit('FlightsUpdated', { flight, date }) }) this.on ('BookingDeleted', async (req) => { const { flight, date, seats = [null] } = req.data - await UPDATE (Flights, { flight_ID:flight, date }) - .set `occupied_seats = occupied_seats - ${seats.length}` + await UPDATE (Flights, { flight_ID:flight, date }) + .set `occupied_seats = occupied_seats - ${seats.length}` + this.emit('FlightsUpdated', { flight, date }) }) return super.init()