Skip to content

Commit 1ae5c56

Browse files
committed
Added beforeUnsubscribe Trigger
1 parent 129f7bf commit 1ae5c56

File tree

4 files changed

+90
-3
lines changed

4 files changed

+90
-3
lines changed

spec/ParseLiveQuery.spec.js

+32
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,38 @@ describe('ParseLiveQuery', function () {
645645
await object.save();
646646
});
647647

648+
it('can handle select beforeUnsubscribe trigger', async done => {
649+
await reconfigureServer({
650+
liveQuery: {
651+
classNames: ['TestObject'],
652+
},
653+
startLiveQueryServer: true,
654+
verbose: false,
655+
silent: true,
656+
});
657+
658+
Parse.Cloud.beforeSubscribe(TestObject, request => {
659+
expect(request.requestId).toBe(1);
660+
});
661+
662+
Parse.Cloud.beforeUnsubscribe(TestObject, request => {
663+
expect(request.requestId).toBe(1);
664+
done();
665+
});
666+
667+
const object = new TestObject();
668+
await object.save();
669+
670+
const query = new Parse.Query(TestObject);
671+
query.equalTo('objectId', object.id);
672+
const subscription = await query.subscribe();
673+
674+
object.set({ foo: 'bar', yolo: 'abc' });
675+
await object.save();
676+
677+
await subscription.unsubscribe();
678+
});
679+
648680
it('LiveQuery with ACL', async () => {
649681
await reconfigureServer({
650682
liveQuery: {

src/LiveQuery/ParseLiveQueryServer.js

+17-3
Original file line numberDiff line numberDiff line change
@@ -792,7 +792,7 @@ class ParseLiveQueryServer {
792792
this._handleSubscribe(parseWebsocket, request);
793793
}
794794

795-
_handleUnsubscribe(parseWebsocket: any, request: any, notifyClient: boolean = true): any {
795+
async _handleUnsubscribe(parseWebsocket: any, request: any, notifyClient: boolean = true): any {
796796
// If we can not find this client, return error to client
797797
if (!Object.prototype.hasOwnProperty.call(parseWebsocket, 'clientId')) {
798798
Client.pushError(
@@ -839,11 +839,25 @@ class ParseLiveQueryServer {
839839
return;
840840
}
841841

842+
const subscription = subscriptionInfo.subscription;
843+
const className = subscription.className;
844+
const trigger = getTrigger(className, 'beforeUnsubscribe', Parse.applicationId);
845+
if (trigger) {
846+
const auth = await this.getAuthFromClient(client, request.requestId, request.sessionToken);
847+
if (auth && auth.user) {
848+
request.user = auth.user;
849+
}
850+
851+
request.sessionToken = subscriptionInfo.sessionToken;
852+
request.useMasterKey = client.hasMasterKey;
853+
request.installationId = client.installationId;
854+
855+
await runTrigger(trigger, `beforeUnsubscribe.${className}`, request, auth);
856+
}
857+
842858
// Remove subscription from client
843859
client.deleteSubscriptionInfo(requestId);
844860
// Remove client from subscription
845-
const subscription = subscriptionInfo.subscription;
846-
const className = subscription.className;
847861
subscription.deleteClientSubscription(parseWebsocket.clientId, requestId);
848862
// If there is no client which is subscribing this subscription, remove it from subscriptions
849863
const classSubscriptions = this.subscriptions.get(className);

src/cloud-code/Parse.Cloud.js

+40
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,46 @@ ParseCloud.onLiveQueryEvent = function (handler) {
677677
triggers.addLiveQueryEventHandler(handler, Parse.applicationId);
678678
};
679679

680+
/**
681+
* Registers a before live query subscription function.
682+
*
683+
* **Available in Cloud Code only.**
684+
*
685+
* If you want to use beforeUnsubscribe for a predefined class in the Parse JavaScript SDK (e.g. {@link Parse.User}), you should pass the class itself and not the String for arg1.
686+
* ```
687+
* Parse.Cloud.beforeUnsubscribe('MyCustomClass', (request) => {
688+
* // code here
689+
* }, (request) => {
690+
* // validation code here
691+
* });
692+
*
693+
* Parse.Cloud.beforeUnsubscribe(Parse.User, (request) => {
694+
* // code here
695+
* }, { ...validationObject });
696+
*```
697+
*
698+
* @method beforeUnsubscribe
699+
* @name Parse.Cloud.beforeUnsubscribe
700+
* @param {(String|Parse.Object)} arg1 The Parse.Object subclass to register the before subscription function for. This can instead be a String that is the className of the subclass.
701+
* @param {Function} func The function to run before a subscription. This function can be async and should take one parameter, a {@link Parse.Cloud.TriggerRequest}.
702+
* @param {(Object|Function)} validator An optional function to help validating cloud code. This function can be an async function and should take one parameter a {@link Parse.Cloud.TriggerRequest}, or a {@link Parse.Cloud.ValidatorObject}.
703+
*/
704+
ParseCloud.beforeUnsubscribe = function (parseClass, handler, validationHandler) {
705+
validateValidator(validationHandler);
706+
var className = getClassName(parseClass);
707+
triggers.addTrigger(
708+
triggers.Types.beforeUnsubscribe,
709+
className,
710+
handler,
711+
Parse.applicationId,
712+
validationHandler
713+
);
714+
};
715+
716+
ParseCloud.onLiveQueryEvent = function (handler) {
717+
triggers.addLiveQueryEventHandler(handler, Parse.applicationId);
718+
};
719+
680720
/**
681721
* Registers an after live query server event function.
682722
*

src/triggers.js

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export const Types = {
1818
afterDeleteFile: 'afterDeleteFile',
1919
beforeConnect: 'beforeConnect',
2020
beforeSubscribe: 'beforeSubscribe',
21+
beforeUnsubscribe: 'beforeUnsubscribe',
2122
afterEvent: 'afterEvent',
2223
};
2324

0 commit comments

Comments
 (0)