Skip to content

Instantly share code, notes, and snippets.

@zelaznik
Created July 31, 2018 14:58
Show Gist options
  • Save zelaznik/134109c96da9e1943382f211cc849765 to your computer and use it in GitHub Desktop.
Save zelaznik/134109c96da9e1943382f211cc849765 to your computer and use it in GitHub Desktop.
Details Summary

Details Summary

  • A this allows people to comment on pull requests and include long snippets of code without making the discussion a mile and a half long.
Click here for a ridiculously long snippet of javascript...
const Router = require('koa-router');
const Db = require('../db');

let router = new Router();
router.post('/', async function(ctx, next) {
  const OrderItem = Db.instance.models['order-item'];
  const Order = Db.instance.models.order;
  const CartItem = Db.instance.models['cart-item'];
  const GroceryItem = Db.instance.models['grocery-item'];

  let items = ctx.request.body.data;
  await Db.instance.transaction(async () => {
    try {
      let groceryItems = await GroceryItem.findAll({
        where: {
          id: {
            $in: items.map(i => i.groceryItem.id)
          }
        }
      });
      if (groceryItems.length === 0) {
        return Promise.reject('No items in order!');
      }
      let order = await Order.create({
        name: 'TBD',
        totalPrice: 0
      });
      let totalPrice = 0;
      await Promise.all(
        groceryItems.map(groceryItem => {
          let qty = items.filter(i => i.groceryItem.id === groceryItem.id)[0]
            .qty;
          totalPrice += qty * groceryItem.price;
          return OrderItem.create({
            groceryItemId: groceryItem.id,
            orderId: order.id,
            qty
          });
        })
      );
      
      let orderName = `Order placed at ${(new Date(order.createdAt)).toISOString()}`;
      order = await order.update({
        name: orderName,
        totalPrice: 0.01 * Math.round(totalPrice * 100)
      });
      
      await CartItem.destroy({
        truncate: true
      });
      order = await Order.find({
        where: { id: order.id },
        include: [
          {
            model: OrderItem,
            as: 'orderItems',
            include: [
              {
                model: GroceryItem,
                as: 'groceryItem'
              }
            ]
          }
        ]
      });
      let payload = { data: order.get({ plain: true }) };
      ctx.body = payload;
    } catch (err) {
      ctx.body = { error: `Problem placing order: ${err}` };
    }
  }).catch(e => console.error(e));
});

module.exports = router;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment