Skip to content

Commit 88a9e3f

Browse files
authored
Use Event Trigger, coerce data deltaSnapshot into array (#68)
* change trigger creation to be EventFlow format (#49) * coerce deltaSnapshot val into array if keys are integers (#63)
1 parent aed070c commit 88a9e3f

14 files changed

+86
-68
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ lib
77
coverage
88
node_modules
99
typings
10-
.vscode
10+
.vscode/

.vscode/settings.json

Lines changed: 0 additions & 3 deletions
This file was deleted.

.vscode/tasks.json

Lines changed: 0 additions & 20 deletions
This file was deleted.

src/builder.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,14 @@ export interface TriggerAnnotated {
88
__trigger: TriggerDefinition;
99
}
1010

11+
export interface EventTriggerDefinition {
12+
eventType: string;
13+
resource: string;
14+
path?: string;
15+
}
1116
export interface TriggerDefinition {
12-
service: string;
13-
event: string;
17+
httpsTrigger?: Object;
18+
eventTrigger?: EventTriggerDefinition;
1419
}
1520

1621
/* A CloudFunction is both an object that exports its trigger definitions at __trigger and

src/builders/database-builder.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,13 @@ export default class DatabaseBuilder extends FunctionBuilder {
4242
return this._makeHandler(handler, 'data.write');
4343
}
4444

45-
protected _toTrigger(event?: string): DatabaseTriggerDefinition {
45+
protected _toTrigger(event: string): TriggerDefinition {
4646
return {
47-
service: 'firebase.database',
48-
event: 'write',
49-
path: this._path,
47+
eventTrigger: {
48+
eventType: 'providers/firebase.database/eventTypes/' + event,
49+
resource: 'projects/' + process.env.GCLOUD_PROJECT,
50+
path: this._path,
51+
},
5052
};
5153
}
5254

src/builders/https-builder.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,14 @@ export default class CloudHttpsBuilder extends FunctionBuilder {
2424
});
2525
});
2626
};
27-
wrappedHandler.__trigger = this._toTrigger('request');
27+
wrappedHandler.__trigger = this._toTrigger();
2828

2929
return wrappedHandler;
3030
}
3131

32-
protected _toTrigger(event: string): TriggerDefinition {
32+
protected _toTrigger(): TriggerDefinition {
3333
return {
34-
service: 'cloud.http',
35-
event,
34+
httpsTrigger: {},
3635
};
3736
}
3837
}

src/builders/pubsub-builder.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,6 @@ export class PubsubMessage {
3030
}
3131
}
3232

33-
export interface CloudPubsubTriggerDefinition extends TriggerDefinition {
34-
topic: string;
35-
}
36-
3733
export default class PubsubBuilder extends FunctionBuilder {
3834
topic: string;
3935
event: string;
@@ -48,11 +44,12 @@ export default class PubsubBuilder extends FunctionBuilder {
4844
return this._makeHandler(handler, 'topic.publish');
4945
}
5046

51-
protected _toTrigger(event: string): CloudPubsubTriggerDefinition {
47+
protected _toTrigger(event: string): TriggerDefinition {
5248
return {
53-
service: 'cloud.pubsub',
54-
event: 'message',
55-
topic: this.topic,
49+
eventTrigger: {
50+
eventType: 'providers/cloud.pubsub/eventTypes/' + event,
51+
resource: 'projects/' + process.env.GCLOUD_PROJECT + '/topics/' + this.topic,
52+
},
5653
};
5754
}
5855

src/builders/storage-builder.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,6 @@ export interface StorageObject {
5858
};
5959
}
6060

61-
export interface CloudStorageTriggerDefinition extends TriggerDefinition {
62-
bucket: string;
63-
}
64-
6561
export default class CloudStorageBuilder extends FunctionBuilder {
6662
bucket: string;
6763

@@ -76,11 +72,12 @@ export default class CloudStorageBuilder extends FunctionBuilder {
7672
return this._makeHandler(handler, 'object.change');
7773
}
7874

79-
protected _toTrigger(event: string): CloudStorageTriggerDefinition {
75+
protected _toTrigger(event: string): TriggerDefinition {
8076
return {
81-
service: 'cloud.storage',
82-
bucket: this.bucket,
83-
event: 'object',
77+
eventTrigger: {
78+
eventType: 'providers/cloud.storage/eventTypes/' + event,
79+
resource: this.bucket? 'projects/' + process.env.GCLOUD_PROJECT + '/buckets/' + this.bucket: null,
80+
},
8481
};
8582
}
8683
}

src/database/delta-snapshot.ts

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,43 @@ export default class DatabaseDeltaSnapshot {
5353
val(): any {
5454
let parts = pathParts(this._childPath);
5555
let source = this._isPrevious ? this._data : this._newData;
56-
return _.cloneDeep(parts.length ? _.get(source, parts, null) : source);
56+
let node = _.cloneDeep(parts.length ? _.get(source, parts, null) : source);
57+
return this._checkAndConvertToArray(node);
58+
}
59+
60+
/* Recursive function to check if keys are numeric & convert node object to array if they are */
61+
_checkAndConvertToArray(node): any {
62+
if (!node) {
63+
return null;
64+
}
65+
if (typeof node !== 'object') {
66+
return node;
67+
}
68+
let obj = { };
69+
let numKeys = 0;
70+
let maxKey = 0;
71+
let allIntegerKeys = true;
72+
_.forEach(node, (childNode, key) => {
73+
obj[key] = this._checkAndConvertToArray(childNode);
74+
numKeys++;
75+
const integerRegExp = /^(0|[1-9]\d*)$/;
76+
if (allIntegerKeys && integerRegExp.test(key)) {
77+
maxKey = Math.max(maxKey, Number(key));
78+
} else {
79+
allIntegerKeys = false;
80+
}
81+
});
82+
83+
if (allIntegerKeys && maxKey < 2 * numKeys) {
84+
// convert to array.
85+
let array = [];
86+
_.forOwn(obj, (val, key) => {
87+
array[key] = val;
88+
});
89+
90+
return array;
91+
}
92+
return obj;
5793
}
5894

5995
exists(): boolean {

test/builders/database-builder.spec.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,14 @@ describe('DatabaseBuilder', () => {
1919
it('should append paths if called multiple times', () => {
2020
subject.path('first/bit');
2121
subject.path('{id}/second/bit');
22-
return expect(subject['_toTrigger']()).to.deep.equal({
23-
service: 'firebase.database',
24-
event: 'write',
25-
path: '/first/bit/{id}/second/bit',
26-
});
22+
return expect(subject['_toTrigger']('data.write').eventTrigger.path).to.equal('/first/bit/{id}/second/bit');
2723
});
2824
});
2925

3026
describe('#_toTrigger()', () => {
3127
it('should return "write" as the default event type', () => {
32-
expect(subject['_toTrigger']().event).to.eq('write');
28+
let eventType = subject['_toTrigger']('data.write').eventTrigger.eventType;
29+
expect(eventType).to.eq('providers/firebase.database/eventTypes/data.write');
3330
});
3431
});
3532

0 commit comments

Comments
 (0)