async function doSubmitOrder()

in orderservice/src/index.js [72:153]


async function doSubmitOrder(call, callback) {
    try {
        let req = call.request;
        await validateOrderRequest(req);

        //empty the cart
        try {
            await emptyCartSync({
                user_id: req.user_id
            });
        } catch(ex) {
            throw {code: 400, message: "Could not initialize order"}
        }

        //add order items to the cart
        for (let item of req.items) {
            try {
                await addItemSync({
                    "user_id": req.user_id,
                    "item": {
                        "product_id": item.id,
                        "quantity": item.quantity
                    }
                })
            } catch(ex) {
                throw {code: 400, message: "Could not add item to order. " + ex.message}
            }
        }

        let orderReq = {
            "user_id": req.user_id,
            "user_currency": req.currency,
            "email": req.email,
            "address": {
                "street_address": req.address.street,
                "city": req.address.city,
                "state": req.address.state,
                "country": req.address.country,
                "zip_code": req.address.zip
            },
            "credit_card": {
                "credit_card_number": req.credit_card.number,
                "credit_card_cvv": req.credit_card.cvv,
                "credit_card_expiration_year": req.credit_card.exp_year,
                "credit_card_expiration_month": req.credit_card.exp_month
            }
        };

        //place the order
        let orderRes = null;
        try {
            orderRes = await placeOrderSync(orderReq);
        } catch (ex) {
            throw {code: 400, message: "Could not place order. " + ex.message};
        }

        let res = {
            id: orderRes.order.order_id,
            shipping_id: orderRes.order.shipping_tracking_id,
            shipping_cost: orderRes.order.shipping_cost.units + orderRes.order.shipping_cost.nanos / Math.pow(10,9) ,
            shipping_address: {
                street: orderRes.order.shipping_address.street_address,
                city: orderRes.order.shipping_address.city,
                state: orderRes.order.shipping_address.state,
                zip: orderRes.order.shipping_address.zip_code
            },
            items: []
        }

        for (let item of orderRes.order.items) {
            res.items.push({
                id: item.item.product_id,
                quantity: item.item.quantity,
                cost: (item.cost.units + item.cost.nanos /  Math.pow(10,9) )
            })
        }

        callback(null, res);
    } catch(ex) {
        callback(ex, null);
    }
}