123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.FunctionsRouter = void 0;
- var _PromiseRouter = _interopRequireDefault(require("../PromiseRouter"));
- var _middlewares = require("../middlewares");
- var _StatusHandler = require("../StatusHandler");
- var _lodash = _interopRequireDefault(require("lodash"));
- var _logger = require("../logger");
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
- var Parse = require('parse/node').Parse,
- triggers = require('../triggers');
- function parseObject(obj, config) {
- if (Array.isArray(obj)) {
- return obj.map(item => {
- return parseObject(item, config);
- });
- } else if (obj && obj.__type == 'Date') {
- return Object.assign(new Date(obj.iso), obj);
- } else if (obj && obj.__type == 'File') {
- return Parse.File.fromJSON(obj);
- } else if (obj && obj.__type == 'Pointer' && config.encodeParseObjectInCloudFunction) {
- return Parse.Object.fromJSON({
- __type: 'Pointer',
- className: obj.className,
- objectId: obj.objectId
- });
- } else if (obj && typeof obj === 'object') {
- return parseParams(obj, config);
- } else {
- return obj;
- }
- }
- function parseParams(params, config) {
- return _lodash.default.mapValues(params, item => parseObject(item, config));
- }
- class FunctionsRouter extends _PromiseRouter.default {
- mountRoutes() {
- this.route('POST', '/functions/:functionName', _middlewares.promiseEnsureIdempotency, FunctionsRouter.handleCloudFunction);
- this.route('POST', '/jobs/:jobName', _middlewares.promiseEnsureIdempotency, _middlewares.promiseEnforceMasterKeyAccess, function (req) {
- return FunctionsRouter.handleCloudJob(req);
- });
- this.route('POST', '/jobs', _middlewares.promiseEnforceMasterKeyAccess, function (req) {
- return FunctionsRouter.handleCloudJob(req);
- });
- }
- static handleCloudJob(req) {
- const jobName = req.params.jobName || req.body.jobName;
- const applicationId = req.config.applicationId;
- const jobHandler = (0, _StatusHandler.jobStatusHandler)(req.config);
- const jobFunction = triggers.getJob(jobName, applicationId);
- if (!jobFunction) {
- throw new Parse.Error(Parse.Error.SCRIPT_FAILED, 'Invalid job.');
- }
- let params = Object.assign({}, req.body, req.query);
- params = parseParams(params, req.config);
- const request = {
- params: params,
- log: req.config.loggerController,
- headers: req.config.headers,
- ip: req.config.ip,
- jobName,
- message: jobHandler.setMessage.bind(jobHandler)
- };
- return jobHandler.setRunning(jobName, params).then(jobStatus => {
- request.jobId = jobStatus.objectId;
-
- process.nextTick(() => {
- Promise.resolve().then(() => {
- return jobFunction(request);
- }).then(result => {
- jobHandler.setSucceeded(result);
- }, error => {
- jobHandler.setFailed(error);
- });
- });
- return {
- headers: {
- 'X-Parse-Job-Status-Id': jobStatus.objectId
- },
- response: {}
- };
- });
- }
- static createResponseObject(resolve, reject) {
- return {
- success: function (result) {
- resolve({
- response: {
- result: Parse._encode(result)
- }
- });
- },
- error: function (message) {
- const error = triggers.resolveError(message);
- reject(error);
- }
- };
- }
- static handleCloudFunction(req) {
- const functionName = req.params.functionName;
- const applicationId = req.config.applicationId;
- const theFunction = triggers.getFunction(functionName, applicationId);
- if (!theFunction) {
- throw new Parse.Error(Parse.Error.SCRIPT_FAILED, `Invalid function: "${functionName}"`);
- }
- let params = Object.assign({}, req.body, req.query);
- params = parseParams(params, req.config);
- const request = {
- params: params,
- master: req.auth && req.auth.isMaster,
- user: req.auth && req.auth.user,
- installationId: req.info.installationId,
- log: req.config.loggerController,
- headers: req.config.headers,
- ip: req.config.ip,
- functionName,
- context: req.info.context
- };
- return new Promise(function (resolve, reject) {
- const userString = req.auth && req.auth.user ? req.auth.user.id : undefined;
- const {
- success,
- error
- } = FunctionsRouter.createResponseObject(result => {
- try {
- if (req.config.logLevels.cloudFunctionSuccess !== 'silent') {
- const cleanInput = _logger.logger.truncateLogMessage(JSON.stringify(params));
- const cleanResult = _logger.logger.truncateLogMessage(JSON.stringify(result.response.result));
- _logger.logger[req.config.logLevels.cloudFunctionSuccess](`Ran cloud function ${functionName} for user ${userString} with:\n Input: ${cleanInput}\n Result: ${cleanResult}`, {
- functionName,
- params,
- user: userString
- });
- }
- resolve(result);
- } catch (e) {
- reject(e);
- }
- }, error => {
- try {
- if (req.config.logLevels.cloudFunctionError !== 'silent') {
- const cleanInput = _logger.logger.truncateLogMessage(JSON.stringify(params));
- _logger.logger[req.config.logLevels.cloudFunctionError](`Failed running cloud function ${functionName} for user ${userString} with:\n Input: ${cleanInput}\n Error: ` + JSON.stringify(error), {
- functionName,
- error,
- params,
- user: userString
- });
- }
- reject(error);
- } catch (e) {
- reject(e);
- }
- });
- return Promise.resolve().then(() => {
- return triggers.maybeRunValidator(request, functionName, req.auth);
- }).then(() => {
- return theFunction(request);
- }).then(success, error);
- });
- }
- }
- exports.FunctionsRouter = FunctionsRouter;
|