Skip to content

Commit fac7ea4

Browse files
authored
fix(export): flattened fields are now correctly exported (#751)
1 parent e88cf44 commit fac7ea4

File tree

5 files changed

+419
-149
lines changed

5 files changed

+419
-149
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"dependencies": {
2828
"@babel/runtime": "7.15.4",
2929
"bluebird": "2.9.25",
30-
"forest-express": "9.3.2",
30+
"forest-express": "9.3.3",
3131
"http-errors": "1.7.2",
3232
"lodash": "4.17.21",
3333
"moment": "2.24.0",

src/services/flattener.js

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ module.exports = class Flattener {
103103
}
104104

105105
static requestUnflattener(request, response, next) {
106+
if (request.originalUrl.includes('.csv?')) {
107+
return next();
108+
}
109+
106110
try {
107111
if (!_.isEmpty(request.body?.data?.attributes)) {
108112
Flattener._unflattenAttributes(request);
@@ -117,8 +121,23 @@ module.exports = class Flattener {
117121
if (!_.isEmpty(request.query?.context)) {
118122
request.query.context.field = Flattener.unflattenFieldName(request.query.context.field);
119123
}
120-
next();
121-
} catch (error) { next(error); }
124+
return next();
125+
} catch (error) { return next(error); }
126+
}
127+
128+
static unflattenParams(params) {
129+
const unflattenedParams = JSON.parse(JSON.stringify(params));
130+
131+
if (unflattenedParams.fields) {
132+
Object.entries(unflattenedParams.fields).forEach(([collection, requestedFields]) => {
133+
if (Flattener._isFieldFlattened(requestedFields)) {
134+
unflattenedParams
135+
.fields[collection] = Flattener._unflattenCollectionFields(requestedFields);
136+
}
137+
});
138+
}
139+
140+
return unflattenedParams;
122141
}
123142

124143
validateOptions() {
@@ -249,4 +268,35 @@ module.exports = class Flattener {
249268
return flattenedReferences.filter((flattenedReference) =>
250269
collectionReferenceFields.some(({ field }) => field === flattenedReference));
251270
}
271+
272+
static generateNestedPathsFromModelName(modelName) {
273+
if (!modelName) return [];
274+
275+
const modelFields = (Interface.Schemas.schemas[modelName]?.fields || []);
276+
const flattenedFields = modelFields
277+
.filter((field) => this._isFieldFlattened(field.field) && !Array.isArray(field.type));
278+
279+
return flattenedFields.map((field) => this.splitOnSeparator(field.field));
280+
}
281+
282+
static flattenRecordsForExport(modelName, records) {
283+
const nestedPaths = this.generateNestedPathsFromModelName(modelName);
284+
285+
if (!nestedPaths || nestedPaths.length === 0) return records;
286+
287+
records.forEach((record) => {
288+
const flattenedFields = new Set();
289+
290+
nestedPaths.forEach((nestedPath) => {
291+
const flattenFieldName = nestedPath.join(FLATTEN_SEPARATOR);
292+
record[flattenFieldName] = nestedPath
293+
.reduce((embedded, attribute) => (embedded ? embedded[attribute] : null), record);
294+
flattenedFields.add(nestedPath[0]);
295+
});
296+
297+
flattenedFields.forEach((flattenedField) => delete record[flattenedField]);
298+
});
299+
300+
return records;
301+
}
252302
};

src/services/resources-exporter.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
const ResourcesGetter = require('./resources-getter');
1+
const Flattener = require('./flattener');
22
const HasManyGetter = require('./has-many-getter');
3+
const ResourcesGetter = require('./resources-getter');
34

45
const BATCH_INITIAL_PAGE = 1;
56
const BATCH_SIZE = 1000;
@@ -8,7 +9,7 @@ class ResourcesExporter {
89
constructor(model, options, params, association, user) {
910
this._model = model;
1011
this._options = options;
11-
this._params = params;
12+
this._params = Flattener.unflattenParams(params);
1213
this._association = association;
1314
this._user = user;
1415

0 commit comments

Comments
 (0)