105 lines · 3.5 KB · TypeScript
RawDownload
import { HttpApiBuilder } from "effect/unstable/httpapi";import { Context, Effect } from "effect"; import { addGroup, capture } from "@executor-js/api";import type { GooglePluginExtension } from "../sdk/plugin";import { GoogleGroup } from "./group"; export class GoogleExtensionService extends Context.Service<  GoogleExtensionService,  GooglePluginExtension>()("GoogleExtensionService") {} const ExecutorApiWithGoogle = addGroup(GoogleGroup); export const GoogleHandlers = HttpApiBuilder.group(ExecutorApiWithGoogle, "google", (handlers) =>  handlers    .handle("addBundle", ({ payload }) =>      capture(        Effect.gen(function* () {          const ext = yield* GoogleExtensionService;          return yield* ext.addBundle({            urls: payload.urls,            slug: payload.slug,            name: payload.name,            description: payload.description,            baseUrl: payload.baseUrl,          });        }),      ),    )    .handle("getIntegration", ({ params }) =>      capture(        Effect.gen(function* () {          const ext = yield* GoogleExtensionService;          const integration = yield* ext.getIntegration(params.slug);          return integration            ? {                slug: integration.slug,                description: integration.description,                kind: integration.kind,                canRemove: integration.canRemove,                canRefresh: integration.canRefresh,              }            : null;        }),      ),    )    .handle("getConfig", ({ params }) =>      capture(        Effect.gen(function* () {          const ext = yield* GoogleExtensionService;          const config = yield* ext.getConfig(params.slug);          return config            ? {                googleDiscoveryUrls: config.googleDiscoveryUrls                  ? [...config.googleDiscoveryUrls]                  : undefined,                baseUrl: config.baseUrl,                headers: config.headers ? { ...config.headers } : undefined,                queryParams: config.queryParams ? { ...config.queryParams } : undefined,                authenticationTemplate: config.authenticationTemplate                  ? [...config.authenticationTemplate]                  : undefined,              }            : null;        }),      ),    )    .handle("configure", ({ params, payload }) =>      capture(        Effect.gen(function* () {          const ext = yield* GoogleExtensionService;          const authenticationTemplate = yield* ext.configure(params.slug, {            authenticationTemplate: payload.authenticationTemplate,            mode: payload.mode ?? "merge",          });          return { authenticationTemplate: [...authenticationTemplate] };        }),      ),    )    .handle("updateBundle", ({ params, payload }) =>      capture(        Effect.gen(function* () {          const ext = yield* GoogleExtensionService;          const result = yield* ext.updateBundle(params.slug, {            ...(payload.urls !== undefined ? { urls: payload.urls } : {}),          });          return {            slug: result.slug,            toolCount: result.toolCount,            addedTools: [...result.addedTools],            removedTools: [...result.removedTools],          };        }),      ),    )    .handle("removeBundle", ({ params }) =>      capture(        Effect.gen(function* () {          const ext = yield* GoogleExtensionService;          yield* ext.removeBundle(params.slug);        }),      ),    ),);