History

[codex] Clean up OpenAPI add source API (#843)

* Clean up OpenAPI add source API * Update OpenAPI add source credential UI * Address OpenAPI add source PR feedback * Document OpenAPI credential configuration plan * Fix OpenAPI add flow CI

Rhys Sullivan committed 6 months ago

Commit 529a54f1 parent 1d16b0b20 files · +1477 −467Browse files

Showing the changes to packages/plugins/openapi/src/api (2 of 20 files). Show all

Unified · Split

2 files
  1. packages/plugins/openapi/src/api/group.ts +23 −31
  2. packages/plugins/openapi/src/api/handlers.ts +11 −14
packages/plugins/openapi/src/api/group.ts+23−31
@@ -1,11 +1,6 @@
11 import { HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi";
22 import { Schema } from "effect";
3−import {
4− InternalError,
5− ScopeId,
6− ScopedSecretCredentialInput,
7− SecretBackedValue,
8−} from "@executor-js/sdk/shared";
3+import { InternalError, ScopeId, SecretBackedValue } from "@executor-js/sdk/shared";
94
105 import { OpenApiParseError, OpenApiExtractionError, OpenApiOAuthError } from "../sdk/errors";
116 import { SpecPreview } from "../sdk/preview";
@@ -42,57 +37,54 @@ const SourceBindingParams = { · 30 unmodified lines
4237 sourceScopeId: ScopeId,
4338 };
4439
45−const SpecFetchCredentialsPayload = Schema.Struct({
40+const OpenApiSpecInputPayload = Schema.Union([
41+ Schema.Struct({ kind: Schema.Literal("url"), url: Schema.String }),
42+ Schema.Struct({ kind: Schema.Literal("blob"), value: Schema.String }),
43+]);
44+
45+const PreviewSpecFetchCredentialsPayload = Schema.Struct({
4646 headers: Schema.optional(Schema.Record(Schema.String, SecretBackedValue)),
4747 queryParams: Schema.optional(Schema.Record(Schema.String, SecretBackedValue)),
4848 });
4949
50−const ConfiguredCredentialBindingPayload = Schema.Struct({
51− kind: Schema.Literal("binding"),
52− slot: Schema.String,
50+const OpenApiSecretShapePayload = Schema.Struct({
51+ kind: Schema.Literal("secret"),
5352 prefix: Schema.optional(Schema.String),
5453 });
5554
56−const ConfiguredCredentialValuePayload = Schema.Union([
57− Schema.String,
58− ConfiguredCredentialBindingPayload,
59−]);
55+const OpenApiConfiguredValuePayload = Schema.Union([Schema.String, OpenApiSecretShapePayload]);
6056
61−const OpenApiCredentialInputPayload = Schema.Union([
62− ScopedSecretCredentialInput,
63− SecretBackedValue,
64− ConfiguredCredentialValuePayload,
65−]);
57+const SpecFetchCredentialsPayload = Schema.Struct({
58+ headers: Schema.optional(Schema.Record(Schema.String, OpenApiConfiguredValuePayload)),
59+ queryParams: Schema.optional(Schema.Record(Schema.String, OpenApiConfiguredValuePayload)),
60+});
6661
6762 // ---------------------------------------------------------------------------
6863 // Payloads
6964 // ---------------------------------------------------------------------------
7065
7166 const AddSpecPayload = Schema.Struct({
72− targetScope: ScopeId,
73− credentialTargetScope: Schema.optional(ScopeId),
74− spec: Schema.String,
67+ spec: OpenApiSpecInputPayload,
7568 specFetchCredentials: Schema.optional(SpecFetchCredentialsPayload),
76− name: Schema.optional(Schema.String),
77− baseUrl: Schema.optional(Schema.String),
78− namespace: Schema.optional(Schema.String),
79− headers: Schema.optional(Schema.Record(Schema.String, OpenApiCredentialInputPayload)),
80− queryParams: Schema.optional(Schema.Record(Schema.String, OpenApiCredentialInputPayload)),
69+ name: Schema.String,
70+ baseUrl: Schema.String,
71+ namespace: Schema.String,
72+ headers: Schema.optional(Schema.Record(Schema.String, OpenApiConfiguredValuePayload)),
73+ queryParams: Schema.optional(Schema.Record(Schema.String, OpenApiConfiguredValuePayload)),
8174 oauth2: Schema.optional(OAuth2SourceConfig),
8275 });
8376
8477 const PreviewSpecPayload = Schema.Struct({
8578 spec: Schema.String,
86− specFetchCredentials: Schema.optional(SpecFetchCredentialsPayload),
79+ specFetchCredentials: Schema.optional(PreviewSpecFetchCredentialsPayload),
8780 });
8881
8982 const UpdateSourcePayload = Schema.Struct({
9083 sourceScope: ScopeId,
9184 name: Schema.optional(Schema.String),
9285 baseUrl: Schema.optional(Schema.String),
93− headers: Schema.optional(Schema.Record(Schema.String, OpenApiCredentialInputPayload)),
94− queryParams: Schema.optional(Schema.Record(Schema.String, OpenApiCredentialInputPayload)),
95− credentialTargetScope: Schema.optional(ScopeId),
86+ headers: Schema.optional(Schema.Record(Schema.String, OpenApiConfiguredValuePayload)),
87+ queryParams: Schema.optional(Schema.Record(Schema.String, OpenApiConfiguredValuePayload)),
9688 // Set after a successful re-authenticate to refresh the source's
9789 // stored OAuth2 metadata.
9890 oauth2: Schema.optional(OAuth2SourceConfig),
packages/plugins/openapi/src/api/handlers.ts+11−14
@@ -3,10 +3,9 @@ import { Context, Effect } from "effect"; · 2 unmodified lines
33
44 import { addGroup, capture } from "@executor-js/api";
55 import type {
6− ConfiguredHeaderValue,
6+ OpenApiConfiguredValueInput,
77 OpenApiPluginExtension,
8− HeaderValue,
9− OpenApiCredentialInput,
8+ OpenApiPreviewSpecFetchCredentialsInput,
109 OpenApiSpecFetchCredentialsInput,
1110 OpenApiUpdateSourceInput,
1211 } from "../sdk/plugin";
@@ -55,13 +54,13 @@ export const OpenApiHandlers = HttpApiBuilder.group(ExecutorApiWithOpenApi, "ope · 42 unmodified lines
5554 return yield* ext.previewSpec({
5655 spec: payload.spec,
5756 specFetchCredentials: payload.specFetchCredentials as
58− | OpenApiSpecFetchCredentialsInput
57+ | OpenApiPreviewSpecFetchCredentialsInput
5958 | undefined,
6059 });
6160 }),
6261 ),
6362 )
64− .handle("addSpec", ({ payload }) =>
63+ .handle("addSpec", ({ params: path, payload }) =>
6564 capture(
6665 Effect.gen(function* () {
6766 const ext = yield* OpenApiExtensionService;
@@ -70,15 +69,14 @@ export const OpenApiHandlers = HttpApiBuilder.group(ExecutorApiWithOpenApi, "ope · 2 unmodified lines
7069 specFetchCredentials: payload.specFetchCredentials as
7170 | OpenApiSpecFetchCredentialsInput
7271 | undefined,
73− scope: payload.targetScope,
72+ scope: path.scopeId,
7473 name: payload.name,
7574 baseUrl: payload.baseUrl,
7675 namespace: payload.namespace,
77− credentialTargetScope: payload.credentialTargetScope,
78− headers: payload.headers as
79− | Record<string, HeaderValue | ConfiguredHeaderValue>
76+ headers: payload.headers as Record<string, OpenApiConfiguredValueInput> | undefined,
77+ queryParams: payload.queryParams as
78+ | Record<string, OpenApiConfiguredValueInput>
8079 | undefined,
81− queryParams: payload.queryParams as Record<string, OpenApiCredentialInput> | undefined,
8280 oauth2: payload.oauth2,
8381 });
8482 return {
@@ -119,11 +117,10 @@ export const OpenApiHandlers = HttpApiBuilder.group(ExecutorApiWithOpenApi, "ope · 34 unmodified lines
119117 yield* ext.updateSource(path.namespace, payload.sourceScope, {
120118 name: payload.name,
121119 baseUrl: payload.baseUrl,
122− headers: payload.headers as
123− | Record<string, HeaderValue | ConfiguredHeaderValue>
120+ headers: payload.headers as Record<string, OpenApiConfiguredValueInput> | undefined,
121+ queryParams: payload.queryParams as
122+ | Record<string, OpenApiConfiguredValueInput>
124123 | undefined,
125− queryParams: payload.queryParams as Record<string, OpenApiCredentialInput> | undefined,
126− credentialTargetScope: payload.credentialTargetScope,
127124 oauth2: payload.oauth2,
128125 } as OpenApiUpdateSourceInput);
129126 return { updated: true };