Skip to content

Commit 21034a7

Browse files
committed
Added beforeUnsubscribe Trigger
1 parent 5188e69 commit 21034a7

File tree

3 files changed

+72
-3
lines changed

3 files changed

+72
-3
lines changed

src/LiveQuery/ParseLiveQueryServer.js

+27-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,35 @@ 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+
const parseQuery = new Parse.Query(className);
852+
parseQuery.withJSON(request.query);
853+
request.query = subscription.query;
854+
request.requestId = request.requestId;
855+
request.sessionToken = subscriptionInfo.sessionToken;
856+
request.useMasterKey = client.hasMasterKey;
857+
request.installationId = client.installationId;
858+
859+
await runTrigger(trigger, `beforeUnsubscribe.${className}`, request, auth);
860+
861+
const query = request.query.toJSON();
862+
if (query.keys) {
863+
query.fields = query.keys.split(',');
864+
}
865+
request.query = query;
866+
}
867+
842868
// Remove subscription from client
843869
client.deleteSubscriptionInfo(requestId);
844870
// Remove client from subscription
845-
const subscription = subscriptionInfo.subscription;
846-
const className = subscription.className;
847871
subscription.deleteClientSubscription(parseWebsocket.clientId, requestId);
848872
// If there is no client which is subscribing this subscription, remove it from subscriptions
849873
const classSubscriptions = this.subscriptions.get(className);

src/cloud-code/Parse.Cloud.js

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

680+
681+
682+
/**
683+
* Registers a before live query subscription function.
684+
*
685+
* **Available in Cloud Code only.**
686+
*
687+
* 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.
688+
* ```
689+
* Parse.Cloud.beforeUnsubscribe('MyCustomClass', (request) => {
690+
* // code here
691+
* }, (request) => {
692+
* // validation code here
693+
* });
694+
*
695+
* Parse.Cloud.beforeUnsubscribe(Parse.User, (request) => {
696+
* // code here
697+
* }, { ...validationObject });
698+
*```
699+
*
700+
* @method beforeUnsubscribe
701+
* @name Parse.Cloud.beforeUnsubscribe
702+
* @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.
703+
* @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}.
704+
* @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}.
705+
*/
706+
ParseCloud.beforeUnsubscribe = function (parseClass, handler, validationHandler) {
707+
validateValidator(validationHandler);
708+
var className = getClassName(parseClass);
709+
triggers.addTrigger(
710+
triggers.Types.beforeUnsubscribe,
711+
className,
712+
handler,
713+
Parse.applicationId,
714+
validationHandler
715+
);
716+
};
717+
718+
ParseCloud.onLiveQueryEvent = function (handler) {
719+
triggers.addLiveQueryEventHandler(handler, Parse.applicationId);
720+
};
721+
722+
723+
680724
/**
681725
* Registers an after live query server event function.
682726
*

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)