From 2fa29e692ddabfe2dcd67fc15a29d1428973fe4e Mon Sep 17 00:00:00 2001 From: Florent Vilmart Date: Tue, 6 Dec 2016 16:42:54 -0500 Subject: [PATCH] Fixes SchemaController data for Volatile Classes (#3171) * Reproduction for the issue * Ensures Volatile classes and other schema share the same structure --- spec/Schema.spec.js | 32 +++++++++++++++++++++++++++++ src/Controllers/SchemaController.js | 14 +++++++------ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/spec/Schema.spec.js b/spec/Schema.spec.js index 0f23a108a8c..ca7b1fb65a3 100644 --- a/spec/Schema.spec.js +++ b/spec/Schema.spec.js @@ -880,6 +880,38 @@ describe('SchemaController', () => { done(); }); }); + + it('properly handles volatile _Schemas', done => { + function validateSchemaStructure(schema) { + expect(schema.hasOwnProperty('className')).toBe(true); + expect(schema.hasOwnProperty('fields')).toBe(true); + expect(schema.hasOwnProperty('classLevelPermissions')).toBe(true); + } + function validateSchemaDataStructure(schemaData) { + Object.keys(schemaData).forEach(className => { + let schema = schemaData[className]; + // Hooks has className... + if (className != '_Hooks') { + expect(schema.hasOwnProperty('className')).toBe(false); + } + expect(schema.hasOwnProperty('fields')).toBe(false); + expect(schema.hasOwnProperty('classLevelPermissions')).toBe(false); + }); + } + let schema; + config.database.loadSchema().then(s => { + schema = s; + return schema.getOneSchema('_User', false); + }).then(userSchema => { + validateSchemaStructure(userSchema); + validateSchemaDataStructure(schema.data); + return schema.getOneSchema('_PushStatus', true); + }).then(pushStatusSchema => { + validateSchemaStructure(pushStatusSchema); + validateSchemaDataStructure(schema.data); + done(); + }); + }); }); describe('Class Level Permissions for requiredAuth', () => { diff --git a/src/Controllers/SchemaController.js b/src/Controllers/SchemaController.js index 21d252c6075..19e83b8ca03 100644 --- a/src/Controllers/SchemaController.js +++ b/src/Controllers/SchemaController.js @@ -346,11 +346,9 @@ export default class SchemaController { // Inject the in-memory classes volatileClasses.forEach(className => { - this.data[className] = injectDefaultSchema({ - className, - fields: {}, - classLevelPermissions: {} - }); + let schema = injectDefaultSchema({ className }); + this.data[className] = schema.fields; + this.perms[className] = schema.classLevelPermissions; }); delete this.reloadDataPromise; }, (err) => { @@ -388,7 +386,11 @@ export default class SchemaController { } return promise.then(() => { if (allowVolatileClasses && volatileClasses.indexOf(className) > -1) { - return Promise.resolve(this.data[className]); + return Promise.resolve({ + className, + fields: this.data[className], + classLevelPermissions: this.perms[className] + }); } return this._cache.getOneSchema(className).then((cached) => { if (cached && !options.clearCache) {