Skip to content

Commit 659c558

Browse files
authored
Add FDC triggers to firebase deploy (#9394)
* Add FDC triggers to firebase deploy * Add changelog
1 parent d5a3a3c commit 659c558

File tree

5 files changed

+88
-2
lines changed

5 files changed

+88
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- Adds 2nd gen Firebase Data Connect triggers to firebase deploy (#9394).
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { expect } from "chai";
2+
import { Endpoint } from "../backend";
3+
import * as dataconnect from "./dataconnect";
4+
5+
const projectNumber = "123456789";
6+
7+
const endpoint: Endpoint = {
8+
id: "endpoint",
9+
region: "us-central1",
10+
project: projectNumber,
11+
eventTrigger: {
12+
retry: false,
13+
eventType: "google.firebase.dataconnect.connector.v1.mutationExecuted",
14+
eventFilters: {},
15+
eventFilterPathPatterns: {},
16+
},
17+
entryPoint: "endpoint",
18+
platform: "gcfv2",
19+
runtime: "nodejs16",
20+
};
21+
22+
describe("ensureDatabaseTriggerRegion", () => {
23+
it("should set the trigger location to the function region", async () => {
24+
const ep = { ...endpoint };
25+
26+
await dataconnect.ensureDataConnectTriggerRegion(ep);
27+
28+
expect(ep.eventTrigger.region).to.eq("us-central1");
29+
});
30+
31+
it("should not error if the trigger location is already set correctly", async () => {
32+
const ep = { ...endpoint };
33+
ep.eventTrigger.region = "us-central1";
34+
35+
await dataconnect.ensureDataConnectTriggerRegion(ep);
36+
37+
expect(ep.eventTrigger.region).to.eq("us-central1");
38+
});
39+
40+
it("should error if the trigger location is set incorrectly", () => {
41+
const ep = { ...endpoint };
42+
ep.eventTrigger.region = "us-west1";
43+
44+
expect(() => dataconnect.ensureDataConnectTriggerRegion(ep)).to.throw(
45+
"The Firebase Data Connect trigger location must match the function region.",
46+
);
47+
});
48+
});
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import * as backend from "../backend";
2+
import { FirebaseError } from "../../../error";
3+
4+
/**
5+
* Sets a Firebase Data Connect event trigger's region to the function region.
6+
* @param endpoint the database endpoint
7+
*/
8+
export function ensureDataConnectTriggerRegion(
9+
endpoint: backend.Endpoint & backend.EventTriggered,
10+
): Promise<void> {
11+
if (!endpoint.eventTrigger.region) {
12+
endpoint.eventTrigger.region = endpoint.region;
13+
}
14+
if (endpoint.eventTrigger.region !== endpoint.region) {
15+
throw new FirebaseError(
16+
"The Firebase Data Connect trigger location must match the function region.",
17+
);
18+
}
19+
return Promise.resolve();
20+
}

src/deploy/functions/services/index.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { ensureDatabaseTriggerRegion } from "./database";
88
import { ensureRemoteConfigTriggerRegion } from "./remoteConfig";
99
import { ensureTestLabTriggerRegion } from "./testLab";
1010
import { ensureFirestoreTriggerRegion } from "./firestore";
11+
import { ensureDataConnectTriggerRegion } from "./dataconnect";
1112

1213
/** A standard void No Op */
1314
export const noop = (): Promise<void> => Promise.resolve();
@@ -25,7 +26,8 @@ export type Name =
2526
| "database"
2627
| "remoteconfig"
2728
| "testlab"
28-
| "firestore";
29+
| "firestore"
30+
| "dataconnect";
2931

3032
/** A service interface for the underlying GCP event services */
3133
export interface Service {
@@ -130,6 +132,17 @@ const firestoreService: Service = {
130132
unregisterTrigger: noop,
131133
};
132134

135+
/** A Firebase Data Connect service object */
136+
const dataconnectService: Service = {
137+
name: "dataconnect",
138+
api: "firebasedataconnect.googleapis.com",
139+
requiredProjectBindings: noopProjectBindings,
140+
ensureTriggerRegion: ensureDataConnectTriggerRegion,
141+
validateTrigger: noop,
142+
registerTrigger: noop,
143+
unregisterTrigger: noop,
144+
};
145+
133146
/** Mapping from event type string to service object */
134147
const EVENT_SERVICE_MAPPING: Record<events.Event, Service> = {
135148
"google.cloud.pubsub.topic.v1.messagePublished": pubSubService,
@@ -156,6 +169,7 @@ const EVENT_SERVICE_MAPPING: Record<events.Event, Service> = {
156169
"google.cloud.firestore.document.v1.created.withAuthContext": firestoreService,
157170
"google.cloud.firestore.document.v1.updated.withAuthContext": firestoreService,
158171
"google.cloud.firestore.document.v1.deleted.withAuthContext": firestoreService,
172+
"google.firebase.dataconnect.connector.v1.mutationExecuted": dataconnectService,
159173
};
160174

161175
/**

src/functions/events/v2.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ export const FIRESTORE_EVENTS = [
3333

3434
export const FIREALERTS_EVENT = "google.firebase.firebasealerts.alerts.v1.published";
3535

36+
export const DATACONNECT_EVENT = "google.firebase.dataconnect.connector.v1.mutationExecuted";
37+
3638
export type Event =
3739
| typeof PUBSUB_PUBLISH_EVENT
3840
| (typeof STORAGE_EVENTS)[number]
@@ -41,7 +43,8 @@ export type Event =
4143
| typeof REMOTE_CONFIG_EVENT
4244
| typeof TEST_LAB_EVENT
4345
| (typeof FIRESTORE_EVENTS)[number]
44-
| typeof FIREALERTS_EVENT;
46+
| typeof FIREALERTS_EVENT
47+
| typeof DATACONNECT_EVENT;
4548

4649
// Why can't auth context be removed? This is map was added to correct a bug where a regex
4750
// allowed any non-auth type to be converted to any auth type, but we should follow up for why

0 commit comments

Comments
 (0)