@@ -1,7 +1,10 @@
import {api} from './const';
import merge from 'lodash/object/merge';
import times from 'lodash/utility/times';
import flatten from 'lodash/array/flatten';
import pluck from 'lodash/collection/pluck';

const OrderFactory = ($http, $window) => {
const OrderFactory = ($http, $window, $q, $timeout) => {
let $orders = {};

const getState = ()=> {
@@ -38,6 +41,29 @@ const OrderFactory = ($http, $window) => {
return resp.data;
};

async function getPreorderByChunk(broker, leadsSofar, totalLeads) {
const cursor = {
limit: 1000,
skip: leadsSofar
};
const leadsLeft = totalLeads - leadsSofar;
const numOfCalls = Math.ceil(leadsLeft / cursor.limit) + 1;
let callsLeft = numOfCalls;
const responses = await $q.all(times(numOfCalls, i => {
const prom = preorder(broker, cursor);
callsLeft--;
cursor.skip += cursor.limit;
if (callsLeft === 1) {
cursor.limit = ((numOfCalls - 1) * 1000) - totalLeads;
}

return prom;
}));

const results = flatten(responses);
return results;
}

async function getCountForPreorder(broker) {
const resp = await $http({
method: 'GET',
@@ -55,19 +81,53 @@ const OrderFactory = ($http, $window) => {
url: `${api}/orders`
});
const order = merge(resp.data, opts);
downloadOrder(order);
return order;
}

function createLargeOrder(leads, broker, opts={}) {
const numOfCalls = Math.ceil(leads.length / 1000);
return createOrder(pluck(leads.splice(0, 1000), '_id'), broker, opts)
.then(order => {
return recursiveUpdate(numOfCalls, leads, order);
});
};

const recursiveUpdate = (numOfCalls, leads, order) => {
let callsLeft = numOfCalls;
return updateOrder(order._id,
{leads: pluck(leads.splice(0, 1000), '_id')}
)
.then(order => {
callsLeft--;
if (callsLeft && leads.length) {
return recursiveUpdate(callsLeft, leads, order);
}
});
};

async function updateOrder(orderId, updated) {
const resp = await $http({
method: 'PUT',
url: `${api}/orders/${orderId}`,
data: updated
});

return resp.data;
}

return {
updateOrder,
createLargeOrder,
getOrders,
getState,
createOrder,
downloadOrder,
preorder,
getCountForPreorder
getCountForPreorder,
getPreorderByChunk
};
};

OrderFactory.$inject = ['$http', '$window'];
OrderFactory.$inject = ['$http', '$window', '$q', '$timeout'];

export {OrderFactory};
@@ -9,6 +9,18 @@ import jsonToCsv from 'json-csv';
import es from 'event-stream';

export const $param = (req, res, next, orderId) => {
Orders.findByIdAsync(orderId)
.then(order => {
if (!order) {
res.status(404).end();
} else {
req.order = order;
next();
}
})
.catch(e => {
next('ERROR', e);
});
};

export const $getForBroker = (req, res, next)=> {
@@ -36,7 +48,6 @@ export const $preorder = (req, res, next) => {
if (req.query.count) {
return Orders.getCountForPreorder(broker)
.then(count => {
logger.log('count', count);
res.json({count});
})
.catch(e => {
@@ -56,37 +67,30 @@ export const $preorder = (req, res, next) => {
};

export const $create = (req, res, next)=> {
// const mimeType = req.query.filetype;
// oly support csvs for now
// if (/text|txt|pdf/g.test(mimeType)) {
// return res.send({message: `${mimeType} files not supoorted yet!`});
// }

Orders.createOrder(req.body)
Orders.createAsync({broker: req.body.broker._id})
.then(order => {
res.json(order);
order.leads = req.body.leads;
order.save((err, saved) => {
err ? next(err) : res.json({_id: saved._id});
});
})
.catch(e => {
next(e);
});

// Orders.createOrder({_id: req.query.broker})
// .then(data => {
// if (data.message) {
// res.json(data.message);
// } else {
// utils.downloadFile(res, req.query.filetype, data);
// }
// })
// .catch(e => {
// // logger.error('error', e);
// console.error(e);
// res.send(e);
// });
};

export const $put = (req, res, next)=> {
const order = req.order;
if (req.body.leads) {
req.body.leads = order.leads.concat(req.body.leads);
}

_.merge(order, req.body);

order.save((err, saved) => {
err ? next(err) : res.json({_id: saved._id});
});
};

export const $destroy = (req, res, next)=> {
@@ -66,14 +66,14 @@ const getLeads = ({broker, blacklist, limit, skip})=> {

let selection = Leads.find(query).select('-type -dupeKey').lean();

if (limit) {
selection = selection.limit(limit);
}

if (skip) {
selection = selection.skip(skip);
}

if (limit) {
selection = selection.limit(limit);
}

return selection.stream();
};

@@ -2,7 +2,7 @@ import * as controller from './orders.controller';
import express from 'express';

const router = express.Router();

router.param('id', controller.$param);
router.get('/broker', controller.$getForBroker);
router.post('/', controller.$create);