From cb5ab949a5e12beb35aedb79552aef91466930ca Mon Sep 17 00:00:00 2001 From: Marco129 Date: Thu, 9 Jun 2016 18:54:54 +0800 Subject: [PATCH 1/2] Recursive parse date in cloud function --- spec/CloudCode.spec.js | 57 ++++++++++++++++++++++++++++++++++ src/Routers/FunctionsRouter.js | 35 +++++++++++++++------ 2 files changed, 82 insertions(+), 10 deletions(-) diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js index 875a6c762c..88ab24b88d 100644 --- a/spec/CloudCode.spec.js +++ b/spec/CloudCode.spec.js @@ -316,6 +316,63 @@ describe('Cloud Code', () => { }); }); + it('test cloud function request params types', function(done) { + Parse.Cloud.define('params', function(req, res) { + expect(req.params.date instanceof Date).toBe(true); + expect(req.params.date.getTime()).toBe(1463907600000); + expect(req.params.dateList[0] instanceof Date).toBe(true); + expect(req.params.dateList[0].getTime()).toBe(1463907600000); + expect(req.params.complexStructure.date[0] instanceof Date).toBe(true); + expect(req.params.complexStructure.date[0].getTime()).toBe(1463907600000); + expect(req.params.complexStructure.deepDate.date[0] instanceof Date).toBe(true); + expect(req.params.complexStructure.deepDate.date[0].getTime()).toBe(1463907600000); + expect(req.params.complexStructure.deepDate2[0].date instanceof Date).toBe(true); + expect(req.params.complexStructure.deepDate2[0].date.getTime()).toBe(1463907600000); + return res.success({}); + }); + + let params = { + 'date': { + '__type': 'Date', + 'iso': '2016-05-22T09:00:00.000Z' + }, + 'dateList': [ + { + '__type': 'Date', + 'iso': '2016-05-22T09:00:00.000Z' + } + ], + 'lol': 'hello', + 'complexStructure': { + 'date': [ + { + '__type': 'Date', + 'iso': '2016-05-22T09:00:00.000Z' + } + ], + 'deepDate': { + 'date': [ + { + '__type': 'Date', + 'iso': '2016-05-22T09:00:00.000Z' + } + ] + }, + 'deepDate2': [ + { + 'date': { + '__type': 'Date', + 'iso': '2016-05-22T09:00:00.000Z' + } + } + ] + } + }; + Parse.Cloud.run('params', params).then((result) => { + done(); + }); + }); + it('test cloud function should echo keys', function(done) { Parse.Cloud.define('echoKeys', function(req, res){ return res.success({ diff --git a/src/Routers/FunctionsRouter.js b/src/Routers/FunctionsRouter.js index dcf3e49ca5..4e871b2779 100644 --- a/src/Routers/FunctionsRouter.js +++ b/src/Routers/FunctionsRouter.js @@ -6,6 +6,29 @@ var express = require('express'), import PromiseRouter from '../PromiseRouter'; +function parseDate(params) { + for (let key in params) { + if (params.hasOwnProperty(key)) { + let value = params[key]; + if (Array.isArray(value)) { + params[key] = value.map((item) => { + if (item && item.__type == 'Date') { + return new Date(item.iso); + } else if (typeof item === 'object') { + return parseDate(item); + } + return item; + }); + } else if (value && value.__type == 'Date') { + params[key] = new Date(value.iso); + } else if (typeof value === 'object') { + params[key] = parseDate(value); + } + } + } + return params; +} + export class FunctionsRouter extends PromiseRouter { mountRoutes() { @@ -36,15 +59,8 @@ export class FunctionsRouter extends PromiseRouter { var theFunction = triggers.getFunction(req.params.functionName, applicationId); var theValidator = triggers.getValidator(req.params.functionName, applicationId); if (theFunction) { - const params = Object.assign({}, req.body, req.query); - for (var key in params) { - if (params.hasOwnProperty(key)) { - var value = params[key]; - if (value && value.__type == 'Date') { - params[key] = new Date(value.iso); - } - } - } + let params = Object.assign({}, req.body, req.query); + params = parseDate(params); var request = { params: params, master: req.auth && req.auth.isMaster, @@ -73,4 +89,3 @@ export class FunctionsRouter extends PromiseRouter { } } } - From 851ee51f14ebbd95a0df7161e364f1c05125f820 Mon Sep 17 00:00:00 2001 From: Marco129 Date: Fri, 10 Jun 2016 03:00:08 +0800 Subject: [PATCH 2/2] Use _.mapValues --- src/Routers/FunctionsRouter.js | 36 +++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/Routers/FunctionsRouter.js b/src/Routers/FunctionsRouter.js index 4e871b2779..71bf90b410 100644 --- a/src/Routers/FunctionsRouter.js +++ b/src/Routers/FunctionsRouter.js @@ -5,28 +5,28 @@ var express = require('express'), triggers = require('../triggers'); import PromiseRouter from '../PromiseRouter'; +import _ from 'lodash'; function parseDate(params) { - for (let key in params) { - if (params.hasOwnProperty(key)) { - let value = params[key]; - if (Array.isArray(value)) { - params[key] = value.map((item) => { - if (item && item.__type == 'Date') { - return new Date(item.iso); - } else if (typeof item === 'object') { - return parseDate(item); - } + return _.mapValues(params, (obj) => { + if (Array.isArray(obj)) { + return obj.map((item) => { + if (item && item.__type == 'Date') { + return new Date(item.iso); + } else if (item && typeof item === 'object') { + return parseDate(item); + } else { return item; - }); - } else if (value && value.__type == 'Date') { - params[key] = new Date(value.iso); - } else if (typeof value === 'object') { - params[key] = parseDate(value); - } + } + }); + } else if (obj && obj.__type == 'Date') { + return new Date(obj.iso); + } else if (obj && typeof obj === 'object') { + return parseDate(obj); + } else { + return obj; } - } - return params; + }); } export class FunctionsRouter extends PromiseRouter {