56 lines
1.8 KiB
JavaScript
56 lines
1.8 KiB
JavaScript
const { client } = require('../../algolia');
|
|
const _ = require('lodash');
|
|
const { getGuideArticleData } = require('../../data-sources/guides');
|
|
const debug = require('debug');
|
|
|
|
const log = debug('fcc:search:update:guides');
|
|
const index = client.initIndex('guides');
|
|
|
|
const concatContents = (doc, current) => ({
|
|
...current,
|
|
content: doc.content.concat([current.content])
|
|
});
|
|
|
|
exports.updateGuides = async function updateGuides() {
|
|
const newDocs = await getGuideArticleData().toPromise();
|
|
let hits = [];
|
|
const browseAll = index.browseAll();
|
|
browseAll.on('result', function onResult(content) {
|
|
hits = hits.concat(content.hits);
|
|
});
|
|
browseAll.on('end', function onEnd() {
|
|
log('Finished browsing this index');
|
|
log(`We got ${hits.length} records`);
|
|
const docIds = _.uniq(hits.map(doc => doc.id));
|
|
docIds.map(id => {
|
|
const allCurrentForId = hits.filter(doc => doc.id === id);
|
|
const allNewForId = newDocs.filter(doc => doc.id === id);
|
|
const newForId = allNewForId.reduce(concatContents, { content: [] });
|
|
const currentForId = allCurrentForId.reduce(concatContents, {
|
|
content: []
|
|
});
|
|
const isDiff = newForId.content.some(
|
|
snippet => !currentForId.content.includes(snippet)
|
|
);
|
|
if (isDiff) {
|
|
log(id, 'cyan');
|
|
const objectIDs = allCurrentForId.map(doc => doc.objectID);
|
|
index.addObjects(allNewForId, err => {
|
|
if (err) {
|
|
throw new Error(err);
|
|
}
|
|
index.deleteObjects(objectIDs, err => {
|
|
if (err) {
|
|
throw new Error(err);
|
|
}
|
|
log(`purge of stale data for ${id} complete`, 'magenta');
|
|
});
|
|
});
|
|
}
|
|
});
|
|
});
|
|
browseAll.on('error', function onError(err) {
|
|
throw err;
|
|
});
|
|
};
|