@restorecommerce/resource-base-interface 0.2.1 → 0.2.6
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/CHANGELOG.md +21 -0
- package/lib/core/GraphResourcesServiceBase.js +120 -100
- package/lib/core/GraphResourcesServiceBase.js.map +1 -1
- package/lib/core/ResourcesAPI.js +281 -308
- package/lib/core/ResourcesAPI.js.map +1 -1
- package/lib/core/ServiceBase.js +244 -244
- package/lib/core/ServiceBase.js.map +1 -1
- package/lib/core/interfaces.d.ts +32 -0
- package/lib/core/interfaces.js +8 -1
- package/lib/core/interfaces.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +20 -1
- package/lib/index.js.map +1 -1
- package/package.json +19 -20
- package/tsconfig.json +12 -4
- package/test.js +0 -16
- package/testFilter.js +0 -221
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
### 0.2.6 (February 11th, 2022)
|
|
2
|
+
|
|
3
|
+
- updated dependencies
|
|
4
|
+
|
|
5
|
+
### 0.2.5 (February 7th, 2022)
|
|
6
|
+
|
|
7
|
+
- fix for strategy for fields for updated redis
|
|
8
|
+
|
|
9
|
+
### 0.2.4 (January 28th, 2022)
|
|
10
|
+
|
|
11
|
+
- remove bluebird and updated redis
|
|
12
|
+
|
|
13
|
+
### 0.2.3 (January 28th, 2022)
|
|
14
|
+
|
|
15
|
+
- fix traversal for changes in proto structure and updated tests
|
|
16
|
+
- updated dependencies
|
|
17
|
+
|
|
18
|
+
### 0.2.2 (December 22nd, 2021)
|
|
19
|
+
|
|
20
|
+
- updated RC dependencies
|
|
21
|
+
|
|
1
22
|
### 0.2.1 (December 9th, 2021)
|
|
2
23
|
|
|
3
24
|
- updated dependencies
|
|
@@ -1,17 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
10
20
|
};
|
|
11
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
22
|
exports.GraphResourcesServiceBase = void 0;
|
|
13
|
-
const _ = require("lodash");
|
|
23
|
+
const _ = __importStar(require("lodash"));
|
|
14
24
|
const logger_1 = require("@restorecommerce/logger");
|
|
25
|
+
const stream_1 = require("stream");
|
|
15
26
|
/**
|
|
16
27
|
* Graph Resource API base provides functions for graph Operations such as
|
|
17
28
|
* creating or modifying Vertices/Edges, graph traversal etc.
|
|
@@ -60,107 +71,116 @@ class GraphResourcesServiceBase {
|
|
|
60
71
|
* @return {TraversalResponse} TraversalResponse containing VertexFields,
|
|
61
72
|
* traversed pahts and materialized data
|
|
62
73
|
*/
|
|
63
|
-
traversal(call, context) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
+
async traversal(call, context) {
|
|
75
|
+
try {
|
|
76
|
+
const request = call.request?.request;
|
|
77
|
+
const vertices = request?.vertices;
|
|
78
|
+
const collection = request?.collection;
|
|
79
|
+
const options = request?.opts;
|
|
80
|
+
if (!vertices && !collection) {
|
|
81
|
+
const message = 'missing start vertex or collection_name for graph traversal';
|
|
82
|
+
this.logger.error(message);
|
|
83
|
+
await call.write({
|
|
84
|
+
operation_status: { code: 400, message }
|
|
85
|
+
});
|
|
86
|
+
return await call.end();
|
|
87
|
+
}
|
|
88
|
+
const filters = request?.filters;
|
|
89
|
+
let path = request?.path ? request.path : false;
|
|
90
|
+
let traversalCursor;
|
|
91
|
+
let sort;
|
|
92
|
+
if (collection && !_.isEmpty(collection.sort)) {
|
|
93
|
+
sort = {};
|
|
94
|
+
_.forEach(collection.sort, (s) => {
|
|
95
|
+
switch (s.order) {
|
|
96
|
+
case 'ASCENDING':
|
|
97
|
+
case 1:
|
|
98
|
+
sort[s.field] = 'ASC';
|
|
99
|
+
break;
|
|
100
|
+
case 2:
|
|
101
|
+
case 'DESCENDING':
|
|
102
|
+
sort[s.field] = 'DESC';
|
|
103
|
+
break;
|
|
104
|
+
case 'UNSORTED':
|
|
105
|
+
case 0:
|
|
106
|
+
default:
|
|
107
|
+
break;
|
|
74
108
|
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const vertexFields = queryResult.vertex_fields || [];
|
|
106
|
-
let marshallRequired = false;
|
|
107
|
-
for (let eachVertex of vertexFields) {
|
|
108
|
-
const collectionArray = eachVertex._id.split('/');
|
|
109
|
-
const resourceName = collectionArray[0].substring(0, collectionArray[0].length - 1);
|
|
110
|
-
marshallRequired = true;
|
|
111
|
-
if (this.bufferedCollections.indexOf(resourceName) > -1) {
|
|
112
|
-
// need to marshall this collection instance data
|
|
113
|
-
// map id to the actual key which needs to be marshelled
|
|
114
|
-
idPropertyMapping.set(collectionArray[1], this.bufferFiledCfg[resourceName]);
|
|
115
|
-
marshallRequired = true;
|
|
109
|
+
});
|
|
110
|
+
collection.sort = sort;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
this.logger.debug('Calling traversal', { vertices, collection });
|
|
114
|
+
traversalCursor = await this.db.traversal(vertices, collection, options, filters);
|
|
115
|
+
this.logger.debug('Received traversal ArrayCursor from DB');
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
this.logger.error('Error stack', err);
|
|
119
|
+
this.logger.error('Error executing DB Traversal', { error: err.message });
|
|
120
|
+
await call.write({
|
|
121
|
+
operation_status: { code: err.code ? err.code : 500, message: err.message }
|
|
122
|
+
});
|
|
123
|
+
return await call.end();
|
|
124
|
+
}
|
|
125
|
+
let rootCursor = traversalCursor.rootCursor;
|
|
126
|
+
let associationCursor = traversalCursor.associationCursor;
|
|
127
|
+
const traversalStream = new stream_1.Stream.Readable({ objectMode: true });
|
|
128
|
+
// root entity data batches
|
|
129
|
+
if (rootCursor && rootCursor.batches) {
|
|
130
|
+
for await (const batch of rootCursor.batches) {
|
|
131
|
+
// root entity data, encoding before pushing batch
|
|
132
|
+
for (let elem of batch) {
|
|
133
|
+
if (elem._key) {
|
|
134
|
+
delete elem._key;
|
|
135
|
+
}
|
|
136
|
+
if (elem._rev) {
|
|
137
|
+
delete elem._rev;
|
|
138
|
+
}
|
|
116
139
|
}
|
|
117
|
-
|
|
118
|
-
delete eachVertex._key;
|
|
119
|
-
delete eachVertex._rev;
|
|
120
|
-
eachVertex['id'] = eachVertex._id;
|
|
121
|
-
delete eachVertex._id;
|
|
140
|
+
traversalStream.push({ data: { value: Buffer.from(JSON.stringify(batch)) } });
|
|
122
141
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
142
|
+
}
|
|
143
|
+
// association entity data batches
|
|
144
|
+
if (associationCursor && associationCursor.batches) {
|
|
145
|
+
for await (const batch of associationCursor.batches) {
|
|
146
|
+
let associationData = [];
|
|
147
|
+
let traversedPaths = [];
|
|
148
|
+
for (let data of batch) {
|
|
149
|
+
if (data.v._key) {
|
|
150
|
+
delete data.v._key;
|
|
130
151
|
}
|
|
131
|
-
|
|
132
|
-
|
|
152
|
+
if (data.v._rev) {
|
|
153
|
+
delete data.v._rev;
|
|
154
|
+
}
|
|
155
|
+
associationData.push(data.v);
|
|
156
|
+
if (path) {
|
|
157
|
+
traversedPaths.push(data.p);
|
|
133
158
|
}
|
|
134
159
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
while ((completeDecodedData && completeDecodedData.length > 0) ||
|
|
139
|
-
(completeVertexFields && completeVertexFields.length > 0)) {
|
|
140
|
-
if (completeDecodedData.length > 0) {
|
|
141
|
-
const partDoc = completeDecodedData.splice(0, 1000);
|
|
142
|
-
this.logger.debug('Writing Buffer Chunk', partDoc);
|
|
143
|
-
queryResult.data = { value: Buffer.from(JSON.stringify(partDoc)) };
|
|
160
|
+
if (!_.isEmpty(associationData)) {
|
|
161
|
+
// associated entity data, encoding before pushing data
|
|
162
|
+
traversalStream.push({ data: { value: Buffer.from(JSON.stringify(associationData)) } });
|
|
144
163
|
}
|
|
145
|
-
|
|
146
|
-
|
|
164
|
+
// paths
|
|
165
|
+
if (!_.isEmpty(traversedPaths)) {
|
|
166
|
+
// traversed paths, encoding before pushing paths
|
|
167
|
+
traversalStream.push({ paths: { value: Buffer.from(JSON.stringify(traversedPaths)) } });
|
|
147
168
|
}
|
|
148
|
-
yield call.write(queryResult);
|
|
149
|
-
this.logger.debug('Buffer chunk written successfully');
|
|
150
|
-
}
|
|
151
|
-
if (queryResult && queryResult.paths && queryResult.paths.value) {
|
|
152
|
-
yield call.write(queryResult);
|
|
153
169
|
}
|
|
154
|
-
this.logger.debug('Invoking end from traversal');
|
|
155
|
-
yield call.end();
|
|
156
|
-
this.logger.debug('Traversal request ended');
|
|
157
170
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
}
|
|
171
|
+
traversalStream.push({ operation_status: { code: 200, message: 'success' } });
|
|
172
|
+
traversalStream.push(null);
|
|
173
|
+
traversalStream.pipe(call.request);
|
|
174
|
+
this.logger.debug('Traversal request ended');
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
this.logger.error('Error caught executing traversal', { err: err.message });
|
|
179
|
+
this.logger.error('Error stack', err);
|
|
180
|
+
return {
|
|
181
|
+
operation_status: { code: err.code ? err.code : 500, message: err.message }
|
|
182
|
+
};
|
|
183
|
+
}
|
|
164
184
|
}
|
|
165
185
|
/**
|
|
166
186
|
* marshall the data
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphResourcesServiceBase.js","sourceRoot":"","sources":["../../src/core/GraphResourcesServiceBase.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GraphResourcesServiceBase.js","sourceRoot":"","sources":["../../src/core/GraphResourcesServiceBase.ts"],"names":[],"mappings":"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"}
|