77 lines
2.3 KiB
JavaScript
77 lines
2.3 KiB
JavaScript
|
|
import RestWrite from './RestWrite';
|
|||
|
|
import { md5Hash } from './cryptoUtils';
|
|||
|
|
|
|||
|
|
export default function pushStatusHandler(config) {
|
|||
|
|
|
|||
|
|
let initialPromise;
|
|||
|
|
let pushStatus;
|
|||
|
|
let setInitial = function(body, where, options = {source: 'rest'}) {
|
|||
|
|
let object = {
|
|||
|
|
pushTime: (new Date()).toISOString(),
|
|||
|
|
query: JSON.stringify(where),
|
|||
|
|
payload: body.data,
|
|||
|
|
source: options.source,
|
|||
|
|
title: options.title,
|
|||
|
|
expiry: body.expiration_time,
|
|||
|
|
status: "pending",
|
|||
|
|
numSent: 0,
|
|||
|
|
pushHash: md5Hash(JSON.stringify(body.data)),
|
|||
|
|
ACL: new Parse.ACL() // lockdown!
|
|||
|
|
}
|
|||
|
|
let restWrite = new RestWrite(config, {isMaster: true},'_PushStatus',null, object);
|
|||
|
|
initialPromise = restWrite.execute().then((res) => {
|
|||
|
|
pushStatus = res.response;
|
|||
|
|
return Promise.resolve(pushStatus);
|
|||
|
|
});
|
|||
|
|
return initialPromise;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
let setRunning = function() {
|
|||
|
|
return initialPromise.then(() => {
|
|||
|
|
let restWrite = new RestWrite(config, {isMaster: true}, '_PushStatus', {status:"pending", objectId: pushStatus.objectId}, {status: "running"});
|
|||
|
|
return restWrite.execute();
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
let complete = function(results) {
|
|||
|
|
let update = {
|
|||
|
|
status: 'succeeded',
|
|||
|
|
numSent: 0,
|
|||
|
|
numFailed: 0,
|
|||
|
|
};
|
|||
|
|
if (Array.isArray(results)) {
|
|||
|
|
results.reduce((memo, result) => {
|
|||
|
|
// Cannot handle that
|
|||
|
|
if (!result.device || !result.device.deviceType) {
|
|||
|
|
return memo;
|
|||
|
|
}
|
|||
|
|
let deviceType = result.device.deviceType;
|
|||
|
|
if (result.transmitted)
|
|||
|
|
{
|
|||
|
|
memo.numSent++;
|
|||
|
|
memo.sentPerType = memo.sentPerType || {};
|
|||
|
|
memo.sentPerType[deviceType] = memo.sentPerType[deviceType] || 0;
|
|||
|
|
memo.sentPerType[deviceType]++;
|
|||
|
|
} else {
|
|||
|
|
memo.numFailed++;
|
|||
|
|
memo.failedPerType = memo.failedPerType || {};
|
|||
|
|
memo.failedPerType[deviceType] = memo.failedPerType[deviceType] || 0;
|
|||
|
|
memo.failedPerType[deviceType]++;
|
|||
|
|
}
|
|||
|
|
return memo;
|
|||
|
|
}, update);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return initialPromise.then(() => {
|
|||
|
|
let restWrite = new RestWrite(config, {isMaster: true}, '_PushStatus', {status:"running", objectId: pushStatus.objectId}, update);
|
|||
|
|
return restWrite.execute();
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return Object.freeze({
|
|||
|
|
setInitial,
|
|||
|
|
setRunning,
|
|||
|
|
complete
|
|||
|
|
})
|
|||
|
|
}
|