/* oxlint-disable executor/no-effect-escape-hatch -- boundary: HttpApi handler adapter maps plugin extension failures into InternalError */ import { Context, Effect } from "effect"; import { HttpApiBuilder } from "effect/unstable/httpapi"; import { addGroup, capture } from "@executor-js/api"; import { InternalError } from "@executor-js/sdk/shared"; import type { AppsExtension } from "./apps-plugin"; import { AppsGroup } from "./routes"; export class AppsExtensionService extends Context.Service()( "AppsExtensionService", ) {} const ExecutorApiWithApps = addGroup(AppsGroup); const captureUnexpected = ( effect: Effect.Effect, ): Effect.Effect => capture(effect.pipe(Effect.catch((cause: unknown) => Effect.die(cause)))); export const AppsHandlers = HttpApiBuilder.group(ExecutorApiWithApps, "apps", (handlers) => handlers .handle("listSources", () => captureUnexpected( Effect.gen(function* () { const ext = yield* AppsExtensionService; const sources = yield* ext.listSources(); return { sources }; }), ), ) .handle("createSource", ({ payload }) => captureUnexpected( Effect.gen(function* () { const ext = yield* AppsExtensionService; const source = yield* ext.createSource(payload); return { source }; }), ), ) .handle("getSource", ({ params }) => captureUnexpected( Effect.gen(function* () { const ext = yield* AppsExtensionService; const source = yield* ext.getSource(params.slug); return { source }; }), ), ) .handle("deleteSource", ({ params }) => captureUnexpected( Effect.gen(function* () { const ext = yield* AppsExtensionService; return yield* ext.deleteSource(params.slug); }), ), ) .handle("syncSource", ({ params }) => captureUnexpected( Effect.gen(function* () { const ext = yield* AppsExtensionService; return yield* ext.syncSource(params.slug); }), ), ), );