From 7aab1e538e6c36cdcb8d27821212f558f94409ce Mon Sep 17 00:00:00 2001 From: Bilal Catic Date: Thu, 27 Jun 2019 05:38:45 +0200 Subject: [PATCH] fetch reservations, find and update changed reservations --- cronServices/checkBookingChanges.js | 24 +++++++ ...servations-table-remove-old-primary-key.js | 14 ++++ ...-reservations-table-add-new-primary-key.js | 14 ++++ models/bookingReservation.js | 6 +- package.json | 3 +- services/integration/bookingChangeCharges.js | 2 + services/officeRnD/bookings.js | 68 ++++++++++++++++++- 7 files changed, 127 insertions(+), 4 deletions(-) create mode 100644 cronServices/checkBookingChanges.js create mode 100644 migrations/20190626135045-alter-booking-reservations-table-remove-old-primary-key.js create mode 100644 migrations/20190626173324-alter-booking-reservations-table-add-new-primary-key.js create mode 100644 services/integration/bookingChangeCharges.js diff --git a/cronServices/checkBookingChanges.js b/cronServices/checkBookingChanges.js new file mode 100644 index 0000000..a3befcc --- /dev/null +++ b/cronServices/checkBookingChanges.js @@ -0,0 +1,24 @@ +'use strict'; + +require('dotenv').config(); + +const { fetchAllBookings, bulkWriteReservationsWithChangesTracking } = require('../services/officeRnD/bookings'); + +const checkBookingChanges = () => { + fetchAllBookings() + .then((reservations) => { + bulkWriteReservationsWithChangesTracking(reservations) + .then((changes) => { + console.log('== CHANGES == '); + console.log(changes); + }) + .catch((error) => { + console.log('Error bulk write booking reservations :', error); + }); + }) + .catch((error) => { + console.log('Error fetching bookings from ORD ', error); + }); +}; + +checkBookingChanges(); diff --git a/migrations/20190626135045-alter-booking-reservations-table-remove-old-primary-key.js b/migrations/20190626135045-alter-booking-reservations-table-remove-old-primary-key.js new file mode 100644 index 0000000..bdf5ea5 --- /dev/null +++ b/migrations/20190626135045-alter-booking-reservations-table-remove-old-primary-key.js @@ -0,0 +1,14 @@ +'use strict'; + +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.removeConstraint('bookingReservations', 'bookingReservations_pkey'); + }, + + down: (queryInterface, Sequelize) => { + return queryInterface.addConstraint('bookingReservations', ['id'], { + name: 'bookingReservations_pkey', + type: 'PRIMARY KEY', + }); + } +}; diff --git a/migrations/20190626173324-alter-booking-reservations-table-add-new-primary-key.js b/migrations/20190626173324-alter-booking-reservations-table-add-new-primary-key.js new file mode 100644 index 0000000..9cb25fb --- /dev/null +++ b/migrations/20190626173324-alter-booking-reservations-table-add-new-primary-key.js @@ -0,0 +1,14 @@ +'use strict'; + +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.addConstraint('bookingReservations', ['reservationId'], { + name: 'bookingReservations_pkey', + type: 'PRIMARY KEY', + }); + }, + + down: (queryInterface, Sequelize) => { + return queryInterface.removeConstraint('bookingReservations', 'bookingReservations_pkey'); + } +}; diff --git a/models/bookingReservation.js b/models/bookingReservation.js index d977de3..9d13ba5 100644 --- a/models/bookingReservation.js +++ b/models/bookingReservation.js @@ -2,7 +2,10 @@ module.exports = (sequelize, DataTypes) => { const bookingReservation = sequelize.define('bookingReservation', { - reservationId: DataTypes.TEXT, + reservationId: { + type: DataTypes.TEXT, + primaryKey: true, + }, memberId: DataTypes.TEXT, officeId: DataTypes.TEXT, resourceId: DataTypes.TEXT, @@ -10,7 +13,6 @@ module.exports = (sequelize, DataTypes) => { end: DataTypes.DATE, timezone: DataTypes.TEXT, canceled: DataTypes.BOOLEAN, - }, {}); bookingReservation.associate = function(models) { // associations can be defined here diff --git a/package.json b/package.json index c51ec9a..952c593 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "start-server": "nodemon server.js", "start-client": "cd client && yarn start", "start": "node server.js", - "heroku-postbuild": "NPM_CONFIG_PRODUCTION=false npm install --prefix client && npm run build --prefix client" + "heroku-postbuild": "NPM_CONFIG_PRODUCTION=false npm install --prefix client && npm run build --prefix client", + "check-booking-changes": "node ./cronServices/checkBookingChanges.js" }, "engines": { "node": "11.12.x" diff --git a/services/integration/bookingChangeCharges.js b/services/integration/bookingChangeCharges.js new file mode 100644 index 0000000..eb109ab --- /dev/null +++ b/services/integration/bookingChangeCharges.js @@ -0,0 +1,2 @@ +'use strict'; + diff --git a/services/officeRnD/bookings.js b/services/officeRnD/bookings.js index c31da33..11fe373 100644 --- a/services/officeRnD/bookings.js +++ b/services/officeRnD/bookings.js @@ -148,11 +148,77 @@ const writeBookingReservation = (bookingReservation) => { return db.bookingReservation.findOrCreate({where: {...bookingReservation}, defaults: {...bookingReservation}}); }; +const bulkWriteReservationsWithChangesTracking = (reservations) => { + return new Promise ((resolve, reject) => { + const changes = []; + const asyncJobs = []; + + db.bookingReservation.addHook('beforeUpdate', 'updateHook', (instance) => { + const changedKeys = instance.changed(); + const previous = instance.previous(); + + const indexOfUpdatedAt = changedKeys.indexOf('updatedAt'); + + if (indexOfUpdatedAt !== -1){ + changedKeys.splice(indexOfUpdatedAt, 1); + } + + if (changedKeys.length > 0){ + //check if there is really difference, reservation start and end timestamps are reported as changed but they are not + + let realChange = false; + changedKeys.forEach((changedKey) => { + if (JSON.stringify(previous[changedKey]) !== JSON.stringify(instance[changedKey])){ + realChange = true; + } + }); + + if (realChange){ + changes.push({ + oldReservation: previous, + newReservation: instance.get(), + }); + } + } + }); + + reservations.forEach((reservation) => { + asyncJobs.push( + db.bookingReservation.update(reservation, { + where: { + reservationId: reservation.reservationId, + }, + returning: true, + individualHooks: true, + }) + .then(([updateCount, updatedInstances]) => { + if (updateCount === 0){ + db.bookingReservation.upsert(reservation); + } + }) + .catch((error) => { + console.log('Error updating'); + console.log(error); + reject(error); + }) + ); + }); + + Promise.all(asyncJobs) + .then(() => { + db.bookingReservation.removeHook('updateHook'); + resolve(changes); + }) + .catch((error) => reject(error)); + }); +}; + module.exports = { fetchAllBookings, writeBookingReservation, getAllFinishedBookings, getFirstNextBooking, getFirstPreviousBooking, - getFirstReservationInBlock + getFirstReservationInBlock, + bulkWriteReservationsWithChangesTracking, };