diff --git a/src/lib/openapi/index.ts b/src/lib/openapi/index.ts index c6020945a2..fb04033264 100644 --- a/src/lib/openapi/index.ts +++ b/src/lib/openapi/index.ts @@ -30,7 +30,6 @@ import { environmentSchema } from './spec/environment-schema'; import { environmentsSchema } from './spec/environments-schema'; import { eventSchema } from './spec/event-schema'; import { eventsSchema } from './spec/events-schema'; -import { exportParametersSchema } from './spec/export-parameters-schema'; import { featureEnvironmentMetricsSchema } from './spec/feature-environment-metrics-schema'; import { featureEnvironmentSchema } from './spec/feature-environment-schema'; import { featureEventsSchema } from './spec/feature-events-schema'; @@ -134,7 +133,6 @@ export const schemas = { environmentsSchema, eventSchema, eventsSchema, - exportParametersSchema, featureEnvironmentMetricsSchema, featureEnvironmentSchema, featureEventsSchema, diff --git a/src/lib/openapi/spec/export-parameters-schema.ts b/src/lib/openapi/spec/export-parameters-schema.ts index 78ba4ba78a..8ec54a5f32 100644 --- a/src/lib/openapi/spec/export-parameters-schema.ts +++ b/src/lib/openapi/spec/export-parameters-schema.ts @@ -1,8 +1,9 @@ import { FromSchema } from 'json-schema-to-ts'; +import { OpenAPIV3 } from 'openapi-types'; import { createQueryParameters } from '../util/query-parameters'; import { Parameters } from '../util/query-parameters'; -const exportParameters: Parameters = { +const exportParameters = { format: { type: 'string', enum: ['json', 'yaml'], @@ -44,10 +45,109 @@ const exportParameters: Parameters = { description: 'Whether environments should be included in the exported data.', }, +} as const; + +type ExportParams = typeof exportParameters; + +type Mutable = { + [Property in keyof ExportParams]: { type: ExportParams[Property]['type'] }; }; +const p = { + $id: 'th', + type: 'object', + properties: createQueryParameters(exportParameters).reduce( + (acc, next: OpenAPIV3.ParameterObject) => ({ + ...acc, + [next.name]: { + type: (next.schema as OpenAPIV3.SchemaObject).type, + }, + }), + {} as Partial, + ) as Mutable, +} as const; + +export type ExpType = FromSchema; + export const exportQueryParameters = createQueryParameters(exportParameters); +const s = { + $id: '#/components/schemas/exportParametersSchema2', + parameters: [ + { + name: 'format', + description: + 'Desired export format. Must be either `json` or `yaml`.', + schema: { + type: 'string', + enum: ['json', 'yaml'], + default: 'json', + }, + in: 'query', + }, + { + name: 'download', + description: + 'Whether exported data should be downloaded as a file.', + schema: { + type: 'boolean', + default: false, + }, + in: 'query', + }, + { + name: 'strategies', + description: + 'Whether strategies should be included in the exported data.', + schema: { + type: 'boolean', + default: true, + }, + in: 'query', + }, + { + name: 'featureToggles', + description: + 'Whether feature toggles should be included in the exported data.', + schema: { + type: 'boolean', + default: true, + }, + in: 'query', + }, + { + name: 'projects', + description: + 'Whether projects should be included in the exported data.', + schema: { + type: 'boolean', + default: true, + }, + in: 'query', + }, + { + name: 'tags', + description: + 'Whether tag types, tags, and feature_tags should be included in the exported data.', + schema: { + type: 'boolean', + default: true, + }, + in: 'query', + }, + { + name: 'environments', + description: + 'Whether environments should be included in the exported data.', + schema: { + type: 'boolean', + default: true, + }, + in: 'query', + }, + ], +} as const; + export const exportParametersSchema = { $id: '#/components/schemas/exportParametersSchema', type: 'object', diff --git a/src/lib/openapi/util/query-parameters.ts b/src/lib/openapi/util/query-parameters.ts index 60691d1360..eeecd9fb2f 100644 --- a/src/lib/openapi/util/query-parameters.ts +++ b/src/lib/openapi/util/query-parameters.ts @@ -2,14 +2,14 @@ import { OpenAPIV3 } from 'openapi-types'; export type ParameterType = OpenAPIV3.NonArraySchemaObjectType; -export type ParameterDetails = { +export type ParameterDetails = Readonly<{ description: string; type: ParameterType; required?: boolean; default?: U; - enum?: [U, ...U[]]; + enum?: Readonly<[U, ...U[]]>; example?: U; -}; +}>; export type Parameters = { [parameterName: string]: ParameterDetails; @@ -25,7 +25,7 @@ export const toParamObject = ( required: details.required, schema: { type: details.type, - enum: details.enum, + enum: details.enum as unknown as any[], default: details.default, }, in: 'query', diff --git a/src/lib/routes/admin-api/state.ts b/src/lib/routes/admin-api/state.ts index a76ee05b54..324644a29c 100644 --- a/src/lib/routes/admin-api/state.ts +++ b/src/lib/routes/admin-api/state.ts @@ -17,6 +17,7 @@ import { createResponseSchema } from '../../openapi/util/create-response-schema' import { exportQueryParameters, ExportParametersSchema, + ExpType, } from '../../openapi/spec/export-parameters-schema'; import { emptyResponse } from '../../openapi/util/standard-responses'; @@ -113,7 +114,7 @@ class StateController extends Controller { } async export( - req: Request, + req: Request, res: Response, ): Promise { const { format } = req.query;