Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 'use strict';
- var flag = true;
- // SQL car reservation before-hook
- module.exports = function(Mcarreservation) {
- Mcarreservation.beforeRemote('create',
- function(ctx, model, next) {
- doReservation(Mcarreservation, ctx, model, next, function(e) {
- flag = false;
- next();
- });
- });
- };
- function doReservation(Mcarreservation, ctx, model, next, errorCallback) {
- // models
- var sqlCarReservation = Mcarreservation.app.models.CarReservation;
- var sCar = Mcarreservation.app.models.sCar;
- // data source
- var postgres = sCar.app.dataSources.postgres;
- // begin transaction
- sqlCarReservation.beginTransaction({
- isolationLevel: sqlCarReservation.Transaction.READ_COMMITTED,
- }, function(err, tx) {
- if (err) errorCallback(err);
- // lock car for update
- postgres.connector.execute(
- 'SELECT * FROM sCar WHERE mongoId = $1 FOR UPDATE;'
- , [ctx.req.body.carId], function(err, data) {
- sCar.findOne({where: {mongoId: ctx.req.body.carId}}).then((car)=>{
- sqlCarReservation.find(
- {
- where: {sCarId: car.id},
- }).then((data)=> {
- data.forEach((element) => {
- if (flag) {
- var start1 = element.startDate.getTime();
- var end1 = element.endDate.getTime();
- var start2 = ctx.req.body.startDate;
- var end2 = ctx.req.body.endDate;
- if ((start1 >= start2 && start1 <= end2) ||
- (start2 >= start1 && start2 <= end1)) {
- tx.rollback(function(err) {
- if (err && flag) errorCallback(err);
- var error = 'Car is already reserved';
- if (flag)
- errorCallback(error);
- });
- }
- }
- });
- if (err && flag) {
- tx.rollback(function(err) {
- if (err && flag) errorCallback(err);
- });
- errorCallback(err);
- }
- // fetch car from sql
- if (flag) {
- sCar.findOne({where: {mongoId: ctx.req.body.carId}})
- .then((car)=>{
- // create reservation
- sqlCarReservation.create(
- {
- timeStamp: ctx.req.body.timeStamp,
- sCar: car,
- startDate: ctx.req.body.startDate,
- endDate: ctx.req.body.endDate,
- },
- {transaction: tx},
- function(err, cr) {
- if (err && flag) {
- tx.rollback(function(err) {
- if (err && flag) errorCallback(err);
- });
- errorCallback(err);
- }
- // commit and end before-hook
- if (flag) {
- tx.commit(function(err) {
- if (err && flag) errorCallback(err);
- next();
- });
- }
- });
- });
- }
- });
- });
- });
- });
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement