From 902666a6d322be4135aa74ecd792d6f82f9b4275 Mon Sep 17 00:00:00 2001 From: dblythy Date: Mon, 27 Feb 2023 18:05:32 +1100 Subject: [PATCH 1/5] feat: allow updating Parse Server options dynamically --- spec/CloudCode.spec.js | 10 ++++------ src/ParseServer.js | 24 ++++++++++++++++++------ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js index c02999ad51..b437408a11 100644 --- a/spec/CloudCode.spec.js +++ b/spec/CloudCode.spec.js @@ -92,14 +92,12 @@ describe('Cloud Code', () => { }); }); - it('can get config', () => { - const config = Parse.Server; + it('can get and set config', () => { let currentConfig = Config.get('test'); - expect(Object.keys(config)).toEqual(Object.keys(currentConfig)); - config.silent = false; - Parse.Server = config; + expect(Object.keys(Parse.Server)).toEqual(Object.keys(currentConfig)); + Parse.Server.setSilent(['abc']); currentConfig = Config.get('test'); - expect(currentConfig.silent).toBeFalse(); + expect(currentConfig.silent).toEqual(['abc']); }); it('show warning on duplicate cloud functions', done => { diff --git a/src/ParseServer.js b/src/ParseServer.js index 04379ecfd3..07e0d7440c 100644 --- a/src/ParseServer.js +++ b/src/ParseServer.js @@ -45,6 +45,7 @@ import { SecurityRouter } from './Routers/SecurityRouter'; import CheckRunner from './Security/CheckRunner'; import Deprecator from './Deprecator/Deprecator'; import { DefinedSchemas } from './SchemaMigrations/DefinedSchemas'; +import { ParseServerOptions as ParseServerDefintions } from './Options/Definitions.js'; // Mutate the Parse object to add the Cloud Code handlers addParseCloud(); @@ -440,13 +441,24 @@ function addParseCloud() { const ParseCloud = require('./cloud-code/Parse.Cloud'); Object.defineProperty(Parse, 'Server', { get() { - return Config.get(Parse.applicationId); - }, - set(newVal) { - newVal.appId = Parse.applicationId; - Config.put(newVal); + const target = Config.get(Parse.applicationId); + const handler2 = { + get(obj, prop) { + if (prop.substring(0, 3) === 'set') { + const method = `${prop.charAt(3).toLowerCase()}${prop.substring(4, prop.length)}`; + if (!ParseServerDefintions[method]) { + throw `${method} is not a valid Parse Server option`; + } + return value => { + obj[method] = value; + Config.put(obj); + }; + } + return obj[prop]; + }, + }; + return new Proxy(target, handler2); }, - configurable: true, }); Object.assign(Parse.Cloud, ParseCloud); global.Parse = Parse; From e1dacd5d8f2abc3dc40484ae7522d9be75c509ee Mon Sep 17 00:00:00 2001 From: dblythy Date: Mon, 27 Feb 2023 18:28:47 +1100 Subject: [PATCH 2/5] add tests --- spec/CloudCode.spec.js | 10 +++++++++ src/ParseServer.js | 51 +++++++++++++++++++++++++----------------- 2 files changed, 41 insertions(+), 20 deletions(-) diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js index b437408a11..4af38a66d1 100644 --- a/spec/CloudCode.spec.js +++ b/spec/CloudCode.spec.js @@ -100,6 +100,16 @@ describe('Cloud Code', () => { expect(currentConfig.silent).toEqual(['abc']); }); + it('can set config with two args', () => { + Parse.Server.set('silent', ['abc']); + const currentConfig = Config.get('test'); + expect(currentConfig.silent).toEqual(['abc']); + }); + + it('can throw on invalid config', () => { + expect(() => Parse.Server.setFoo()).toThrow('foo is not a valid Parse Server option'); + }); + it('show warning on duplicate cloud functions', done => { const logger = require('../lib/logger').logger; spyOn(logger, 'warn').and.callFake(() => {}); diff --git a/src/ParseServer.js b/src/ParseServer.js index 07e0d7440c..79497c772b 100644 --- a/src/ParseServer.js +++ b/src/ParseServer.js @@ -439,27 +439,38 @@ class ParseServer { function addParseCloud() { const ParseCloud = require('./cloud-code/Parse.Cloud'); - Object.defineProperty(Parse, 'Server', { - get() { - const target = Config.get(Parse.applicationId); - const handler2 = { - get(obj, prop) { - if (prop.substring(0, 3) === 'set') { - const method = `${prop.charAt(3).toLowerCase()}${prop.substring(4, prop.length)}`; - if (!ParseServerDefintions[method]) { - throw `${method} is not a valid Parse Server option`; + if (!Parse.Server) { + Object.defineProperty(Parse, 'Server', { + get() { + const target = Config.get(Parse.applicationId); + const handler2 = { + get(obj, prop) { + if (prop.substring(0, 3) === 'set') { + const validMethod = method => { + if (!ParseServerDefintions[method]) { + throw `${method} is not a valid Parse Server option`; + } + }; + const assignValue = (key, value) => { + validMethod(key); + obj[key] = value; + Config.put(obj); + }; + if (prop.length === 3) { + return assignValue; + } + const method = `${prop.charAt(3).toLowerCase()}${prop.substring(4, prop.length)}`; + return value => { + return assignValue(method, value); + }; } - return value => { - obj[method] = value; - Config.put(obj); - }; - } - return obj[prop]; - }, - }; - return new Proxy(target, handler2); - }, - }); + return obj[prop]; + }, + }; + return new Proxy(target, handler2); + }, + }); + } Object.assign(Parse.Cloud, ParseCloud); global.Parse = Parse; } From c9ded7ffbd4ab673dac47b08d316f6254369dbae Mon Sep 17 00:00:00 2001 From: dblythy Date: Mon, 27 Feb 2023 18:30:40 +1100 Subject: [PATCH 3/5] Update ParseServer.js --- src/ParseServer.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/ParseServer.js b/src/ParseServer.js index 79497c772b..91f9c7221f 100644 --- a/src/ParseServer.js +++ b/src/ParseServer.js @@ -446,13 +446,10 @@ function addParseCloud() { const handler2 = { get(obj, prop) { if (prop.substring(0, 3) === 'set') { - const validMethod = method => { - if (!ParseServerDefintions[method]) { - throw `${method} is not a valid Parse Server option`; - } - }; const assignValue = (key, value) => { - validMethod(key); + if (!ParseServerDefintions[key]) { + throw `${key} is not a valid Parse Server option`; + } obj[key] = value; Config.put(obj); }; From 583f6494b1bcc67f4a7d0df41ab8da3877f644fc Mon Sep 17 00:00:00 2001 From: dblythy Date: Mon, 27 Feb 2023 18:31:24 +1100 Subject: [PATCH 4/5] Update ParseServer.js --- src/ParseServer.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/ParseServer.js b/src/ParseServer.js index 91f9c7221f..69b47a7efd 100644 --- a/src/ParseServer.js +++ b/src/ParseServer.js @@ -457,9 +457,7 @@ function addParseCloud() { return assignValue; } const method = `${prop.charAt(3).toLowerCase()}${prop.substring(4, prop.length)}`; - return value => { - return assignValue(method, value); - }; + return value => assignValue(method, value); } return obj[prop]; }, From 6160fb9d7b5b675c19d3b1a05ab3ac74825fd5d9 Mon Sep 17 00:00:00 2001 From: dblythy Date: Tue, 28 Feb 2023 15:28:01 +1100 Subject: [PATCH 5/5] revert --- spec/CloudCode.spec.js | 10 ++-------- src/Config.js | 9 +++++++++ src/ParseServer.js | 23 +---------------------- 3 files changed, 12 insertions(+), 30 deletions(-) diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js index 4af38a66d1..2dca57da08 100644 --- a/spec/CloudCode.spec.js +++ b/spec/CloudCode.spec.js @@ -95,19 +95,13 @@ describe('Cloud Code', () => { it('can get and set config', () => { let currentConfig = Config.get('test'); expect(Object.keys(Parse.Server)).toEqual(Object.keys(currentConfig)); - Parse.Server.setSilent(['abc']); - currentConfig = Config.get('test'); - expect(currentConfig.silent).toEqual(['abc']); - }); - - it('can set config with two args', () => { Parse.Server.set('silent', ['abc']); - const currentConfig = Config.get('test'); + currentConfig = Config.get('test'); expect(currentConfig.silent).toEqual(['abc']); }); it('can throw on invalid config', () => { - expect(() => Parse.Server.setFoo()).toThrow('foo is not a valid Parse Server option'); + expect(() => Parse.Server.set('foo', true)).toThrow('foo is not a valid Parse Server option'); }); it('show warning on duplicate cloud functions', done => { diff --git a/src/Config.js b/src/Config.js index 2e7ef389c7..ab954057ba 100644 --- a/src/Config.js +++ b/src/Config.js @@ -684,6 +684,15 @@ export class Config { ? this.pages.pagesEndpoint : 'apps'; } + + set(key, value) { + if (!ParseServerOptions[key]) { + throw `${key} is not a valid Parse Server option`; + } + this[key] = value; + Config.put(this); + return this; + } } export default Config; diff --git a/src/ParseServer.js b/src/ParseServer.js index 69b47a7efd..36a1a606d8 100644 --- a/src/ParseServer.js +++ b/src/ParseServer.js @@ -45,7 +45,6 @@ import { SecurityRouter } from './Routers/SecurityRouter'; import CheckRunner from './Security/CheckRunner'; import Deprecator from './Deprecator/Deprecator'; import { DefinedSchemas } from './SchemaMigrations/DefinedSchemas'; -import { ParseServerOptions as ParseServerDefintions } from './Options/Definitions.js'; // Mutate the Parse object to add the Cloud Code handlers addParseCloud(); @@ -442,27 +441,7 @@ function addParseCloud() { if (!Parse.Server) { Object.defineProperty(Parse, 'Server', { get() { - const target = Config.get(Parse.applicationId); - const handler2 = { - get(obj, prop) { - if (prop.substring(0, 3) === 'set') { - const assignValue = (key, value) => { - if (!ParseServerDefintions[key]) { - throw `${key} is not a valid Parse Server option`; - } - obj[key] = value; - Config.put(obj); - }; - if (prop.length === 3) { - return assignValue; - } - const method = `${prop.charAt(3).toLowerCase()}${prop.substring(4, prop.length)}`; - return value => assignValue(method, value); - } - return obj[prop]; - }, - }; - return new Proxy(target, handler2); + return Config.get(Parse.applicationId); }, }); }