import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from "@effect/platform";import { Schema } from "effect";import { ScopeId } from "@executor/sdk"; import { OpenApiParseError, OpenApiExtractionError } from "../sdk/errors";import { SpecPreview } from "../sdk/preview";import { StoredSourceSchema } from "../sdk/stored-source"; // ---------------------------------------------------------------------------// Params// --------------------------------------------------------------------------- const scopeIdParam = HttpApiSchema.param("scopeId", ScopeId);const namespaceParam = HttpApiSchema.param("namespace", Schema.String); // ---------------------------------------------------------------------------// Payloads// --------------------------------------------------------------------------- const AddSpecPayload = Schema.Struct({ spec: Schema.String, name: Schema.optional(Schema.String), baseUrl: Schema.optional(Schema.String), namespace: Schema.optional(Schema.String), headers: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Unknown })),}); const PreviewSpecPayload = Schema.Struct({ spec: Schema.String,}); const UpdateSourcePayload = Schema.Struct({ name: Schema.optional(Schema.String), baseUrl: Schema.optional(Schema.String), headers: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Unknown })),}); const UpdateSourceResponse = Schema.Struct({ updated: Schema.Boolean,}); // ---------------------------------------------------------------------------// Responses// --------------------------------------------------------------------------- const AddSpecResponse = Schema.Struct({ toolCount: Schema.Number, namespace: Schema.String,}); // ---------------------------------------------------------------------------// Errors with HTTP status// --------------------------------------------------------------------------- const ParseError = OpenApiParseError.annotations(HttpApiSchema.annotations({ status: 400 }));const ExtractionError = OpenApiExtractionError.annotations( HttpApiSchema.annotations({ status: 400 }),); // ---------------------------------------------------------------------------// Group// --------------------------------------------------------------------------- export class OpenApiGroup extends HttpApiGroup.make("openapi") .add( HttpApiEndpoint.post("previewSpec")`/scopes/${scopeIdParam}/openapi/preview` .setPayload(PreviewSpecPayload) .addSuccess(SpecPreview) .addError(ParseError) .addError(ExtractionError), ) .add( HttpApiEndpoint.post("addSpec")`/scopes/${scopeIdParam}/openapi/specs` .setPayload(AddSpecPayload) .addSuccess(AddSpecResponse) .addError(ParseError) .addError(ExtractionError), ) .add( HttpApiEndpoint.get( "getSource", )`/scopes/${scopeIdParam}/openapi/sources/${namespaceParam}`.addSuccess( Schema.NullOr(StoredSourceSchema), ), ) .add( HttpApiEndpoint.patch("updateSource")`/scopes/${scopeIdParam}/openapi/sources/${namespaceParam}` .setPayload(UpdateSourcePayload) .addSuccess(UpdateSourceResponse), ) {}
import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from "@effect/platform";
import { Schema } from "effect";
import { ScopeId } from "@executor/sdk";
import { OpenApiParseError, OpenApiExtractionError } from "../sdk/errors";
import { SpecPreview } from "../sdk/preview";
import { StoredSourceSchema } from "../sdk/stored-source";
// ---------------------------------------------------------------------------
// Params
// ---------------------------------------------------------------------------
const scopeIdParam = HttpApiSchema.param("scopeId", ScopeId);
const namespaceParam = HttpApiSchema.param("namespace", Schema.String);
// ---------------------------------------------------------------------------
// Payloads
// ---------------------------------------------------------------------------
const AddSpecPayload = Schema.Struct({
spec: Schema.String,
name: Schema.optional(Schema.String),
baseUrl: Schema.optional(Schema.String),
namespace: Schema.optional(Schema.String),
headers: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Unknown })),
});
const PreviewSpecPayload = Schema.Struct({
spec: Schema.String,
});
const UpdateSourcePayload = Schema.Struct({
name: Schema.optional(Schema.String),
baseUrl: Schema.optional(Schema.String),
headers: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Unknown })),
});
const UpdateSourceResponse = Schema.Struct({
updated: Schema.Boolean,
});
// ---------------------------------------------------------------------------
// Responses
// ---------------------------------------------------------------------------
const AddSpecResponse = Schema.Struct({
toolCount: Schema.Number,
namespace: Schema.String,
});
// ---------------------------------------------------------------------------
// Errors with HTTP status
// ---------------------------------------------------------------------------
const ParseError = OpenApiParseError.annotations(HttpApiSchema.annotations({ status: 400 }));
const ExtractionError = OpenApiExtractionError.annotations(
HttpApiSchema.annotations({ status: 400 }),
);
// ---------------------------------------------------------------------------
// Group
// ---------------------------------------------------------------------------
export class OpenApiGroup extends HttpApiGroup.make("openapi")
.add(
HttpApiEndpoint.post("previewSpec")`/scopes/${scopeIdParam}/openapi/preview`
.setPayload(PreviewSpecPayload)
.addSuccess(SpecPreview)
.addError(ParseError)
.addError(ExtractionError),
)
.add(
HttpApiEndpoint.post("addSpec")`/scopes/${scopeIdParam}/openapi/specs`
.setPayload(AddSpecPayload)
.addSuccess(AddSpecResponse)
.addError(ParseError)
.addError(ExtractionError),
)
.add(
HttpApiEndpoint.get(
"getSource",
)`/scopes/${scopeIdParam}/openapi/sources/${namespaceParam}`.addSuccess(
Schema.NullOr(StoredSourceSchema),
),
)
.add(
HttpApiEndpoint.patch("updateSource")`/scopes/${scopeIdParam}/openapi/sources/${namespaceParam}`
.setPayload(UpdateSourcePayload)
.addSuccess(UpdateSourceResponse),
) {}