Skip to content

Commit 3c67e24

Browse files
authored
Construct params based on resource string in event payload. (#154)
1 parent 692502c commit 3c67e24

File tree

2 files changed

+47
-6
lines changed

2 files changed

+47
-6
lines changed

spec/cloud-functions.spec.ts

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,6 @@ describe('makeCloudFunction', () => {
5353
},
5454
eventType: 'providers/provider/eventTypes/event',
5555
resource: 'resource',
56-
params: {
57-
foo: 'bar',
58-
},
5956
data: 'data',
6057
};
6158

@@ -67,10 +64,37 @@ describe('makeCloudFunction', () => {
6764
},
6865
eventType: 'providers/provider/eventTypes/event',
6966
resource: 'resource',
67+
data: 'data',
68+
params: {},
69+
});
70+
});
71+
});
72+
73+
describe('makeParams', () => {
74+
75+
const cloudFunctionArgs: MakeCloudFunctionArgs<any> = {
76+
provider: 'mock.provider',
77+
eventType: 'mock.event',
78+
resource: 'projects/_/instances/pid/ref/{foo}/nested/{bar}',
79+
handler: () => null,
80+
};
81+
82+
const testEvent: Event<string> = {
83+
resource: 'projects/_/instances/pid/ref/a/nested/b',
84+
data: 'data',
85+
};
86+
87+
it('should construct params from the event resource', () => {
88+
let args: any = _.assign({}, cloudFunctionArgs, {handler: (e) => e});
89+
let cf = makeCloudFunction(args);
90+
91+
return expect(cf(testEvent)).to.eventually.deep.equal({
92+
resource: 'projects/_/instances/pid/ref/a/nested/b',
93+
data: 'data',
7094
params: {
71-
foo: 'bar',
95+
foo: 'a',
96+
bar: 'b',
7297
},
73-
data: 'data',
7498
});
7599
});
76100
});

src/cloud-functions.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { apps } from './apps';
2424
import * as _ from 'lodash';
2525
import { Request, Response } from 'express';
2626
export { Request, Response };
27+
const WILDCARD_REGEX = new RegExp('{[^/{}]*}', 'g');
2728

2829
/** An event to be handled in a developer's Cloud Function */
2930
export interface Event<T> {
@@ -72,6 +73,22 @@ export interface MakeCloudFunctionArgs<EventData> {
7273
after?: (raw: Event<any>) => void;
7374
}
7475

76+
function _makeParams (event: Event<any>, triggerResource: string): { [option: string]: any } {
77+
let wildcards = triggerResource.match(WILDCARD_REGEX);
78+
let params = {};
79+
if (wildcards) {
80+
let triggerResourceParts = _.split(triggerResource, '/');
81+
let eventResourceParts = _.split(event.resource, '/');
82+
_.forEach(wildcards, wildcard => {
83+
let wildcardNoBraces = wildcard.slice(1,-1);
84+
85+
let position = _.indexOf(triggerResourceParts, wildcard);
86+
params[wildcardNoBraces] = eventResourceParts[position];
87+
});
88+
}
89+
return params;
90+
};
91+
7592
/** @internal */
7693
export function makeCloudFunction<EventData>({
7794
provider,
@@ -88,7 +105,7 @@ export function makeCloudFunction<EventData>({
88105
.then(() => {
89106
let typedEvent: Event<EventData> = _.cloneDeep(event);
90107
typedEvent.data = dataConstructor(event);
91-
typedEvent.params = event.params || {};
108+
typedEvent.params = _makeParams(event, resource) || {};
92109
return handler(typedEvent);
93110
}).then(result => {
94111
if (after) { after(event); }

0 commit comments

Comments
 (0)