From fda0cce3f6dd760709ad6fb111363cdc9783c1f2 Mon Sep 17 00:00:00 2001 From: Nikita Golovin Date: Sun, 17 Jan 2021 08:25:57 +0300 Subject: [PATCH 1/4] Parse LiveQuery Server. Supporting patterns in classNames. --- src/Controllers/LiveQueryController.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Controllers/LiveQueryController.js b/src/Controllers/LiveQueryController.js index 3b239a8c30..dd83ad024a 100644 --- a/src/Controllers/LiveQueryController.js +++ b/src/Controllers/LiveQueryController.js @@ -43,7 +43,13 @@ export class LiveQueryController { } hasLiveQuery(className: string): boolean { - return this.classNames.has(className); + for (const name of this.classNames) { + const exp = new RegExp("^" + name + "$"); + if (exp.test(className)) { + return true; + } + } + return false; } _makePublisherRequest(currentObject: any, originalObject: any, classLevelPermissions: ?any): any { From 7c2c859105e91790220f1649d6b8c7eb73123667 Mon Sep 17 00:00:00 2001 From: Nikita Golovin Date: Tue, 19 Jan 2021 02:06:52 +0300 Subject: [PATCH 2/4] Parse LiveQuery Server. Supporting patterns in classNames. Small optimisation. --- src/Controllers/LiveQueryController.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Controllers/LiveQueryController.js b/src/Controllers/LiveQueryController.js index dd83ad024a..ea71ade033 100644 --- a/src/Controllers/LiveQueryController.js +++ b/src/Controllers/LiveQueryController.js @@ -9,7 +9,9 @@ export class LiveQueryController { if (!config || !config.classNames) { this.classNames = new Set(); } else if (config.classNames instanceof Array) { - this.classNames = new Set(config.classNames); + const classNames = config.classNames + .map(name => new RegExp("^" + name + "$")); + this.classNames = new Set(classNames); } else { throw 'liveQuery.classes should be an array of string'; } @@ -44,8 +46,7 @@ export class LiveQueryController { hasLiveQuery(className: string): boolean { for (const name of this.classNames) { - const exp = new RegExp("^" + name + "$"); - if (exp.test(className)) { + if (name.test(className)) { return true; } } From d419e855a3220a173ef4c5ee23a2141099680bbc Mon Sep 17 00:00:00 2001 From: Nikita Golovin Date: Tue, 19 Jan 2021 23:50:21 +0300 Subject: [PATCH 3/4] Parse LiveQuery Server. Supporting patterns in classNames. Adding info to changelog. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 251f179237..3a12739f78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ ___ - NEW: Added convenience method Parse.Cloud.sendEmail(...) to send email via email adapter in Cloud Code. [#7089](https://github.com/parse-community/parse-server/pull/7089). Thanks to [dblythy](https://github.com/dblythy) - FIX: Winston Logger interpolating stdout to console [#7114](https://github.com/parse-community/parse-server/pull/7114). Thanks to [dplewis](https://github.com/dplewis) - NEW: LiveQuery support for $and, $nor, $containedBy, $geoWithin, $geoIntersects queries [#7113](https://github.com/parse-community/parse-server/pull/7113). Thanks to [dplewis](https://github.com/dplewis) +- NEW: Supporting patterns in LiveQuery server's config parameter `classNames` [#7131](https://github.com/parse-community/parse-server/pull/7131). Thanks to [Nes-si](https://github.com/Nes-si) ### 4.5.0 [Full Changelog](https://github.com/parse-community/parse-server/compare/4.4.0...4.5.0) From 1772e798f54d6f34cc9cf1845e5bce625fa9cf75 Mon Sep 17 00:00:00 2001 From: Nikita Golovin Date: Wed, 20 Jan 2021 00:06:19 +0300 Subject: [PATCH 4/4] Parse LiveQuery Server. Supporting patterns in classNames. Test case. --- spec/ParseLiveQuery.spec.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/spec/ParseLiveQuery.spec.js b/spec/ParseLiveQuery.spec.js index be2da8c866..fa259785ee 100644 --- a/spec/ParseLiveQuery.spec.js +++ b/spec/ParseLiveQuery.spec.js @@ -56,6 +56,29 @@ describe('ParseLiveQuery', function () { await object.save(); }); + it('can use patterns in className', async done => { + await reconfigureServer({ + liveQuery: { + classNames: ['Test.*'], + }, + startLiveQueryServer: true, + verbose: false, + silent: true, + }); + const object = new TestObject(); + await object.save(); + + const query = new Parse.Query(TestObject); + query.equalTo('objectId', object.id); + const subscription = await query.subscribe(); + subscription.on('update', object => { + expect(object.get('foo')).toBe('bar'); + done(); + }); + object.set({ foo: 'bar' }); + await object.save(); + }); + it('expect afterEvent create', async done => { await reconfigureServer({ liveQuery: {