Fixes #1417
* Fixes #1417 * Cleanup * Perf improvement * Hoist constant array * Improve tests
This commit is contained in:
@@ -1,6 +1,8 @@
|
|||||||
// These tests are unit tests designed to only test transform.js.
|
// These tests are unit tests designed to only test transform.js.
|
||||||
|
"use strict";
|
||||||
|
|
||||||
var transform = require('../src/transform');
|
let transform = require('../src/transform');
|
||||||
|
let dd = require('deep-diff');
|
||||||
|
|
||||||
var dummySchema = {
|
var dummySchema = {
|
||||||
data: {},
|
data: {},
|
||||||
@@ -158,6 +160,22 @@ describe('untransformObject', () => {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('untransforms objects containing nested special keys', done => {
|
||||||
|
let input = {array: [{
|
||||||
|
_id: "Test ID",
|
||||||
|
_hashed_password: "I Don't know why you would name a key this, but if you do it should work",
|
||||||
|
_tombstone: {
|
||||||
|
_updated_at: "I'm sure people will nest keys like this",
|
||||||
|
_acl: 7,
|
||||||
|
_id: { someString: "str", someNumber: 7},
|
||||||
|
regularKey: { moreContents: [1, 2, 3] },
|
||||||
|
},
|
||||||
|
regularKey: "some data",
|
||||||
|
}]}
|
||||||
|
let output = transform.untransformObject(dummySchema, null, input);
|
||||||
|
expect(dd(output, input)).toEqual(undefined);
|
||||||
|
done();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('transformKey', () => {
|
describe('transformKey', () => {
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import log from './logger';
|
import log from './logger';
|
||||||
|
import _ from 'lodash';
|
||||||
var mongodb = require('mongodb');
|
var mongodb = require('mongodb');
|
||||||
var Parse = require('parse/node').Parse;
|
var Parse = require('parse/node').Parse;
|
||||||
|
|
||||||
@@ -149,8 +150,6 @@ export function transformKeyValue(schema, className, restKey, restValue, options
|
|||||||
throw 'There was a problem transforming an ACL.';
|
throw 'There was a problem transforming an ACL.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Handle arrays
|
// Handle arrays
|
||||||
if (restValue instanceof Array) {
|
if (restValue instanceof Array) {
|
||||||
if (options.query) {
|
if (options.query) {
|
||||||
@@ -613,6 +612,21 @@ function transformUpdateOperator(operator, flatten) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const specialKeysForUntransform = [
|
||||||
|
'_id',
|
||||||
|
'_hashed_password',
|
||||||
|
'_acl',
|
||||||
|
'_email_verify_token',
|
||||||
|
'_perishable_token',
|
||||||
|
'_tombstone',
|
||||||
|
'_session_token',
|
||||||
|
'updatedAt',
|
||||||
|
'_updated_at',
|
||||||
|
'createdAt',
|
||||||
|
'_created_at',
|
||||||
|
'expiresAt',
|
||||||
|
'_expiresAt',
|
||||||
|
];
|
||||||
|
|
||||||
// Converts from a mongo-format object to a REST-format object.
|
// Converts from a mongo-format object to a REST-format object.
|
||||||
// Does not strip out anything based on a lack of authentication.
|
// Does not strip out anything based on a lack of authentication.
|
||||||
@@ -630,10 +644,9 @@ function untransformObject(schema, className, mongoObject, isNestedObject = fals
|
|||||||
if (mongoObject === null) {
|
if (mongoObject === null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mongoObject instanceof Array) {
|
if (mongoObject instanceof Array) {
|
||||||
return mongoObject.map((o) => {
|
return mongoObject.map(arrayEntry => {
|
||||||
return untransformObject(schema, className, o, true);
|
return untransformObject(schema, className, arrayEntry, true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -647,6 +660,10 @@ function untransformObject(schema, className, mongoObject, isNestedObject = fals
|
|||||||
|
|
||||||
var restObject = untransformACL(mongoObject);
|
var restObject = untransformACL(mongoObject);
|
||||||
for (var key in mongoObject) {
|
for (var key in mongoObject) {
|
||||||
|
if (isNestedObject && _.includes(specialKeysForUntransform, key)) {
|
||||||
|
restObject[key] = untransformObject(schema, className, mongoObject[key], true);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
switch(key) {
|
switch(key) {
|
||||||
case '_id':
|
case '_id':
|
||||||
restObject['objectId'] = '' + mongoObject[key];
|
restObject['objectId'] = '' + mongoObject[key];
|
||||||
@@ -728,8 +745,7 @@ function untransformObject(schema, className, mongoObject, isNestedObject = fals
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
restObject[key] = untransformObject(schema, className,
|
restObject[key] = untransformObject(schema, className, mongoObject[key], true);
|
||||||
mongoObject[key], true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user