const colors = require('colors'); const lunr = require('lunr'); const indexProducts = (app) => { // index all products in lunr on startup return new Promise((resolve, reject) => { app.db.products.find({}).toArray((err, productsList) => { if(err){ console.error(colors.red(err.stack)); reject(err); } // setup lunr indexing const productsIndex = lunr(function(){ this.field('productTitle', { boost: 10 }); this.field('productTags', { boost: 5 }); this.field('productDescription'); const lunrIndex = this; // add to lunr index productsList.forEach((product) => { let doc = { 'productTitle': product.productTitle, 'productTags': product.productTags, 'productDescription': product.productDescription, 'id': product._id }; lunrIndex.add(doc); }); }); app.productsIndex = productsIndex; console.log(colors.cyan('- Product indexing complete')); resolve(); }); }); }; const indexCustomers = (app) => { // index all products in lunr on startup return new Promise((resolve, reject) => { app.db.customers.find({}).toArray((err, customerList) => { if(err){ console.error(colors.red(err.stack)); reject(err); } // setup lunr indexing const customersIndex = lunr(function(){ this.field('email', { boost: 10 }); this.field('name', { boost: 5 }); this.field('phone'); const lunrIndex = this; // add to lunr index customerList.forEach((customer) => { let doc = { 'email': customer.email, 'name': `${customer.firstName} ${customer.lastName}`, 'phone': customer.phone, 'id': customer._id }; lunrIndex.add(doc); }); }); app.customersIndex = customersIndex; console.log(colors.cyan('- Customer indexing complete')); resolve(); }); }); }; const indexOrders = (app, cb) => { // index all orders in lunr on startup return new Promise((resolve, reject) => { app.db.orders.find({}).toArray((err, ordersList) => { if(err){ console.error(colors.red('Error setting up products index: ' + err)); reject(err); } // setup lunr indexing const ordersIndex = lunr(function(){ this.field('orderEmail', { boost: 10 }); this.field('orderLastname', { boost: 5 }); this.field('orderPostcode'); const lunrIndex = this; // add to lunr index ordersList.forEach((order) => { let doc = { 'orderLastname': order.orderLastname, 'orderEmail': order.orderEmail, 'orderPostcode': order.orderPostcode, 'id': order._id }; lunrIndex.add(doc); }); }); app.ordersIndex = ordersIndex; console.log(colors.cyan('- Order indexing complete')); resolve(); }); }); }; const fixProductDates = (products) => { let index = 0; products.forEach(() => { products[index].productAddedDate = new Date(); index++; }); return products; }; // start indexing products and orders const runIndexing = (app) => { console.info(colors.yellow('Setting up indexes..')); return Promise.all([ indexProducts(app), indexOrders(app), indexCustomers(app) ]) .catch((err) => { console.info(colors.yellow('Error setting up indexes', err)); process.exit(2); }); }; module.exports = { indexProducts, indexCustomers, indexOrders, fixProductDates, runIndexing };