import type { ScopeId } from "@executor-js/sdk/core";import * as Atom from "effect/unstable/reactivity/Atom";import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";import { sourcesOptimisticAtom } from "@executor-js/react/api/atoms";import { ReactivityKey } from "@executor-js/react/api/reactivity-keys";import { OpenApiClient } from "./client"; // ---------------------------------------------------------------------------// Query atoms// --------------------------------------------------------------------------- export const openApiSourceAtom = (scopeId: ScopeId, namespace: string) => OpenApiClient.query("openapi", "getSource", { params: { scopeId, namespace }, timeToLive: "15 seconds", reactivityKeys: [ReactivityKey.sources, ReactivityKey.tools], }); export const openApiSourceBindingsAtom = ( scopeId: ScopeId, namespace: string, sourceScopeId: ScopeId,) => OpenApiClient.query("openapi", "listSourceBindings", { params: { scopeId, namespace, sourceScopeId }, timeToLive: "15 seconds", reactivityKeys: [ReactivityKey.sources, ReactivityKey.secrets, ReactivityKey.connections], }); // ---------------------------------------------------------------------------// Mutation atoms// --------------------------------------------------------------------------- export const previewOpenApiSpec = OpenApiClient.mutation("openapi", "previewSpec"); export const addOpenApiSpec = OpenApiClient.mutation("openapi", "addSpec"); export const addOpenApiSpecOptimistic = Atom.family((scopeId: ScopeId) => sourcesOptimisticAtom(scopeId).pipe( Atom.optimisticFn({ reducer: (current, arg) => AsyncResult.map(current, (rows) => { const id = arg.payload.namespace ?? `pending-${Math.random().toString(36).slice(2)}`; const source = { id, scopeId: arg.payload.targetScope, kind: "openapi", pluginId: "openapi", name: arg.payload.name ?? id, ...(arg.payload.baseUrl ? { url: arg.payload.baseUrl } : {}), canRemove: false, canRefresh: false, canEdit: false, runtime: false, }; return [source, ...rows.filter((row) => row.id !== id)].sort((a, b) => a.name.localeCompare(b.name), ); }), fn: addOpenApiSpec, }), ),); export const updateOpenApiSource = OpenApiClient.mutation("openapi", "updateSource"); export const setOpenApiSourceBinding = OpenApiClient.mutation("openapi", "setSourceBinding"); export const removeOpenApiSourceBinding = OpenApiClient.mutation("openapi", "removeSourceBinding");
import type { ScopeId } from "@executor-js/sdk/core";
import * as Atom from "effect/unstable/reactivity/Atom";
import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
import { sourcesOptimisticAtom } from "@executor-js/react/api/atoms";
import { ReactivityKey } from "@executor-js/react/api/reactivity-keys";
import { OpenApiClient } from "./client";
// ---------------------------------------------------------------------------
// Query atoms
// ---------------------------------------------------------------------------
export const openApiSourceAtom = (scopeId: ScopeId, namespace: string) =>
OpenApiClient.query("openapi", "getSource", {
params: { scopeId, namespace },
timeToLive: "15 seconds",
reactivityKeys: [ReactivityKey.sources, ReactivityKey.tools],
});
export const openApiSourceBindingsAtom = (
scopeId: ScopeId,
namespace: string,
sourceScopeId: ScopeId,
) =>
OpenApiClient.query("openapi", "listSourceBindings", {
params: { scopeId, namespace, sourceScopeId },
timeToLive: "15 seconds",
reactivityKeys: [ReactivityKey.sources, ReactivityKey.secrets, ReactivityKey.connections],
});
// ---------------------------------------------------------------------------
// Mutation atoms
// ---------------------------------------------------------------------------
export const previewOpenApiSpec = OpenApiClient.mutation("openapi", "previewSpec");
export const addOpenApiSpec = OpenApiClient.mutation("openapi", "addSpec");
export const addOpenApiSpecOptimistic = Atom.family((scopeId: ScopeId) =>
sourcesOptimisticAtom(scopeId).pipe(
Atom.optimisticFn({
reducer: (current, arg) =>
AsyncResult.map(current, (rows) => {
const id = arg.payload.namespace ?? `pending-${Math.random().toString(36).slice(2)}`;
const source = {
id,
scopeId: arg.payload.targetScope,
kind: "openapi",
pluginId: "openapi",
name: arg.payload.name ?? id,
...(arg.payload.baseUrl ? { url: arg.payload.baseUrl } : {}),
canRemove: false,
canRefresh: false,
canEdit: false,
runtime: false,
};
return [source, ...rows.filter((row) => row.id !== id)].sort((a, b) =>
a.name.localeCompare(b.name),
);
}),
fn: addOpenApiSpec,
}),
),
);
export const updateOpenApiSource = OpenApiClient.mutation("openapi", "updateSource");
export const setOpenApiSourceBinding = OpenApiClient.mutation("openapi", "setSourceBinding");
export const removeOpenApiSourceBinding = OpenApiClient.mutation("openapi", "removeSourceBinding");