1import * as GCP from "@/GCP";
2import * as Effect from "effect/Effect";
3import { serveProbes } from "../../bindingHost.ts";
4import {
5 connectorSource,
6 schemaSource,
7 unlinkedDatasources,
8} from "../common.ts";
9
10/** Data Connect service with an unlinked Postgres datasource. */
11export const App = GCP.FirebaseDataConnect.Service("App", {
12 labels: { env: "test" },
13});
14
15/** Service + schema + connector (list query, insert mutation). */
16export const Queries = Effect.gen(function* () {
17 const service = yield* App;
18 const schema = yield* GCP.FirebaseDataConnect.ServicesSchema("Main", {
19 service: service.name,
20 source: schemaSource(),
21 datasources: unlinkedDatasources,
22 labels: { env: "test" },
23 });
24 return yield* GCP.FirebaseDataConnect.ServicesConnector("Queries", {
25 service: schema.service,
26 source: {
27 files: [
28 ...connectorSource.files,
29 {
30 path: "mutations.gql",
31 content:
32 "mutation CreateAlchemyNote($title: String!) @auth(level: PUBLIC) { alchemyNote_insert(data: { title: $title }) }",
33 },
34 ],
35 },
36 labels: { env: "test" },
37 });
38});
39
40/**
41 * Effect-native Cloud Run service exercising every Data Connect binding as
42 * its own runtime service account. Deployed from {@link ../Bindings.test.ts}.
43 */
44export default class DataConnectBindingsHost extends GCP.Function<DataConnectBindingsHost>()(
45 "DataConnectBindingsHost",
46 { main: import.meta.url, invokerIamDisabled: true },
47 Effect.gen(function* () {
48 const service = yield* App;
49 const connector = yield* Queries;
50 const executeGraphql =
51 yield* GCP.FirebaseDataConnect.ExecuteGraphql(service);
52 const executeGraphqlRead =
53 yield* GCP.FirebaseDataConnect.ExecuteGraphqlRead(service);
54 const executeQuery = yield* GCP.FirebaseDataConnect.ExecuteQuery(connector);
55 const executeMutation =
56 yield* GCP.FirebaseDataConnect.ExecuteMutation(connector);
57
58 return {
59 fetch: serveProbes({
60 executeGraphql: executeGraphql({ body: { query: "{ __typename }" } }),
61 executeGraphqlRead: executeGraphqlRead({
62 body: { query: "{ __typename }" },
63 }),
64 executeQuery: executeQuery({
65 body: { operationName: "ListAlchemyNotes" },
66 }),
67 executeMutation: executeMutation({
68 body: {
69 operationName: "CreateAlchemyNote",
70 variables: { title: "hello" },
71 },
72 }),
73 }),
74 };
75 }).pipe(
76 Effect.provide(GCP.FirebaseDataConnect.ExecuteGraphqlHttp),
77 Effect.provide(GCP.FirebaseDataConnect.ExecuteGraphqlReadHttp),
78 Effect.provide(GCP.FirebaseDataConnect.ExecuteQueryHttp),
79 Effect.provide(GCP.FirebaseDataConnect.ExecuteMutationHttp),
80 ),
81) {}