From 03911761d0a331b41b8333c5b8d21c612f2de4cb Mon Sep 17 00:00:00 2001 From: steven-supersolid Date: Thu, 15 Feb 2018 12:24:40 +0000 Subject: [PATCH 1/4] Modify fields instead of creating new object and copying fields --- src/Controllers/SchemaController.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Controllers/SchemaController.js b/src/Controllers/SchemaController.js index 2233886ef6..780cee8b3a 100644 --- a/src/Controllers/SchemaController.js +++ b/src/Controllers/SchemaController.js @@ -315,12 +315,8 @@ const convertAdapterSchemaToParseSchema = ({...schema}) => { const injectDefaultSchema = ({className, fields, classLevelPermissions, indexes}: Schema) => { const defaultSchema: Schema = { className, - fields: { - ...defaultColumns._Default, - ...(defaultColumns[className] || {}), - ...fields, - }, - classLevelPermissions, + fields: Object.assign(fields || {}, defaultColumns._Default, defaultColumns[className] || {}), + classLevelPermissions }; if (indexes && Object.keys(indexes).length !== 0) { defaultSchema.indexes = indexes; From ef829293d526714fe9d1354ec650fdef512b541b Mon Sep 17 00:00:00 2001 From: steven-supersolid Date: Fri, 16 Feb 2018 10:14:49 +0000 Subject: [PATCH 2/4] Remove redundant call to injectDefaultSchema. Fix modification of defaultColumns._Audience --- src/Controllers/SchemaController.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Controllers/SchemaController.js b/src/Controllers/SchemaController.js index 780cee8b3a..e7e0d24cdf 100644 --- a/src/Controllers/SchemaController.js +++ b/src/Controllers/SchemaController.js @@ -326,26 +326,26 @@ const injectDefaultSchema = ({className, fields, classLevelPermissions, indexes} const _HooksSchema = {className: "_Hooks", fields: defaultColumns._Hooks}; const _GlobalConfigSchema = { className: "_GlobalConfig", fields: defaultColumns._GlobalConfig } -const _PushStatusSchema = convertSchemaToAdapterSchema(injectDefaultSchema({ +const _PushStatusSchema = convertSchemaToAdapterSchema({ className: "_PushStatus", fields: {}, classLevelPermissions: {} -})); -const _JobStatusSchema = convertSchemaToAdapterSchema(injectDefaultSchema({ +}); +const _JobStatusSchema = convertSchemaToAdapterSchema({ className: "_JobStatus", fields: {}, classLevelPermissions: {} -})); -const _JobScheduleSchema = convertSchemaToAdapterSchema(injectDefaultSchema({ +}); +const _JobScheduleSchema = convertSchemaToAdapterSchema({ className: "_JobSchedule", fields: {}, classLevelPermissions: {} -})); -const _AudienceSchema = convertSchemaToAdapterSchema(injectDefaultSchema({ +}); +const _AudienceSchema = convertSchemaToAdapterSchema({ className: "_Audience", - fields: defaultColumns._Audience, + fields: {}, classLevelPermissions: {} -})); +}); const VolatileClassesSchemas = [_HooksSchema, _JobStatusSchema, _JobScheduleSchema, _PushStatusSchema, _GlobalConfigSchema, _AudienceSchema]; const dbTypeMatchesObjectType = (dbType: SchemaField | string, objectType: SchemaField) => { From 1a6e3c11e50552fef662fed765279577e6473d61 Mon Sep 17 00:00:00 2001 From: steven-supersolid Date: Mon, 19 Feb 2018 10:06:08 +0000 Subject: [PATCH 3/4] Revert change to injectDefaultSchema. Remove additional call to injectDefaultSchema in reloadData --- src/Controllers/SchemaController.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Controllers/SchemaController.js b/src/Controllers/SchemaController.js index e7e0d24cdf..d559e67210 100644 --- a/src/Controllers/SchemaController.js +++ b/src/Controllers/SchemaController.js @@ -315,7 +315,11 @@ const convertAdapterSchemaToParseSchema = ({...schema}) => { const injectDefaultSchema = ({className, fields, classLevelPermissions, indexes}: Schema) => { const defaultSchema: Schema = { className, - fields: Object.assign(fields || {}, defaultColumns._Default, defaultColumns[className] || {}), + fields: { + ...defaultColumns._Default, + ...(defaultColumns[className] || {}), + ...fields, + }, classLevelPermissions }; if (indexes && Object.keys(indexes).length !== 0) { @@ -403,7 +407,7 @@ export default class SchemaController { const perms = {}; const indexes = {}; allSchemas.forEach(schema => { - data[schema.className] = injectDefaultSchema(schema).fields; + data[schema.className] = schema.fields; perms[schema.className] = schema.classLevelPermissions; indexes[schema.className] = schema.indexes; }); From cbfb976e3d537ec450d39913003848d709eb0fff Mon Sep 17 00:00:00 2001 From: steven-supersolid Date: Wed, 25 Apr 2018 08:30:49 +0100 Subject: [PATCH 4/4] Add test for modifying schema. Demonstrate failure of other tests when freezing schema fields (do not merge) --- spec/Schema.spec.js | 14 +++++++++++++- src/Controllers/SchemaController.js | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/spec/Schema.spec.js b/spec/Schema.spec.js index 986740650b..cebcabacfe 100644 --- a/spec/Schema.spec.js +++ b/spec/Schema.spec.js @@ -1307,4 +1307,16 @@ describe('Class Level Permissions for requiredAuth', () => { done.fail(e); }); }); -}) + + it('is not possible to modify the loaded schema', (done) => { + config.database.loadSchema().then((schemaController) => { + return schemaController.getOneSchema('_User'); + }).then((schema) => { + schema.fields.addedField = 'added'; + }).then(() => { + done.fail('should not succeed'); + }).catch(() => { + done(); + }); + }); +}); diff --git a/src/Controllers/SchemaController.js b/src/Controllers/SchemaController.js index d559e67210..1f1c5ce853 100644 --- a/src/Controllers/SchemaController.js +++ b/src/Controllers/SchemaController.js @@ -407,6 +407,7 @@ export default class SchemaController { const perms = {}; const indexes = {}; allSchemas.forEach(schema => { + Object.freeze(schema.fields); data[schema.className] = schema.fields; perms[schema.className] = schema.classLevelPermissions; indexes[schema.className] = schema.indexes;