From b5d3fa7cc78137b196cb0655a8c315e16a33f80b Mon Sep 17 00:00:00 2001 From: Alex Tulenko Date: Wed, 6 Dec 2023 11:24:07 -0500 Subject: [PATCH 1/2] support blob type --- src/templates/core/ApiRequestOptions.hbs | 1 + src/templates/core/angular/sendRequest.hbs | 3 ++- src/templates/core/axios/sendRequest.hbs | 1 + src/templates/core/fetch/getResponseBody.hbs | 4 +++- src/templates/core/fetch/request.hbs | 2 +- src/templates/core/node/getResponseBody.hbs | 4 +++- src/templates/core/node/request.hbs | 2 +- src/templates/core/xhr/getResponseBody.hbs | 4 +++- src/templates/core/xhr/request.hbs | 2 +- src/templates/core/xhr/sendRequest.hbs | 1 + src/templates/exportService.hbs | 3 +++ src/utils/registerHandlebarTemplates.ts | 2 ++ 12 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/templates/core/ApiRequestOptions.hbs b/src/templates/core/ApiRequestOptions.hbs index 355929a71..0998ce569 100644 --- a/src/templates/core/ApiRequestOptions.hbs +++ b/src/templates/core/ApiRequestOptions.hbs @@ -10,6 +10,7 @@ export type ApiRequestOptions = { readonly formData?: Record; readonly body?: any; readonly mediaType?: string; + readonly responseType?: 'blob'; readonly responseHeader?: string; readonly errors?: Record; }; diff --git a/src/templates/core/angular/sendRequest.hbs b/src/templates/core/angular/sendRequest.hbs index ad73d8332..79ada8bdf 100644 --- a/src/templates/core/angular/sendRequest.hbs +++ b/src/templates/core/angular/sendRequest.hbs @@ -7,10 +7,11 @@ export const sendRequest = ( formData: FormData | undefined, headers: HttpHeaders ): Observable> => { - return http.request(options.method, url, { + return http.request(options.method, url, { headers, body: body ?? formData, withCredentials: config.WITH_CREDENTIALS, observe: 'response', + responseType: options.responseType, }); }; diff --git a/src/templates/core/axios/sendRequest.hbs b/src/templates/core/axios/sendRequest.hbs index 51492bf3f..c52e07345 100644 --- a/src/templates/core/axios/sendRequest.hbs +++ b/src/templates/core/axios/sendRequest.hbs @@ -16,6 +16,7 @@ export const sendRequest = async ( data: body ?? formData, method: options.method, withCredentials: config.WITH_CREDENTIALS, + responseType: options.responseType, cancelToken: source.token, }; diff --git a/src/templates/core/fetch/getResponseBody.hbs b/src/templates/core/fetch/getResponseBody.hbs index 1011380ee..635a8ec3f 100644 --- a/src/templates/core/fetch/getResponseBody.hbs +++ b/src/templates/core/fetch/getResponseBody.hbs @@ -1,4 +1,4 @@ -export const getResponseBody = async (response: Response): Promise => { +export const getResponseBody = async (response: Response, options: ApiRequestOptions): Promise => { if (response.status !== 204) { try { const contentType = response.headers.get('Content-Type'); @@ -7,6 +7,8 @@ export const getResponseBody = async (response: Response): Promise => { const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); if (isJSON) { return await response.json(); + } else if (options.responseType === 'blob') { + return await response.blob(); } else { return await response.text(); } diff --git a/src/templates/core/fetch/request.hbs b/src/templates/core/fetch/request.hbs index 4af6f9440..ec6ed8492 100644 --- a/src/templates/core/fetch/request.hbs +++ b/src/templates/core/fetch/request.hbs @@ -72,7 +72,7 @@ export const request = (config: OpenAPIConfig, options: ApiRequestOptions): C if (!onCancel.isCancelled) { const response = await sendRequest(config, options, url, body, formData, headers, onCancel); - const responseBody = await getResponseBody(response); + const responseBody = await getResponseBody(response, options); const responseHeader = getResponseHeader(response, options.responseHeader); const result: ApiResult = { diff --git a/src/templates/core/node/getResponseBody.hbs b/src/templates/core/node/getResponseBody.hbs index 1011380ee..635a8ec3f 100644 --- a/src/templates/core/node/getResponseBody.hbs +++ b/src/templates/core/node/getResponseBody.hbs @@ -1,4 +1,4 @@ -export const getResponseBody = async (response: Response): Promise => { +export const getResponseBody = async (response: Response, options: ApiRequestOptions): Promise => { if (response.status !== 204) { try { const contentType = response.headers.get('Content-Type'); @@ -7,6 +7,8 @@ export const getResponseBody = async (response: Response): Promise => { const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); if (isJSON) { return await response.json(); + } else if (options.responseType === 'blob') { + return await response.blob(); } else { return await response.text(); } diff --git a/src/templates/core/node/request.hbs b/src/templates/core/node/request.hbs index 8e6f6110e..edf40a4cd 100644 --- a/src/templates/core/node/request.hbs +++ b/src/templates/core/node/request.hbs @@ -77,7 +77,7 @@ export const request = (config: OpenAPIConfig, options: ApiRequestOptions): C if (!onCancel.isCancelled) { const response = await sendRequest(options, url, body, formData, headers, onCancel); - const responseBody = await getResponseBody(response); + const responseBody = await getResponseBody(response, options); const responseHeader = getResponseHeader(response, options.responseHeader); const result: ApiResult = { diff --git a/src/templates/core/xhr/getResponseBody.hbs b/src/templates/core/xhr/getResponseBody.hbs index ccf83b1ff..a8148f3f0 100644 --- a/src/templates/core/xhr/getResponseBody.hbs +++ b/src/templates/core/xhr/getResponseBody.hbs @@ -1,4 +1,4 @@ -export const getResponseBody = (xhr: XMLHttpRequest): any => { +export const getResponseBody = (xhr: XMLHttpRequest, options: ApiRequestOptions): any => { if (xhr.status !== 204) { try { const contentType = xhr.getResponseHeader('Content-Type'); @@ -7,6 +7,8 @@ export const getResponseBody = (xhr: XMLHttpRequest): any => { const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); if (isJSON) { return JSON.parse(xhr.responseText); + } else if (options.responseType === 'blob') { + return xhr.response; } else { return xhr.responseText; } diff --git a/src/templates/core/xhr/request.hbs b/src/templates/core/xhr/request.hbs index 47f92870b..fe5992435 100644 --- a/src/templates/core/xhr/request.hbs +++ b/src/templates/core/xhr/request.hbs @@ -75,7 +75,7 @@ export const request = (config: OpenAPIConfig, options: ApiRequestOptions): C if (!onCancel.isCancelled) { const response = await sendRequest(config, options, url, body, formData, headers, onCancel); - const responseBody = getResponseBody(response); + const responseBody = getResponseBody(response, options); const responseHeader = getResponseHeader(response, options.responseHeader); const result: ApiResult = { diff --git a/src/templates/core/xhr/sendRequest.hbs b/src/templates/core/xhr/sendRequest.hbs index 0badf8daa..17b13ab1d 100644 --- a/src/templates/core/xhr/sendRequest.hbs +++ b/src/templates/core/xhr/sendRequest.hbs @@ -10,6 +10,7 @@ export const sendRequest = async ( const xhr = new XMLHttpRequest(); xhr.open(options.method, url, true); xhr.withCredentials = config.WITH_CREDENTIALS; + xhr.responseType = options.responseType; headers.forEach((value, key) => { xhr.setRequestHeader(key, value); diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index d6bccbbeb..1652b5b19 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -135,6 +135,9 @@ export class {{{name}}}{{{@root.postfix}}} { mediaType: '{{{parametersBody.mediaType}}}', {{/if}} {{/if}} + {{#if results}} + {{>responseType}} + {{/if}} {{#if responseHeader}} responseHeader: '{{{responseHeader}}}', {{/if}} diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index bf77cbdc1..cfd60b8ae 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -66,6 +66,7 @@ import partialIsNullable from '../templates/partials/isNullable.hbs'; import partialIsReadOnly from '../templates/partials/isReadOnly.hbs'; import partialIsRequired from '../templates/partials/isRequired.hbs'; import partialParameters from '../templates/partials/parameters.hbs'; +import partialResponseType from '../templates/partials/responseType.hbs'; import partialResult from '../templates/partials/result.hbs'; import partialSchema from '../templates/partials/schema.hbs'; import partialSchemaArray from '../templates/partials/schemaArray.hbs'; @@ -147,6 +148,7 @@ export const registerHandlebarTemplates = (root: { Handlebars.registerPartial('isReadOnly', Handlebars.template(partialIsReadOnly)); Handlebars.registerPartial('isRequired', Handlebars.template(partialIsRequired)); Handlebars.registerPartial('parameters', Handlebars.template(partialParameters)); + Handlebars.registerPartial('responseType', Handlebars.template(partialResponseType)); Handlebars.registerPartial('result', Handlebars.template(partialResult)); Handlebars.registerPartial('schema', Handlebars.template(partialSchema)); Handlebars.registerPartial('schemaArray', Handlebars.template(partialSchemaArray)); From 94fed0887a460b0fbad72e9321b40dee3b6d1a54 Mon Sep 17 00:00:00 2001 From: Alex Tulenko Date: Wed, 6 Dec 2023 12:07:19 -0500 Subject: [PATCH 2/2] Add missing file --- src/templates/partials/responseType.hbs | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/templates/partials/responseType.hbs diff --git a/src/templates/partials/responseType.hbs b/src/templates/partials/responseType.hbs new file mode 100644 index 000000000..8d16b8a68 --- /dev/null +++ b/src/templates/partials/responseType.hbs @@ -0,0 +1,5 @@ +{{~#equals results.length 1~}} + {{~#equals results.0.base 'binary'~}} + responseType: 'blob', + {{/equals}} +{{~/equals~}} \ No newline at end of file