В Sails.js, модель beforeCreate, чтобы остановить создание записи путем проверки сводки существующих записей - PullRequest
0 голосов
/ 09 ноября 2019

Цель состоит в том, чтобы обнаружить и оценить запись в реальном времени (первой) перед созданием записи для второй, используя метод 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;
...