From 4b2ae51e9b98eb0ff8cdcc876a5b477de440e28b Mon Sep 17 00:00:00 2001 From: Daniele De Matteo Date: Wed, 12 Jan 2022 09:35:41 +0100 Subject: [PATCH 1/2] fix pick format allow for file array in form data requests --- .../base/http-clients/axios-http-client.eta | 19 ++++++++++++++++++- tests/spec/axios/schema.ts | 19 ++++++++++++++++++- tests/spec/axiosSingleHttpClient/schema.ts | 19 ++++++++++++++++++- tests/spec/jsAxios/schema.js | 17 ++++++++++++++++- 4 files changed, 70 insertions(+), 4 deletions(-) diff --git a/templates/base/http-clients/axios-http-client.eta b/templates/base/http-clients/axios-http-client.eta index 54534d505..0e3aa4adc 100644 --- a/templates/base/http-clients/axios-http-client.eta +++ b/templates/base/http-clients/axios-http-client.eta @@ -67,6 +67,23 @@ export class HttpClient { } private createFormData(input: Record): FormData { + return Object.keys(input || {}).reduce((formData, key) => { + let property = input[key]; + let propertyContent: Iterable = (property instanceof Array) ? property : [property] + + for (const formItem of propertyContent) { + formData.append( + key, + formItem instanceof Blob || formItem instanceof File + ? formItem + : typeof formItem === "object" && formItem !== null + ? JSON.stringify(formItem) + : `${formItem}`, + ); + } + + return formData; + }, new FormData()); return Object.keys(input || {}).reduce((formData, key) => { const property = input[key]; formData.append( @@ -96,7 +113,7 @@ export class HttpClient { <% } %> const secureParams = ((typeof secure === 'boolean' ? secure : this.secure) && this.securityWorker && (await this.securityWorker(this.securityData))) || {}; const requestParams = this.mergeRequestParams(params, secureParams); - const responseFormat = (format && this.format) || void 0; + const responseFormat = (format || this.format) || void 0; if (type === ContentType.FormData && body && body !== null && typeof body === "object") { requestParams.headers.common = { Accept: "*/*" }; diff --git a/tests/spec/axios/schema.ts b/tests/spec/axios/schema.ts index f68722ba9..fb7c0a214 100644 --- a/tests/spec/axios/schema.ts +++ b/tests/spec/axios/schema.ts @@ -1511,6 +1511,23 @@ export class HttpClient { } private createFormData(input: Record): FormData { + return Object.keys(input || {}).reduce((formData, key) => { + let property = input[key]; + let propertyContent: Iterable = property instanceof Array ? property : [property]; + + for (const formItem of propertyContent) { + formData.append( + key, + formItem instanceof Blob || formItem instanceof File + ? formItem + : typeof formItem === "object" && formItem !== null + ? JSON.stringify(formItem) + : `${formItem}`, + ); + } + + return formData; + }, new FormData()); return Object.keys(input || {}).reduce((formData, key) => { const property = input[key]; formData.append( @@ -1540,7 +1557,7 @@ export class HttpClient { (await this.securityWorker(this.securityData))) || {}; const requestParams = this.mergeRequestParams(params, secureParams); - const responseFormat = (format && this.format) || void 0; + const responseFormat = format || this.format || void 0; if (type === ContentType.FormData && body && body !== null && typeof body === "object") { requestParams.headers.common = { Accept: "*/*" }; diff --git a/tests/spec/axiosSingleHttpClient/schema.ts b/tests/spec/axiosSingleHttpClient/schema.ts index bf49250e8..38bd0288f 100644 --- a/tests/spec/axiosSingleHttpClient/schema.ts +++ b/tests/spec/axiosSingleHttpClient/schema.ts @@ -1511,6 +1511,23 @@ export class HttpClient { } private createFormData(input: Record): FormData { + return Object.keys(input || {}).reduce((formData, key) => { + let property = input[key]; + let propertyContent: Iterable = property instanceof Array ? property : [property]; + + for (const formItem of propertyContent) { + formData.append( + key, + formItem instanceof Blob || formItem instanceof File + ? formItem + : typeof formItem === "object" && formItem !== null + ? JSON.stringify(formItem) + : `${formItem}`, + ); + } + + return formData; + }, new FormData()); return Object.keys(input || {}).reduce((formData, key) => { const property = input[key]; formData.append( @@ -1540,7 +1557,7 @@ export class HttpClient { (await this.securityWorker(this.securityData))) || {}; const requestParams = this.mergeRequestParams(params, secureParams); - const responseFormat = (format && this.format) || void 0; + const responseFormat = format || this.format || void 0; if (type === ContentType.FormData && body && body !== null && typeof body === "object") { requestParams.headers.common = { Accept: "*/*" }; diff --git a/tests/spec/jsAxios/schema.js b/tests/spec/jsAxios/schema.js index 5b6a5b6e5..71adbbd52 100644 --- a/tests/spec/jsAxios/schema.js +++ b/tests/spec/jsAxios/schema.js @@ -29,7 +29,7 @@ export class HttpClient { (await this.securityWorker(this.securityData))) || {}; const requestParams = this.mergeRequestParams(params, secureParams); - const responseFormat = (format && this.format) || void 0; + const responseFormat = format || this.format || void 0; if (type === ContentType.FormData && body && body !== null && typeof body === "object") { requestParams.headers.common = { Accept: "*/*" }; requestParams.headers.post = {}; @@ -66,6 +66,21 @@ export class HttpClient { }; } createFormData(input) { + return Object.keys(input || {}).reduce((formData, key) => { + let property = input[key]; + let propertyContent = property instanceof Array ? property : [property]; + for (const formItem of propertyContent) { + formData.append( + key, + formItem instanceof Blob || formItem instanceof File + ? formItem + : typeof formItem === "object" && formItem !== null + ? JSON.stringify(formItem) + : `${formItem}`, + ); + } + return formData; + }, new FormData()); return Object.keys(input || {}).reduce((formData, key) => { const property = input[key]; formData.append( From 4170b69d70ad14725fa318cd5bd01599a03cfe51 Mon Sep 17 00:00:00 2001 From: Marcus Dunn Date: Sun, 13 Mar 2022 15:27:44 -0700 Subject: [PATCH 2/2] fixed code review suggestions --- .../base/http-clients/axios-http-client.eta | 22 ++++++++++------- tests/spec/axios/schema.ts | 24 ++++++++++--------- tests/spec/jsAxios/schema.d.ts | 1 + tests/spec/jsAxios/schema.js | 23 +++++++++--------- 4 files changed, 40 insertions(+), 30 deletions(-) diff --git a/templates/base/http-clients/axios-http-client.eta b/templates/base/http-clients/axios-http-client.eta index 0e3aa4adc..bdc6707b2 100644 --- a/templates/base/http-clients/axios-http-client.eta +++ b/templates/base/http-clients/axios-http-client.eta @@ -66,19 +66,25 @@ export class HttpClient { }; } + private stringifyFormItem(formItem: any): string { + if (typeof formItem === "object" && formItem !== null) { + return JSON.stringify(formItem) + } else { + return `${formItem}` + }; + } + + private createFormData(input: Record): FormData { return Object.keys(input || {}).reduce((formData, key) => { - let property = input[key]; - let propertyContent: Iterable = (property instanceof Array) ? property : [property] + const property = input[key]; + const propertyContent: Iterable = (property instanceof Array) ? property : [property] for (const formItem of propertyContent) { + const isFileType = formItem instanceof Blob || formItem instanceof File; formData.append( key, - formItem instanceof Blob || formItem instanceof File - ? formItem - : typeof formItem === "object" && formItem !== null - ? JSON.stringify(formItem) - : `${formItem}`, + isFileType ? formItem : this.stringifyFormItem(formItem) ); } @@ -113,7 +119,7 @@ export class HttpClient { <% } %> const secureParams = ((typeof secure === 'boolean' ? secure : this.secure) && this.securityWorker && (await this.securityWorker(this.securityData))) || {}; const requestParams = this.mergeRequestParams(params, secureParams); - const responseFormat = (format || this.format) || void 0; + const responseFormat = (format || this.format) || undefined; if (type === ContentType.FormData && body && body !== null && typeof body === "object") { requestParams.headers.common = { Accept: "*/*" }; diff --git a/tests/spec/axios/schema.ts b/tests/spec/axios/schema.ts index fb7c0a214..b08d305ca 100644 --- a/tests/spec/axios/schema.ts +++ b/tests/spec/axios/schema.ts @@ -1510,20 +1510,22 @@ export class HttpClient { }; } + private stringifyFormItem(formItem: any): string { + if (typeof formItem === "object" && formItem !== null) { + return JSON.stringify(formItem); + } else { + return `${formItem}`; + } + } + private createFormData(input: Record): FormData { return Object.keys(input || {}).reduce((formData, key) => { - let property = input[key]; - let propertyContent: Iterable = property instanceof Array ? property : [property]; + const property = input[key]; + const propertyContent: Iterable = property instanceof Array ? property : [property]; for (const formItem of propertyContent) { - formData.append( - key, - formItem instanceof Blob || formItem instanceof File - ? formItem - : typeof formItem === "object" && formItem !== null - ? JSON.stringify(formItem) - : `${formItem}`, - ); + const isFileType = formItem instanceof Blob || formItem instanceof File; + formData.append(key, isFileType ? formItem : this.stringifyFormItem(formItem)); } return formData; @@ -1557,7 +1559,7 @@ export class HttpClient { (await this.securityWorker(this.securityData))) || {}; const requestParams = this.mergeRequestParams(params, secureParams); - const responseFormat = format || this.format || void 0; + const responseFormat = format || this.format || undefined; if (type === ContentType.FormData && body && body !== null && typeof body === "object") { requestParams.headers.common = { Accept: "*/*" }; diff --git a/tests/spec/jsAxios/schema.d.ts b/tests/spec/jsAxios/schema.d.ts index e9c2e48e5..882a1aa7c 100644 --- a/tests/spec/jsAxios/schema.d.ts +++ b/tests/spec/jsAxios/schema.d.ts @@ -1740,6 +1740,7 @@ export declare class HttpClient { constructor({ securityWorker, secure, format, ...axiosConfig }?: ApiConfig); setSecurityData: (data: SecurityDataType | null) => void; private mergeRequestParams; + private stringifyFormItem; private createFormData; request: ({ secure, diff --git a/tests/spec/jsAxios/schema.js b/tests/spec/jsAxios/schema.js index 71adbbd52..62a803512 100644 --- a/tests/spec/jsAxios/schema.js +++ b/tests/spec/jsAxios/schema.js @@ -29,7 +29,7 @@ export class HttpClient { (await this.securityWorker(this.securityData))) || {}; const requestParams = this.mergeRequestParams(params, secureParams); - const responseFormat = format || this.format || void 0; + const responseFormat = format || this.format || undefined; if (type === ContentType.FormData && body && body !== null && typeof body === "object") { requestParams.headers.common = { Accept: "*/*" }; requestParams.headers.post = {}; @@ -65,19 +65,20 @@ export class HttpClient { }, }; } + stringifyFormItem(formItem) { + if (typeof formItem === "object" && formItem !== null) { + return JSON.stringify(formItem); + } else { + return `${formItem}`; + } + } createFormData(input) { return Object.keys(input || {}).reduce((formData, key) => { - let property = input[key]; - let propertyContent = property instanceof Array ? property : [property]; + const property = input[key]; + const propertyContent = property instanceof Array ? property : [property]; for (const formItem of propertyContent) { - formData.append( - key, - formItem instanceof Blob || formItem instanceof File - ? formItem - : typeof formItem === "object" && formItem !== null - ? JSON.stringify(formItem) - : `${formItem}`, - ); + const isFileType = formItem instanceof Blob || formItem instanceof File; + formData.append(key, isFileType ? formItem : stringifyFormItem(formItem)); } return formData; }, new FormData());