109 lines · 3.5 KB · TypeScript
RawDownload
import { HttpApiBuilder } from "effect/unstable/httpapi";import { Effect } from "effect";import { IntegrationNotFoundError, type Integration } from "@executor-js/sdk"; import { ExecutorApi } from "../api";import { ExecutorService } from "../services";import { capture } from "@executor-js/api"; const toResponse = (i: Integration) => ({  slug: i.slug,  name: i.name,  description: i.description,  kind: i.kind,  canRemove: i.canRemove,  canRefresh: i.canRefresh,  authMethods: i.authMethods,  ...(i.displayUrl ? { displayUrl: i.displayUrl } : {}),  ...(i.family ? { family: i.family } : {}),}); export const IntegrationsHandlers = HttpApiBuilder.group(ExecutorApi, "integrations", (handlers) =>  handlers    .handle("list", () =>      capture(        Effect.gen(function* () {          const executor = yield* ExecutorService;          const integrations = yield* executor.integrations.list();          return integrations.map(toResponse);        }),      ),    )    .handle("get", ({ params: path }) =>      capture(        Effect.gen(function* () {          const executor = yield* ExecutorService;          const integration = yield* executor.integrations.get(path.slug);          if (integration === null) {            return yield* new IntegrationNotFoundError({ slug: path.slug });          }          return toResponse(integration);        }),      ),    )    .handle("update", ({ params: path, payload }) =>      capture(        Effect.gen(function* () {          const executor = yield* ExecutorService;          yield* executor.integrations.update(path.slug, {            ...(payload.name !== undefined ? { name: payload.name } : {}),            ...(payload.description !== undefined ? { description: payload.description } : {}),          });          const integration = yield* executor.integrations.get(path.slug);          if (integration === null) {            return yield* new IntegrationNotFoundError({ slug: path.slug });          }          return toResponse(integration);        }),      ),    )    .handle("remove", ({ params: path }) =>      capture(        Effect.gen(function* () {          const executor = yield* ExecutorService;          yield* executor.integrations.remove(path.slug);          return { removed: true };        }),      ),    )    .handle("detect", ({ payload }) =>      capture(        Effect.gen(function* () {          const executor = yield* ExecutorService;          const results = yield* executor.integrations.detect(payload.url.trim());          return results.map((r) => ({            kind: r.kind,            confidence: r.confidence,            endpoint: r.endpoint,            name: r.name,            slug: r.slug,          }));        }),      ),    )    .handle("healthCheckGet", ({ params: path }) =>      capture(        Effect.gen(function* () {          const executor = yield* ExecutorService;          return yield* executor.integrations.healthCheck.get(path.slug);        }),      ),    )    .handle("healthCheckCandidates", ({ params: path }) =>      capture(        Effect.gen(function* () {          const executor = yield* ExecutorService;          return yield* executor.integrations.healthCheck.candidates(path.slug);        }),      ),    )    .handle("healthCheckSet", ({ params: path, payload }) =>      capture(        Effect.gen(function* () {          const executor = yield* ExecutorService;          yield* executor.integrations.healthCheck.set(path.slug, payload.spec);          return { ok: true };        }),      ),    ),);