Skip to content

Commit 5cabc73

Browse files
committed
Fixes #1417
1 parent b433fb9 commit 5cabc73

File tree

2 files changed

+80
-13
lines changed

2 files changed

+80
-13
lines changed

spec/transform.spec.js

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// These tests are unit tests designed to only test transform.js.
2+
"use strict";
23

3-
var transform = require('../src/transform');
4+
let transform = require('../src/transform');
5+
let dd = require('deep-diff');
46

57
var dummySchema = {
68
data: {},
@@ -150,14 +152,28 @@ describe('untransformObject', () => {
150152
done();
151153
});
152154

153-
it('nested array', (done) => {
154-
var input = {arr: [{_testKey: 'testValue' }]};
155-
var output = transform.untransformObject(dummySchema, null, input);
156-
expect(Array.isArray(output.arr)).toEqual(true);
157-
expect(output.arr).toEqual([{ _testKey: 'testValue'}]);
158-
done();
159-
});
155+
it('nested array', (done) => {
156+
var input = {arr: [{_testKey: 'testValue' }]};
157+
var output = transform.untransformObject(dummySchema, null, input);
158+
expect(Array.isArray(output.arr)).toEqual(true);
159+
expect(output.arr).toEqual([{ _testKey: 'testValue'}]);
160+
done();
161+
});
160162

163+
it('untransforms objects containing nested special keys', done => {
164+
let input = {array: [{
165+
_id: "Test ID",
166+
_hashed_password: "I Don't know why you would name a key this, but if you do it should work",
167+
_tombstone: {
168+
_updated_at: "I'm sure people will nest keys like this",
169+
_acl: 7,
170+
_id: {}
171+
},
172+
}]}
173+
let output = transform.untransformObject(dummySchema, null, input);
174+
expect(dd(output, input)).toEqual(undefined);
175+
done();
176+
});
161177
});
162178

163179
describe('transformKey', () => {

src/transform.js

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -630,10 +630,9 @@ function untransformObject(schema, className, mongoObject, isNestedObject = fals
630630
if (mongoObject === null) {
631631
return null;
632632
}
633-
634633
if (mongoObject instanceof Array) {
635-
return mongoObject.map((o) => {
636-
return untransformObject(schema, className, o, true);
634+
return mongoObject.map(arrayEntry => {
635+
return untransformObject(schema, className, arrayEntry, true);
637636
});
638637
}
639638

@@ -647,31 +646,84 @@ function untransformObject(schema, className, mongoObject, isNestedObject = fals
647646

648647
var restObject = untransformACL(mongoObject);
649648
for (var key in mongoObject) {
649+
// TODO: This could use some cleanup. Default case handling still needs to happen for some nested keys.
650650
switch(key) {
651651
case '_id':
652+
if (isNestedObject) {
653+
restObject[key] = untransformObject(schema, className, mongoObject[key], true);
654+
break;
655+
}
652656
restObject['objectId'] = '' + mongoObject[key];
653657
break;
654658
case '_hashed_password':
659+
if (isNestedObject) {
660+
restObject[key] = untransformObject(schema, className, mongoObject[key], true);
661+
break;
662+
}
655663
restObject['password'] = mongoObject[key];
656664
break;
657665
case '_acl':
666+
if (isNestedObject) {
667+
restObject[key] = untransformObject(schema, className, mongoObject[key], true);
668+
break;
669+
}
658670
case '_email_verify_token':
671+
if (isNestedObject) {
672+
restObject[key] = untransformObject(schema, className, mongoObject[key], true);
673+
break;
674+
}
659675
case '_perishable_token':
676+
if (isNestedObject) {
677+
restObject[key] = untransformObject(schema, className, mongoObject[key], true);
678+
break;
679+
}
660680
case '_tombstone':
681+
if (isNestedObject) {
682+
restObject[key] = untransformObject(schema, className, mongoObject[key], true);
683+
break;
684+
}
661685
break;
662686
case '_session_token':
687+
if (isNestedObject) {
688+
restObject[key] = untransformObject(schema, className, mongoObject[key], true);
689+
break;
690+
}
663691
restObject['sessionToken'] = mongoObject[key];
664692
break;
665693
case 'updatedAt':
694+
if (isNestedObject) {
695+
restObject[key] = untransformObject(schema, className, mongoObject[key], true);
696+
break;
697+
}
666698
case '_updated_at':
699+
if (isNestedObject) {
700+
restObject[key] = untransformObject(schema, className, mongoObject[key], true);
701+
break;
702+
}
667703
restObject['updatedAt'] = Parse._encode(new Date(mongoObject[key])).iso;
668704
break;
669705
case 'createdAt':
706+
if (isNestedObject) {
707+
restObject[key] = untransformObject(schema, className, mongoObject[key], true);
708+
break;
709+
}
670710
case '_created_at':
711+
if (isNestedObject) {
712+
restObject[key] = untransformObject(schema, className, mongoObject[key], true);
713+
break;
714+
}
671715
restObject['createdAt'] = Parse._encode(new Date(mongoObject[key])).iso;
672716
break;
673717
case 'expiresAt':
718+
if (isNestedObject) {
719+
restObject[key] = untransformObject(schema, className, mongoObject[key], true);
720+
break;
721+
}
674722
case '_expiresAt':
723+
if (isNestedObject) {
724+
restObject[key] = untransformObject(schema, className, mongoObject[key], true);
725+
break;
726+
}
675727
restObject['expiresAt'] = Parse._encode(new Date(mongoObject[key]));
676728
break;
677729
default:
@@ -728,8 +780,7 @@ function untransformObject(schema, className, mongoObject, isNestedObject = fals
728780
break;
729781
}
730782
}
731-
restObject[key] = untransformObject(schema, className,
732-
mongoObject[key], true);
783+
restObject[key] = untransformObject(schema, className, mongoObject[key], true);
733784
}
734785
}
735786

0 commit comments

Comments
 (0)