expressCart/lib/indexing.js

151 lines
4.5 KiB
JavaScript

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) => {
const doc = {
productTitle: product.productTitle,
productTags: product.productTags,
productDescription: product.productDescription,
id: product._id
};
lunrIndex.add(doc);
});
});
app.productsIndex = productsIndex;
if(process.env.NODE_ENV !== 'test'){
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) => {
const doc = {
email: customer.email,
name: `${customer.firstName} ${customer.lastName}`,
phone: customer.phone,
id: customer._id
};
lunrIndex.add(doc);
});
});
app.customersIndex = customersIndex;
if(process.env.NODE_ENV !== 'test'){
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) => {
const doc = {
orderLastname: order.orderLastname,
orderEmail: order.orderEmail,
orderPostcode: order.orderPostcode,
id: order._id
};
lunrIndex.add(doc);
});
});
app.ordersIndex = ordersIndex;
if(process.env.NODE_ENV !== 'test'){
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) => {
if(process.env.NODE_ENV !== 'test'){
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
};