From 731518060043e7001e5cb475152a8b469e435e19 Mon Sep 17 00:00:00 2001 From: Rhys Sullivan <39114868+RhysSullivan@users.noreply.github.com> Date: Thu, 9 Apr 2026 21:55:16 -0700 Subject: [PATCH] feat(google-discovery): add edit source configuration support Implement getSource for Google Discovery with read-only config view, stored-source schema, and edit UI showing service/version/auth info. --- .../plugins/google-discovery/src/api/group.ts | 8 ++++ .../google-discovery/src/api/handlers.ts | 6 +++ .../src/react/EditGoogleDiscoverySource.tsx | 47 ++++++++++++++++++- .../google-discovery/src/react/atoms.ts | 10 ++++ .../google-discovery/src/sdk/binding-store.ts | 11 +++++ .../google-discovery/src/sdk/plugin.ts | 8 ++++ .../google-discovery/src/sdk/stored-source.ts | 19 ++++++++ 7 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 packages/plugins/google-discovery/src/sdk/stored-source.ts diff --git a/packages/plugins/google-discovery/src/api/group.ts b/packages/plugins/google-discovery/src/api/group.ts index 632e0014ce..c6ddd4e156 100644 --- a/packages/plugins/google-discovery/src/api/group.ts +++ b/packages/plugins/google-discovery/src/api/group.ts @@ -2,9 +2,12 @@ import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from "@effect/platform"; import { Schema } from "effect"; import { ScopeId } from "@executor/sdk"; +import { GoogleDiscoveryStoredSourceSchema } from "../sdk/stored-source"; + export { HttpApiSchema }; const scopeIdParam = HttpApiSchema.param("scopeId", ScopeId); +const namespaceParam = HttpApiSchema.param("namespace", Schema.String); const AuthPayload = Schema.Union( Schema.Struct({ @@ -125,4 +128,9 @@ export class GoogleDiscoveryGroup extends HttpApiGroup.make("googleDiscovery") .addSuccess(HtmlResponse) .addError(ApiError), ) + .add( + HttpApiEndpoint.get("getSource")`/scopes/${scopeIdParam}/google-discovery/sources/${namespaceParam}` + .addSuccess(Schema.NullOr(GoogleDiscoveryStoredSourceSchema)) + .addError(ApiError), + ) {} diff --git a/packages/plugins/google-discovery/src/api/handlers.ts b/packages/plugins/google-discovery/src/api/handlers.ts index f846ace4b2..917517673e 100644 --- a/packages/plugins/google-discovery/src/api/handlers.ts +++ b/packages/plugins/google-discovery/src/api/handlers.ts @@ -105,6 +105,12 @@ export const GoogleDiscoveryHandlers = HttpApiBuilder.group( }); }).pipe(Effect.orDie), ) + .handle("getSource", ({ path }) => + Effect.gen(function* () { + const ext = yield* GoogleDiscoveryExtensionService; + return yield* ext.getSource(path.namespace); + }).pipe(Effect.orDie), + ) .handle("oauthCallback", ({ urlParams }) => Effect.gen(function* () { const ext = yield* GoogleDiscoveryExtensionService; diff --git a/packages/plugins/google-discovery/src/react/EditGoogleDiscoverySource.tsx b/packages/plugins/google-discovery/src/react/EditGoogleDiscoverySource.tsx index 6ccf440d3a..eaf7dd6397 100644 --- a/packages/plugins/google-discovery/src/react/EditGoogleDiscoverySource.tsx +++ b/packages/plugins/google-discovery/src/react/EditGoogleDiscoverySource.tsx @@ -1,6 +1,10 @@ +import { useAtomValue, Result } from "@effect-atom/atom-react"; +import { useScope } from "@executor/react/api/scope-context"; import { Badge } from "@executor/react/components/badge"; import { Button } from "@executor/react/components/button"; +import { googleDiscoverySourceAtom } from "./atoms"; + export default function EditGoogleDiscoverySource({ sourceId, onSave, @@ -8,6 +12,13 @@ export default function EditGoogleDiscoverySource({ readonly sourceId: string; readonly onSave: () => void; }) { + const scopeId = useScope(); + const sourceResult = useAtomValue(googleDiscoverySourceAtom(scopeId, sourceId)); + + const source = Result.isSuccess(sourceResult) ? sourceResult.value : null; + const config = source?.config; + const authKind = config?.auth.kind ?? "none"; + return (
- This source is managed from its Discovery document and can be refreshed from the source header. + View configuration for this Google API source. To change authentication, + remove and re-add the source with updated OAuth credentials.
- {sourceId} + {source?.name ?? sourceId}
+ {config?.discoveryUrl && ( ++ {config.discoveryUrl} +
+ )}Service
++ {config.service} +
+Version
++ {config.version} +
+Authentication
++ {authKind === "oauth2" ? "OAuth 2.0" : authKind} +
+