From 76bd5d3f552f37b6a9a25169cd0db118e17f7286 Mon Sep 17 00:00:00 2001 From: Wisdom Nwokocha Date: Sun, 27 Oct 2024 13:04:38 +0100 Subject: [PATCH] Update PostmanToOpenAPIConverter.tsx --- src/components/PostmanToOpenAPIConverter.tsx | 79 ++++++++++++++++++-- 1 file changed, 73 insertions(+), 6 deletions(-) diff --git a/src/components/PostmanToOpenAPIConverter.tsx b/src/components/PostmanToOpenAPIConverter.tsx index 5583877..30d9d7d 100644 --- a/src/components/PostmanToOpenAPIConverter.tsx +++ b/src/components/PostmanToOpenAPIConverter.tsx @@ -22,6 +22,17 @@ type PostmanFormData = { value: string; } +// Add response types +type PostmanResponse = { + name: string; + originalRequest?: PostmanRequest; + status?: string; + code?: number; + _postman_previewlanguage?: string; + header?: PostmanHeader[]; + body?: string; +} + type PostmanRequest = { url?: { raw?: string; @@ -53,6 +64,19 @@ type PostmanCollection = { item?: PostmanItem[]; } +// Updated OpenAPI types to include response content +interface ResponseContent { + description: string; + content?: { + [key: string]: { + schema: { + type: string; + example?: unknown; + }; + }; + }; +} + // New OpenAPI related interfaces interface Operation { tags?: string[]; @@ -337,6 +361,54 @@ const toYAML = (obj: Record, indent = 0): string => { return yaml; }; +// Add new function to process response examples +const processResponses = (item: PostmanItem): Record => { + const responses: Record = { + '200': { + description: 'Successful response' + } + }; + + if (item.response && item.response.length > 0) { + item.response.forEach(response => { + const statusCode = response.code?.toString() || '200'; + let contentType = 'application/json'; + + // Get content type from response headers + if (response.header) { + const ctHeader = response.header.find(h => h.key.toLowerCase() === 'content-type'); + if (ctHeader) { + contentType = ctHeader.value; + } + } + + let example: unknown = undefined; + if (response.body) { + try { + example = JSON.parse(response.body); + } catch { + example = response.body; + } + } + + responses[statusCode] = { + description: response.name || `${statusCode} response`, + content: example ? { + [contentType]: { + schema: { + type: typeof example === 'object' ? 'object' : 'string', + example + } + } + } : undefined + }; + }); + } + + return responses; +}; + +// Update the convertToOpenAPI function to include response processing const convertToOpenAPI = (collection: PostmanCollection): OpenAPISpec => { const openapi: OpenAPISpec = { openapi: '3.0.3', @@ -384,11 +456,7 @@ const convertToOpenAPI = (collection: PostmanCollection): OpenAPISpec => { description: item.request.description || '', operationId: `${method}${path.replace(/\W+/g, '')}`, parameters: processParameters(item.request), - responses: { - '200': { - description: 'Successful response' - } - } + responses: processResponses(item) }; if (!['get', 'head', 'delete'].includes(method)) { @@ -423,7 +491,6 @@ const convertToOpenAPI = (collection: PostmanCollection): OpenAPISpec => { return openapi; }; - const PostmanToOpenAPIConverter = () => { const [input, setInput] = useState(''); const [output, setOutput] = useState('');