109 lines
3.7 KiB
JavaScript
109 lines
3.7 KiB
JavaScript
const algolia = require('algoliasearch');
|
|
const Base = require('./Base.js');
|
|
|
|
class TransferIndexConfigScript extends Base {
|
|
constructor() {
|
|
super();
|
|
// Bind class methods
|
|
this.start = this.start.bind(this);
|
|
this.getIndices = this.getIndices.bind(this);
|
|
this.getConfigOptions = this.getConfigOptions.bind(this);
|
|
this.transferIndexConfig = this.transferIndexConfig.bind(this);
|
|
// Define validation constants
|
|
this.message =
|
|
'\nExample: $ algolia transferindexconfig -a sourcealgoliaappid -k sourcealgoliaapikey -n sourcealgoliaindexname -d destinationalgoliaappid -y destinationalgoliaapikey -i destinationindexname -p configParams -e true\n\n';
|
|
this.params = [
|
|
'sourcealgoliaappid',
|
|
'sourcealgoliaapikey',
|
|
'sourcealgoliaindexname',
|
|
'destinationalgoliaappid',
|
|
'destinationalgoliaapikey',
|
|
];
|
|
}
|
|
|
|
getIndices(options) {
|
|
// Instantiate Algolia indices
|
|
const sourceClient = algolia(options.sourceAppId, options.sourceApiKey);
|
|
const sourceIndex = sourceClient.initIndex(options.sourceIndexName);
|
|
const destinationClient = algolia(
|
|
options.destinationAppId,
|
|
options.destinationApiKey
|
|
);
|
|
const destinationIndex = destinationClient.initIndex(
|
|
options.destinationIndexName
|
|
);
|
|
|
|
return { sourceIndex, destinationIndex };
|
|
}
|
|
|
|
getConfigOptions(options) {
|
|
// Default config
|
|
const config = {
|
|
sOptions: {},
|
|
rOptions: {},
|
|
};
|
|
// No params provided, exit early
|
|
if (!options.configParams) return config;
|
|
|
|
const params = JSON.parse(options.configParams);
|
|
|
|
// Set provided batchSynonyms and batchRules options
|
|
if (params.batchSynonymsParams)
|
|
config.sOptions = Object.assign({}, params.batchSynonymsParams);
|
|
if (params.batchRulesParams)
|
|
config.rOptions = Object.assign({}, params.batchRulesParams);
|
|
|
|
return config;
|
|
}
|
|
|
|
async transferIndexConfig(indices, config, options) {
|
|
// Transfer settings, synonyms, and query rules
|
|
const settings = await indices.sourceIndex.getSettings();
|
|
const synonyms = await indices.sourceIndex.exportSynonyms();
|
|
const rules = await indices.sourceIndex.exportRules();
|
|
if (options.excludeReplicas) delete settings.replicas;
|
|
await indices.destinationIndex.setSettings(settings);
|
|
await indices.destinationIndex.batchSynonyms(synonyms, config.sOptions);
|
|
await indices.destinationIndex.batchRules(rules, config.rOptions);
|
|
}
|
|
|
|
async start(program) {
|
|
try {
|
|
// Validate command; if invalid display help text and exit
|
|
this.validate(program, this.message, this.params);
|
|
|
|
// Config params
|
|
const options = {
|
|
sourceAppId: program.sourcealgoliaappid,
|
|
sourceApiKey: program.sourcealgoliaapikey,
|
|
sourceIndexName: program.sourcealgoliaindexname,
|
|
destinationAppId: program.destinationalgoliaappid,
|
|
destinationApiKey: program.destinationalgoliaapikey,
|
|
destinationIndexName:
|
|
program.destinationindexname || program.sourcealgoliaindexname,
|
|
configParams: program.params || null,
|
|
excludeReplicas:
|
|
program.excludereplicas !== undefined
|
|
? program.excludereplicas === 'true'
|
|
: false,
|
|
};
|
|
|
|
// Configure Algolia clients/indices
|
|
const indices = this.getIndices(options);
|
|
// Configure batchSynonyms and batchRules options
|
|
const config = this.getConfigOptions(options);
|
|
// Transfer index configuration
|
|
await this.transferIndexConfig(indices, config, options);
|
|
|
|
return console.log(
|
|
'Index settings, synonyms, and query rules transferred successfully.'
|
|
);
|
|
} catch (e) {
|
|
throw e;
|
|
}
|
|
}
|
|
}
|
|
|
|
const transferIndexConfigScript = new TransferIndexConfigScript();
|
|
module.exports = transferIndexConfigScript;
|