Advertisement
canezzy

Untitled

Apr 18th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.36 KB | None | 0 0
  1. 'use strict';
  2.  
  3.  
  4. var flag = true;
  5. // SQL car reservation before-hook
  6. module.exports = function(Mcarreservation) {
  7. Mcarreservation.beforeRemote('create',
  8. function(ctx, model, next) {
  9. doReservation(Mcarreservation, ctx, model, next, function(e) {
  10. flag = false;
  11. next();
  12. });
  13. });
  14. };
  15.  
  16. function doReservation(Mcarreservation, ctx, model, next, errorCallback) {
  17. // models
  18. var sqlCarReservation = Mcarreservation.app.models.CarReservation;
  19. var sCar = Mcarreservation.app.models.sCar;
  20. // data source
  21. var postgres = sCar.app.dataSources.postgres;
  22. // begin transaction
  23. sqlCarReservation.beginTransaction({
  24. isolationLevel: sqlCarReservation.Transaction.READ_COMMITTED,
  25. }, function(err, tx) {
  26. if (err) errorCallback(err);
  27. // lock car for update
  28. postgres.connector.execute(
  29. 'SELECT * FROM sCar WHERE mongoId = $1 FOR UPDATE;'
  30. , [ctx.req.body.carId], function(err, data) {
  31. sCar.findOne({where: {mongoId: ctx.req.body.carId}}).then((car)=>{
  32. sqlCarReservation.find(
  33. {
  34. where: {sCarId: car.id},
  35. }).then((data)=> {
  36. data.forEach((element) => {
  37. if (flag) {
  38. var start1 = element.startDate.getTime();
  39. var end1 = element.endDate.getTime();
  40. var start2 = ctx.req.body.startDate;
  41. var end2 = ctx.req.body.endDate;
  42. if ((start1 >= start2 && start1 <= end2) ||
  43. (start2 >= start1 && start2 <= end1)) {
  44. tx.rollback(function(err) {
  45. if (err && flag) errorCallback(err);
  46.  
  47. var error = 'Car is already reserved';
  48. if (flag)
  49. errorCallback(error);
  50. });
  51. }
  52. }
  53. });
  54.  
  55. if (err && flag) {
  56. tx.rollback(function(err) {
  57. if (err && flag) errorCallback(err);
  58. });
  59. errorCallback(err);
  60. }
  61. // fetch car from sql
  62. if (flag) {
  63. sCar.findOne({where: {mongoId: ctx.req.body.carId}})
  64. .then((car)=>{
  65. // create reservation
  66. sqlCarReservation.create(
  67. {
  68. timeStamp: ctx.req.body.timeStamp,
  69. sCar: car,
  70. startDate: ctx.req.body.startDate,
  71. endDate: ctx.req.body.endDate,
  72. },
  73. {transaction: tx},
  74. function(err, cr) {
  75. if (err && flag) {
  76. tx.rollback(function(err) {
  77. if (err && flag) errorCallback(err);
  78. });
  79. errorCallback(err);
  80. }
  81. // commit and end before-hook
  82. if (flag) {
  83. tx.commit(function(err) {
  84. if (err && flag) errorCallback(err);
  85. next();
  86. });
  87. }
  88. });
  89. });
  90. }
  91. });
  92. });
  93. });
  94. });
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement