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); }), ), ),);
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);
}),
),
),
);