Skip to content

Commit

Permalink
fix: Nested objects are encoded incorrectly for MongoDB (#8209)
Browse files Browse the repository at this point in the history
BREAKING CHANGE: Nested objects are now properly stored in the database using JSON serialization; previously, due to a bug only top-level objects were serialized, but nested objects were saved as raw JSON; for example, a nested `Date` object was saved as a JSON object like `{ "__type": "Date", "iso": "2020-01-01T00:00:00.000Z" }` instead of its serialized representation `2020-01-01T00:00:00.000Z` (#8209)
  • Loading branch information
dblythy authored Dec 20, 2022
1 parent 6323368 commit 1412666
Showing 2 changed files with 41 additions and 0 deletions.
38 changes: 38 additions & 0 deletions spec/MongoStorageAdapter.spec.js
Original file line number Diff line number Diff line change
@@ -212,6 +212,44 @@ describe_only_db('mongo')('MongoStorageAdapter', () => {
});
});

it('handles nested dates', async () => {
await new Parse.Object('MyClass', {
foo: {
test: {
date: new Date(),
},
},
bar: {
date: new Date(),
},
date: new Date(),
}).save();
const adapter = Config.get(Parse.applicationId).database.adapter;
const [object] = await adapter._rawFind('MyClass', {});
expect(object.date instanceof Date).toBeTrue();
expect(object.bar.date instanceof Date).toBeTrue();
expect(object.foo.test.date instanceof Date).toBeTrue();
});

it('handles nested dates in array ', async () => {
await new Parse.Object('MyClass', {
foo: {
test: {
date: [new Date()],
},
},
bar: {
date: [new Date()],
},
date: [new Date()],
}).save();
const adapter = Config.get(Parse.applicationId).database.adapter;
const [object] = await adapter._rawFind('MyClass', {});
expect(object.date[0] instanceof Date).toBeTrue();
expect(object.bar.date[0] instanceof Date).toBeTrue();
expect(object.foo.test.date[0] instanceof Date).toBeTrue();
});

it('handles updating a single object with array, object date', done => {
const adapter = new MongoStorageAdapter({ uri: databaseURI });

3 changes: 3 additions & 0 deletions src/Adapters/Storage/Mongo/MongoTransform.js
Original file line number Diff line number Diff line change
@@ -1014,6 +1014,9 @@ function mapValues(object, iterator) {
const result = {};
Object.keys(object).forEach(key => {
result[key] = iterator(object[key]);
if (result[key] && JSON.stringify(result[key]).includes(`"__type"`)) {
result[key] = mapValues(object[key], iterator);
}
});
return result;
}

0 comments on commit 1412666

Please sign in to comment.