Цель состоит в том, чтобы обнаружить и оценить запись в реальном времени (первой) перед созданием записи для второй, используя метод beforeCreate модели ORM.
В Sails.js (версия 0.12),используя beforeCreate модели «Покупка» - пытаясь заблокировать одну покупку (позднее одну) из двух запросов от двух разных устройств / пользователей одновременно, одновременно пытаясь получить одинаковое доступное количество для каждого. Но он разрешил обе покупки, которые превышают доступное количество.
/**
* Purchase.js
*
* @description :: A model definition. Represents a database table/collection/etc.
* @docs :: https://sailsjs.com/docs/concepts/models-and-orm/models
*/
module.exports = {
attributes: {
billNumber: {
type: "string"
},
user: {
model: "user"
},
product: {
model: "product"
},
quantity: {
type: "integer"
}
},
// @param: purchase - current record to insert,
// @param: next - callback function
beforeCreate: function(purchase, next) {
// getting product info
sails.models.product.findOne({ id: purchase.product }).exec(function(err1, productInfo) {
var availableQty = productInfo.totalQuantity; // static data
var purchasedQty = 0;
// getting purchase entries of the same product - real-time
sails.models.purchase.find({ product: purchase.product }).exec(function(err, purchaseEntries) {
if (purchaseEntries != undefined) {
if (Array.isArray(purchaseEntries)) { // if multiple records available
purchaseEntries.forEach(function(purchaseRecord) {
purchasedQty = purchasedQty + purchaseRecord.quantity;
});
} else {
// if one record available
purchasedQty = purchasedQty + purchaseEntries.quantity;
}
}
// validating the quantity to purchase
if (purchase.quantity > (availableQty - purchasedQty)) {
// it blocks the creation of record with a server error.
next('Sorry! ordered qty is not available at this moment.');
} else {
// it allows creation of record.
next();
}
});
});
} // beforeCreate end;
} // Purchase model end;