@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.
@@ -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
+ }