@fairwords/loopback-connector-es 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +18 -0
- package/CHANGELOG.md +66 -0
- package/Jenkinsfile +7 -0
- package/LICENCE +19 -0
- package/README.md +430 -0
- package/cacert.pem +141 -0
- package/docker-compose-for-testing-all.yml +22 -0
- package/docker-compose-for-testing-v1.yml +11 -0
- package/docker-compose-for-testing-v2.yml +11 -0
- package/docker-compose-for-testing-v5.yml +8 -0
- package/docker-compose.yml +20 -0
- package/docker-entrypoint-es1-plugins.sh +10 -0
- package/docker-entrypoint-es2-plugins.sh +21 -0
- package/index.js +1 -0
- package/lib/automigrate.js +75 -0
- package/lib/esConnector.js +1357 -0
- package/lib/setupIndex.js +57 -0
- package/lib/setupMapping.js +70 -0
- package/lib/setupMappings.js +44 -0
- package/package.json +54 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var log = null;
|
|
4
|
+
var Promise = null;
|
|
5
|
+
|
|
6
|
+
var createIndex = function createIndex (self, params) {
|
|
7
|
+
log('ESConnector.prototype.setupIndices', 'createIndex()', params);
|
|
8
|
+
return self.db.indices.create(params)
|
|
9
|
+
.then(function(info) {
|
|
10
|
+
log('ESConnector.prototype.setupIndices', 'createIndex()', 'self.db.indices.create()', 'response:', info);
|
|
11
|
+
return Promise.resolve();
|
|
12
|
+
}, function(err) {
|
|
13
|
+
if (err.message.indexOf('IndexAlreadyExistsException') !== -1 ||
|
|
14
|
+
err.message.indexOf('index_already_exists_exception') !== -1)
|
|
15
|
+
{
|
|
16
|
+
//console.trace('OMG WTF', err);
|
|
17
|
+
log('ESConnector.prototype.setupIndices', 'createIndex()', 'self.db.indices.create()', 'we ate IndexAlreadyExistsException');
|
|
18
|
+
return Promise.resolve();
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
log('ESConnector.prototype.setupIndices', 'createIndex()', 'self.db.indices.create()', 'failed:', err);
|
|
22
|
+
return Promise.reject(err);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
var setupIndex = function setupIndex (indexName) {
|
|
28
|
+
var self = this;
|
|
29
|
+
|
|
30
|
+
if (!indexName) { // validate input
|
|
31
|
+
return Promise.reject('missing indexName');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
var params = {
|
|
35
|
+
index: indexName,
|
|
36
|
+
body: self.searchIndexSettings
|
|
37
|
+
};
|
|
38
|
+
return self.db.indices.exists(params)
|
|
39
|
+
.then(function(exists) {
|
|
40
|
+
log('ESConnector.prototype.setupIndices', 'self.db.indices.exists()', 'response:', exists);
|
|
41
|
+
if (!exists) {
|
|
42
|
+
return createIndex(self, params);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
return Promise.resolve();
|
|
46
|
+
}
|
|
47
|
+
}, function(err) {
|
|
48
|
+
log('ESConnector.prototype.setupIndices', 'self.db.indices.exists()', 'failed:', err);
|
|
49
|
+
return Promise.reject(err);
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
module.exports = function(dependencies) {
|
|
54
|
+
log = (dependencies) ? (dependencies.log || console.log) : console.log; /*eslint no-console: ["error", { allow: ["log"] }] */
|
|
55
|
+
Promise = (dependencies) ? (dependencies.bluebird || require('bluebird')) : require('bluebird');
|
|
56
|
+
return setupIndex;
|
|
57
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _ = null;
|
|
4
|
+
var log = null;
|
|
5
|
+
var Promise = null;
|
|
6
|
+
|
|
7
|
+
var setupMapping = function (modelName) {
|
|
8
|
+
if(!modelName) {
|
|
9
|
+
return Promise.reject('missing modelName');
|
|
10
|
+
}
|
|
11
|
+
var self = this;
|
|
12
|
+
var db = self.db;
|
|
13
|
+
var settings = self.settings;
|
|
14
|
+
|
|
15
|
+
// validate that a `mapping` for the `modelName` has been provided in datasource.<env>.json
|
|
16
|
+
// TODO: key/value pairs in `mappings` where modelName is the key,
|
|
17
|
+
// may be more useful ... rather than `mappings` as an array of objects in datasource.<env>.json
|
|
18
|
+
var mappingsFromDatasource = _.filter(settings.mappings, function(mapping){
|
|
19
|
+
return mapping.name === modelName;
|
|
20
|
+
});
|
|
21
|
+
log('ESConnector.prototype.setupMapping', 'mappingsFromDatasource:', mappingsFromDatasource);
|
|
22
|
+
|
|
23
|
+
var mappingFromDatasource;
|
|
24
|
+
if(mappingsFromDatasource.length === 0) {
|
|
25
|
+
log('ESConnector.prototype.setupMapping', 'missing mapping for modelName:', modelName,
|
|
26
|
+
' ... this usecase is legitimate if you want elasticsearch to take care of mapping dynamically');
|
|
27
|
+
return Promise.resolve();
|
|
28
|
+
}
|
|
29
|
+
else if(mappingsFromDatasource.length > 1) {
|
|
30
|
+
return Promise.reject('more than one mapping for modelName:', modelName);
|
|
31
|
+
// TODO: dynamic index/type mapping would be better via a dev provided function to determine what to use,
|
|
32
|
+
// if same model is present across different indexes
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
log('ESConnector.prototype.setupMapping', 'found mapping for modelName:', modelName);
|
|
36
|
+
mappingFromDatasource = mappingsFromDatasource[0];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
var defaults = self.addDefaults(mappingFromDatasource.name); // NOTE: this is where the magic happens
|
|
40
|
+
var mapping = _.clone(mappingFromDatasource);
|
|
41
|
+
|
|
42
|
+
// TODO: create a method called cleanUpMapping or something like that to blackbox this stuff
|
|
43
|
+
delete mapping.name;
|
|
44
|
+
delete mapping.index;
|
|
45
|
+
delete mapping.type;
|
|
46
|
+
|
|
47
|
+
log('ESConnector.prototype.setupMapping', 'will setup mapping for modelName:', mappingFromDatasource.name);
|
|
48
|
+
|
|
49
|
+
//return self.setupIndices(defaults.index)
|
|
50
|
+
return self.setupIndex(defaults.index)
|
|
51
|
+
.then(function(){
|
|
52
|
+
log('ESConnector.prototype.setupMapping', 'db.indices.putMapping', 'modelName:', modelName, 'start');
|
|
53
|
+
return db.indices.putMapping(_.defaults({body: mapping}, defaults))
|
|
54
|
+
.then(function (body) {
|
|
55
|
+
log('ESConnector.prototype.setupMapping', 'db.indices.putMapping', 'modelName:', modelName, 'response', body);
|
|
56
|
+
return Promise.resolve();
|
|
57
|
+
}, function (err) {
|
|
58
|
+
log('ESConnector.prototype.setupMapping', 'db.indices.putMapping', 'modelName:', modelName, 'failed', err);
|
|
59
|
+
//console.trace(err.message);
|
|
60
|
+
return Promise.reject(err);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
module.exports = function(dependencies) {
|
|
66
|
+
log = (dependencies) ? (dependencies.log || console.log) : console.log; /*eslint no-console: ["error", { allow: ["log"] }] */
|
|
67
|
+
_ = (dependencies) ? (dependencies.lodash || require('lodash')) : require('lodash');
|
|
68
|
+
Promise = (dependencies) ? (dependencies.bluebird || require('bluebird')) : require('bluebird');
|
|
69
|
+
return setupMapping;
|
|
70
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _ = null;
|
|
4
|
+
var log = null;
|
|
5
|
+
var Promise = null;
|
|
6
|
+
|
|
7
|
+
var setupMappings = function () {
|
|
8
|
+
var self = this;
|
|
9
|
+
var modelNames = _.pluck(self.settings.mappings, 'name');
|
|
10
|
+
|
|
11
|
+
return Promise.map(
|
|
12
|
+
modelNames,
|
|
13
|
+
function (modelName) {
|
|
14
|
+
log('ESConnector.prototype.setupMappings', 'will setup mapping for modelName:', modelName);
|
|
15
|
+
return self.setupMapping(modelName)
|
|
16
|
+
.then(
|
|
17
|
+
function (body) {
|
|
18
|
+
log('ESConnector.prototype.setupMappings', 'finished mapping for modelName:', modelName, 'response:', body);
|
|
19
|
+
return Promise.resolve();
|
|
20
|
+
},
|
|
21
|
+
function (err) {
|
|
22
|
+
log('ESConnector.prototype.setupMappings', 'failed mapping for modelName:', modelName, 'err:', err);
|
|
23
|
+
return Promise.reject(err);
|
|
24
|
+
}
|
|
25
|
+
);
|
|
26
|
+
},
|
|
27
|
+
{concurrency: 1}
|
|
28
|
+
)
|
|
29
|
+
.then(function(){
|
|
30
|
+
log('ESConnector.prototype.setupMappings', 'finished');
|
|
31
|
+
return Promise.resolve();
|
|
32
|
+
})
|
|
33
|
+
.catch(function(err){
|
|
34
|
+
log('ESConnector.prototype.setupMappings', 'failed', err);
|
|
35
|
+
return Promise.reject(err);
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
module.exports = function(dependencies) {
|
|
40
|
+
log = (dependencies) ? (dependencies.log || console.log) : console.log; /*eslint no-console: ["error", { allow: ["log"] }] */
|
|
41
|
+
_ = (dependencies) ? (dependencies.lodash || require('lodash')) : require('lodash');
|
|
42
|
+
Promise = (dependencies) ? (dependencies.bluebird || require('bluebird')) : require('bluebird');
|
|
43
|
+
return setupMappings;
|
|
44
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fairwords/loopback-connector-es",
|
|
3
|
+
"version": "1.4.2",
|
|
4
|
+
"description": "Connect LoopBack to Elasticsearch engine",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"eslint": "eslint",
|
|
8
|
+
"pretest": "eslint **/*.js",
|
|
9
|
+
"test": "mocha --recursive",
|
|
10
|
+
"testv1": "mocha test/es-v1/**/*.js",
|
|
11
|
+
"testv2": "mocha test/es-v2/**/*.js",
|
|
12
|
+
"testv5": "mocha test/es-v5/**/*.js"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"loopback",
|
|
16
|
+
"elastic",
|
|
17
|
+
"elasticsearch",
|
|
18
|
+
"es",
|
|
19
|
+
"loopback-connector",
|
|
20
|
+
"connector"
|
|
21
|
+
],
|
|
22
|
+
"readmeFilename": "README.md",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://bitbucket.org/honcho_works/loopback-connector-elastic-search"
|
|
26
|
+
},
|
|
27
|
+
"license": {
|
|
28
|
+
"name": "MIT",
|
|
29
|
+
"url": "https://github.com/strongloop-community/loopback-connector-elastic-search/blob/master/LICENCE"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"async": "^0.9.0",
|
|
33
|
+
"bluebird": "^2.9.14",
|
|
34
|
+
"debug": "^2.1.3",
|
|
35
|
+
"elastic-deletebyquery": "1.0.8",
|
|
36
|
+
"elasticsearch": "^12.1.3",
|
|
37
|
+
"lodash": "^3.5.0",
|
|
38
|
+
"loopback-connector": "^1.1.1"
|
|
39
|
+
},
|
|
40
|
+
"directories": {
|
|
41
|
+
"example": "examples",
|
|
42
|
+
"test": "test"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"chai": "^2.1.2",
|
|
46
|
+
"eslint": "2.13.1",
|
|
47
|
+
"eslint-config-loopback": "4.0.0",
|
|
48
|
+
"grunt": "^0.4.5",
|
|
49
|
+
"grunt-mocha-test": "^0.12.1",
|
|
50
|
+
"loopback-datasource-juggler": "^2.21.0",
|
|
51
|
+
"mocha": "^1.21.4",
|
|
52
|
+
"should": "^5.2.0"
|
|
53
|
+
}
|
|
54
|
+
}
|