Before Connect + Before Subscribe help required (#6793)

* Before Connect + Before Subscribe #1

* Cleanup and Documentation

* Add E2E tests

* Bump parse to 2.15.0

Co-authored-by: Diamond Lewis <findlewis@gmail.com>
This commit is contained in:
dblythy
2020-07-17 11:36:38 +10:00
committed by GitHub
parent 93a88c5cde
commit 44015c3e35
8 changed files with 529 additions and 229 deletions

View File

@@ -16,16 +16,19 @@ export const Types = {
afterSaveFile: 'afterSaveFile',
beforeDeleteFile: 'beforeDeleteFile',
afterDeleteFile: 'afterDeleteFile',
beforeConnect: 'beforeConnect',
beforeSubscribe: 'beforeSubscribe',
};
const FileClassName = '@File';
const ConnectClassName = '@Connect';
const baseStore = function() {
const baseStore = function () {
const Validators = {};
const Functions = {};
const Jobs = {};
const LiveQuery = [];
const Triggers = Object.keys(Types).reduce(function(base, key) {
const Triggers = Object.keys(Types).reduce(function (base, key) {
base[key] = {};
return base;
}, {});
@@ -132,6 +135,10 @@ export function addFileTrigger(type, handler, applicationId) {
add(Category.Triggers, `${type}.${FileClassName}`, handler, applicationId);
}
export function addConnectTrigger(type, handler, applicationId) {
add(Category.Triggers, `${type}.${ConnectClassName}`, handler, applicationId);
}
export function addLiveQueryEventHandler(handler, applicationId) {
applicationId = applicationId || Parse.applicationId;
_triggerStore[applicationId] = _triggerStore[applicationId] || baseStore();
@@ -233,10 +240,12 @@ export function getRequestObject(
request.original = originalParseObject;
}
if (triggerType === Types.beforeSave ||
if (
triggerType === Types.beforeSave ||
triggerType === Types.afterSave ||
triggerType === Types.beforeDelete ||
triggerType === Types.afterDelete) {
triggerType === Types.afterDelete
) {
// Set a copy of the context on the request object.
request.context = Object.assign({}, context);
}
@@ -300,7 +309,7 @@ export function getRequestQueryObject(
// Any changes made to the object in a beforeSave will be included.
export function getResponseObject(request, resolve, reject) {
return {
success: function(response) {
success: function (response) {
if (request.triggerName === Types.afterFind) {
if (!response) {
response = request.objects;
@@ -335,7 +344,7 @@ export function getResponseObject(request, resolve, reject) {
}
return resolve(response);
},
error: function(error) {
error: function (error) {
if (error instanceof Parse.Error) {
reject(error);
} else if (error instanceof Error) {
@@ -585,7 +594,7 @@ export function maybeRunTrigger(
if (!parseObject) {
return Promise.resolve({});
}
return new Promise(function(resolve, reject) {
return new Promise(function (resolve, reject) {
var trigger = getTrigger(
parseObject.className,
triggerType,
@@ -721,7 +730,12 @@ export function getRequestFileObject(triggerType, auth, fileObject, config) {
return request;
}
export async function maybeRunFileTrigger(triggerType, fileObject, config, auth) {
export async function maybeRunFileTrigger(
triggerType,
fileObject,
config,
auth
) {
const fileTrigger = getFileTrigger(triggerType, config.applicationId);
if (typeof fileTrigger === 'function') {
try {
@@ -737,8 +751,8 @@ export async function maybeRunFileTrigger(triggerType, fileObject, config, auth)
'Parse.File',
{ ...fileObject.file.toJSON(), fileSize: fileObject.fileSize },
result,
auth,
)
auth
);
return result || fileObject;
} catch (error) {
logTriggerErrorBeforeHook(
@@ -746,10 +760,57 @@ export async function maybeRunFileTrigger(triggerType, fileObject, config, auth)
'Parse.File',
{ ...fileObject.file.toJSON(), fileSize: fileObject.fileSize },
auth,
error,
error
);
throw error;
}
}
return fileObject;
}
export async function maybeRunConnectTrigger(triggerType, request) {
const trigger = getTrigger(
ConnectClassName,
triggerType,
Parse.applicationId
);
if (!trigger) {
return;
}
request.user = await userForSessionToken(request.sessionToken);
return trigger(request);
}
export async function maybeRunSubscribeTrigger(
triggerType,
className,
request
) {
const trigger = getTrigger(className, triggerType, Parse.applicationId);
if (!trigger) {
return;
}
const parseQuery = new Parse.Query(className);
parseQuery.withJSON(request.query);
request.query = parseQuery;
request.user = await userForSessionToken(request.sessionToken);
return trigger(request);
}
async function userForSessionToken(sessionToken) {
if (!sessionToken) {
return;
}
const q = new Parse.Query('_Session');
q.equalTo('sessionToken', sessionToken);
const session = await q.first({ useMasterKey: true });
if (!session) {
return;
}
const user = session.get('user');
if (!user) {
return;
}
await user.fetch({ useMasterKey: true });
return user;
}