Skip to content

Commit 2e50416

Browse files
Marco129drew-gross
authored andcommitted
Recursive parse date in cloud function (#2014)
* Recursive parse date in cloud function * Use _.mapValues
1 parent fcd914b commit 2e50416

File tree

2 files changed

+82
-10
lines changed

2 files changed

+82
-10
lines changed

spec/CloudCode.spec.js

+57
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,63 @@ describe('Cloud Code', () => {
316316
});
317317
});
318318

319+
it('test cloud function request params types', function(done) {
320+
Parse.Cloud.define('params', function(req, res) {
321+
expect(req.params.date instanceof Date).toBe(true);
322+
expect(req.params.date.getTime()).toBe(1463907600000);
323+
expect(req.params.dateList[0] instanceof Date).toBe(true);
324+
expect(req.params.dateList[0].getTime()).toBe(1463907600000);
325+
expect(req.params.complexStructure.date[0] instanceof Date).toBe(true);
326+
expect(req.params.complexStructure.date[0].getTime()).toBe(1463907600000);
327+
expect(req.params.complexStructure.deepDate.date[0] instanceof Date).toBe(true);
328+
expect(req.params.complexStructure.deepDate.date[0].getTime()).toBe(1463907600000);
329+
expect(req.params.complexStructure.deepDate2[0].date instanceof Date).toBe(true);
330+
expect(req.params.complexStructure.deepDate2[0].date.getTime()).toBe(1463907600000);
331+
return res.success({});
332+
});
333+
334+
let params = {
335+
'date': {
336+
'__type': 'Date',
337+
'iso': '2016-05-22T09:00:00.000Z'
338+
},
339+
'dateList': [
340+
{
341+
'__type': 'Date',
342+
'iso': '2016-05-22T09:00:00.000Z'
343+
}
344+
],
345+
'lol': 'hello',
346+
'complexStructure': {
347+
'date': [
348+
{
349+
'__type': 'Date',
350+
'iso': '2016-05-22T09:00:00.000Z'
351+
}
352+
],
353+
'deepDate': {
354+
'date': [
355+
{
356+
'__type': 'Date',
357+
'iso': '2016-05-22T09:00:00.000Z'
358+
}
359+
]
360+
},
361+
'deepDate2': [
362+
{
363+
'date': {
364+
'__type': 'Date',
365+
'iso': '2016-05-22T09:00:00.000Z'
366+
}
367+
}
368+
]
369+
}
370+
};
371+
Parse.Cloud.run('params', params).then((result) => {
372+
done();
373+
});
374+
});
375+
319376
it('test cloud function should echo keys', function(done) {
320377
Parse.Cloud.define('echoKeys', function(req, res){
321378
return res.success({

src/Routers/FunctionsRouter.js

+25-10
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,29 @@ var express = require('express'),
55
triggers = require('../triggers');
66

77
import PromiseRouter from '../PromiseRouter';
8+
import _ from 'lodash';
9+
10+
function parseDate(params) {
11+
return _.mapValues(params, (obj) => {
12+
if (Array.isArray(obj)) {
13+
return obj.map((item) => {
14+
if (item && item.__type == 'Date') {
15+
return new Date(item.iso);
16+
} else if (item && typeof item === 'object') {
17+
return parseDate(item);
18+
} else {
19+
return item;
20+
}
21+
});
22+
} else if (obj && obj.__type == 'Date') {
23+
return new Date(obj.iso);
24+
} else if (obj && typeof obj === 'object') {
25+
return parseDate(obj);
26+
} else {
27+
return obj;
28+
}
29+
});
30+
}
831

932
export class FunctionsRouter extends PromiseRouter {
1033

@@ -36,15 +59,8 @@ export class FunctionsRouter extends PromiseRouter {
3659
var theFunction = triggers.getFunction(req.params.functionName, applicationId);
3760
var theValidator = triggers.getValidator(req.params.functionName, applicationId);
3861
if (theFunction) {
39-
const params = Object.assign({}, req.body, req.query);
40-
for (var key in params) {
41-
if (params.hasOwnProperty(key)) {
42-
var value = params[key];
43-
if (value && value.__type == 'Date') {
44-
params[key] = new Date(value.iso);
45-
}
46-
}
47-
}
62+
let params = Object.assign({}, req.body, req.query);
63+
params = parseDate(params);
4864
var request = {
4965
params: params,
5066
master: req.auth && req.auth.isMaster,
@@ -73,4 +89,3 @@ export class FunctionsRouter extends PromiseRouter {
7389
}
7490
}
7591
}
76-

0 commit comments

Comments
 (0)