From 4720467cbb96b0ea05d2ebd8c9ee54fb2d0c272a Mon Sep 17 00:00:00 2001 From: Tino Fuhrmann Date: Sun, 3 Mar 2019 23:30:43 +0100 Subject: [PATCH] Fixed file uploads --- .../languages/TypeScriptClientCodegen.java | 4 +++- .../resources/typescript/api/api.mustache | 9 ++++++-- .../typescript/generators/PromiseAPI.mustache | 2 +- .../resources/typescript/http/http.mustache | 4 ++++ .../typescript/builds/default/PromiseAPI.ts | 4 ++-- .../typescript/builds/default/apis/PetApi.ts | 12 +++++----- .../builds/default/apis/StoreApi.ts | 2 +- .../typescript/builds/default/apis/UserApi.ts | 2 +- .../typescript/builds/default/http/http.ts | 4 ++++ .../tests/default/package-lock.json | 10 +++------ .../tests/default/test/api/PetApi.test.ts | 21 +++++++++++------- .../typescript/tests/default/test/api/pet.png | Bin 0 -> 1122 bytes 12 files changed, 45 insertions(+), 29 deletions(-) create mode 100644 samples/client/petstore/typescript/tests/default/test/api/pet.png diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptClientCodegen.java index 5fd3214b5e2..159b2763ed6 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptClientCodegen.java @@ -107,6 +107,7 @@ public class TypeScriptClientCodegen extends DefaultCodegen implements CodegenCo typeMapping.put("date", "string"); typeMapping.put("DateTime", "Date"); typeMapping.put("binary", "any"); + // TODO: allow other types for file e.g. Blob typeMapping.put("File", "any"); typeMapping.put("ByteArray", "string"); typeMapping.put("UUID", "string"); @@ -677,7 +678,8 @@ public class TypeScriptClientCodegen extends DefaultCodegen implements CodegenCo inner = (Schema) p.getAdditionalProperties(); return "{ [key: string]: " + this.getTypeDeclaration(inner) + "; }"; } else if (ModelUtils.isFileSchema(p)) { - return "any"; + // TODO: Change type declaration + return "HttpFile"; } else if (ModelUtils.isBinarySchema(p)) { return "any"; } else { diff --git a/modules/openapi-generator/src/main/resources/typescript/api/api.mustache b/modules/openapi-generator/src/main/resources/typescript/api/api.mustache index 93cc09a5060..79d3353951d 100644 --- a/modules/openapi-generator/src/main/resources/typescript/api/api.mustache +++ b/modules/openapi-generator/src/main/resources/typescript/api/api.mustache @@ -1,6 +1,6 @@ // TODO: better import syntax? import { BaseAPIRequestFactory, RequiredError } from './baseapi'; -import { RequestContext, HttpMethod, ResponseContext} from '../http/http'; +import { RequestContext, HttpMethod, ResponseContext, HttpFile} from '../http/http'; import * as FormData from "form-data"; import {ObjectSerializer} from '../models/ObjectSerializer'; import {ApiException} from './exception'; @@ -68,7 +68,12 @@ export class {{classname}}RequestFactory extends BaseAPIRequestFactory { {{^isListContainer}} if ({{paramName}} !== undefined) { // TODO: replace .append with .set - localVarFormParams.append('{{baseName}}', {{paramName}} as any); + {{^isFile}} + localVarFormParams.append('{{baseName}}', {{paramName}} as any); + {{/isFile}} + {{#isFile}} + localVarFormParams.append('{{baseName}}', {{paramName}}.data, { "filename": {{paramName}}.name }); + {{/isFile}} } {{/isListContainer}} {{/formParams}} diff --git a/modules/openapi-generator/src/main/resources/typescript/generators/PromiseAPI.mustache b/modules/openapi-generator/src/main/resources/typescript/generators/PromiseAPI.mustache index 4922915ba5c..07e9a60ba7d 100644 --- a/modules/openapi-generator/src/main/resources/typescript/generators/PromiseAPI.mustache +++ b/modules/openapi-generator/src/main/resources/typescript/generators/PromiseAPI.mustache @@ -1,4 +1,4 @@ -import { ResponseContext } from './http/http'; +import { ResponseContext, HttpFile } from './http/http'; import * as models from './models/all'; import { Configuration} from './configuration' diff --git a/modules/openapi-generator/src/main/resources/typescript/http/http.mustache b/modules/openapi-generator/src/main/resources/typescript/http/http.mustache index e23d864203c..8e11238e3c7 100644 --- a/modules/openapi-generator/src/main/resources/typescript/http/http.mustache +++ b/modules/openapi-generator/src/main/resources/typescript/http/http.mustache @@ -15,6 +15,10 @@ export enum HttpMethod { TRACE = "TRACE", PATCH = "PATCH" } +export interface HttpFile { + data: Buffer; + name: string; +} export interface FormEntry { contentDisposition: string; diff --git a/samples/client/petstore/typescript/builds/default/PromiseAPI.ts b/samples/client/petstore/typescript/builds/default/PromiseAPI.ts index d6888f214b5..2b89bbc5fd7 100644 --- a/samples/client/petstore/typescript/builds/default/PromiseAPI.ts +++ b/samples/client/petstore/typescript/builds/default/PromiseAPI.ts @@ -1,4 +1,4 @@ -import { ResponseContext } from './http/http'; +import { ResponseContext, HttpFile } from './http/http'; import * as models from './models/all'; import { Configuration} from './configuration' @@ -152,7 +152,7 @@ export class PetApi { }); } - public uploadFile(petId: number, additionalMetadata?: string, file?: any, options?: any): Promise { + public uploadFile(petId: number, additionalMetadata?: string, file?: HttpFile, options?: any): Promise { const requestContext = this.requestFactory.uploadFile(petId, additionalMetadata, file, options); // build promise chain diff --git a/samples/client/petstore/typescript/builds/default/apis/PetApi.ts b/samples/client/petstore/typescript/builds/default/apis/PetApi.ts index f7a19f1ece0..b5a654bb50b 100644 --- a/samples/client/petstore/typescript/builds/default/apis/PetApi.ts +++ b/samples/client/petstore/typescript/builds/default/apis/PetApi.ts @@ -1,6 +1,6 @@ // TODO: better import syntax? import { BaseAPIRequestFactory, RequiredError } from './baseapi'; -import { RequestContext, HttpMethod, ResponseContext} from '../http/http'; +import { RequestContext, HttpMethod, ResponseContext, HttpFile} from '../http/http'; import * as FormData from "form-data"; import {ObjectSerializer} from '../models/ObjectSerializer'; import {ApiException} from './exception'; @@ -253,11 +253,11 @@ export class PetApiRequestFactory extends BaseAPIRequestFactory { if (name !== undefined) { // TODO: replace .append with .set - localVarFormParams.append('name', name as any); + localVarFormParams.append('name', name as any); } if (status !== undefined) { // TODO: replace .append with .set - localVarFormParams.append('status', status as any); + localVarFormParams.append('status', status as any); } requestContext.setBody(localVarFormParams); @@ -273,7 +273,7 @@ export class PetApiRequestFactory extends BaseAPIRequestFactory { return requestContext; } - public uploadFile(petId: number, additionalMetadata?: string, file?: any, options?: any): RequestContext { + public uploadFile(petId: number, additionalMetadata?: string, file?: HttpFile, options?: any): RequestContext { // verify required parameter 'petId' is not null or undefined if (petId === null || petId === undefined) { throw new RequiredError('Required parameter petId was null or undefined when calling uploadFile.'); @@ -297,11 +297,11 @@ export class PetApiRequestFactory extends BaseAPIRequestFactory { if (additionalMetadata !== undefined) { // TODO: replace .append with .set - localVarFormParams.append('additionalMetadata', additionalMetadata as any); + localVarFormParams.append('additionalMetadata', additionalMetadata as any); } if (file !== undefined) { // TODO: replace .append with .set - localVarFormParams.append('file', file as any); + localVarFormParams.append('file', file.data, { "filename": file.name }); } requestContext.setBody(localVarFormParams); diff --git a/samples/client/petstore/typescript/builds/default/apis/StoreApi.ts b/samples/client/petstore/typescript/builds/default/apis/StoreApi.ts index 67ca8296df6..9908e231924 100644 --- a/samples/client/petstore/typescript/builds/default/apis/StoreApi.ts +++ b/samples/client/petstore/typescript/builds/default/apis/StoreApi.ts @@ -1,6 +1,6 @@ // TODO: better import syntax? import { BaseAPIRequestFactory, RequiredError } from './baseapi'; -import { RequestContext, HttpMethod, ResponseContext} from '../http/http'; +import { RequestContext, HttpMethod, ResponseContext, HttpFile} from '../http/http'; import * as FormData from "form-data"; import {ObjectSerializer} from '../models/ObjectSerializer'; import {ApiException} from './exception'; diff --git a/samples/client/petstore/typescript/builds/default/apis/UserApi.ts b/samples/client/petstore/typescript/builds/default/apis/UserApi.ts index c5bdf836ef6..fb70caee35a 100644 --- a/samples/client/petstore/typescript/builds/default/apis/UserApi.ts +++ b/samples/client/petstore/typescript/builds/default/apis/UserApi.ts @@ -1,6 +1,6 @@ // TODO: better import syntax? import { BaseAPIRequestFactory, RequiredError } from './baseapi'; -import { RequestContext, HttpMethod, ResponseContext} from '../http/http'; +import { RequestContext, HttpMethod, ResponseContext, HttpFile} from '../http/http'; import * as FormData from "form-data"; import {ObjectSerializer} from '../models/ObjectSerializer'; import {ApiException} from './exception'; diff --git a/samples/client/petstore/typescript/builds/default/http/http.ts b/samples/client/petstore/typescript/builds/default/http/http.ts index e23d864203c..8e11238e3c7 100644 --- a/samples/client/petstore/typescript/builds/default/http/http.ts +++ b/samples/client/petstore/typescript/builds/default/http/http.ts @@ -15,6 +15,10 @@ export enum HttpMethod { TRACE = "TRACE", PATCH = "PATCH" } +export interface HttpFile { + data: Buffer; + name: string; +} export interface FormEntry { contentDisposition: string; diff --git a/samples/client/petstore/typescript/tests/default/package-lock.json b/samples/client/petstore/typescript/tests/default/package-lock.json index 8c91101d444..de0cb9aad91 100644 --- a/samples/client/petstore/typescript/tests/default/package-lock.json +++ b/samples/client/petstore/typescript/tests/default/package-lock.json @@ -1313,14 +1313,14 @@ } }, "mime-db": { - "version": "1.36.0", + "version": "1.37.0", "bundled": true }, "mime-types": { - "version": "2.1.20", + "version": "2.1.21", "bundled": true, "requires": { - "mime-db": "~1.36.0" + "mime-db": "~1.37.0" } }, "node-fetch": { @@ -1343,10 +1343,6 @@ "version": "2.1.2", "bundled": true }, - "typescript": { - "version": "2.9.2", - "bundled": true - }, "url-parse": { "version": "1.4.3", "bundled": true, diff --git a/samples/client/petstore/typescript/tests/default/test/api/PetApi.test.ts b/samples/client/petstore/typescript/tests/default/test/api/PetApi.test.ts index bdd6f52fb34..012dabaf4ef 100644 --- a/samples/client/petstore/typescript/tests/default/test/api/PetApi.test.ts +++ b/samples/client/petstore/typescript/tests/default/test/api/PetApi.test.ts @@ -1,5 +1,6 @@ -import {PetApi, Configuration, Pet, ApiException, Tag} from 'ts-petstore-client' +import {PetApi, Configuration, Pet, ApiException, Tag, HttpFile} from 'ts-petstore-client' import { expect, assert } from "chai"; +import * as fs from 'fs'; const configuration = new Configuration() const petApi = new PetApi(configuration) @@ -18,8 +19,6 @@ pet.category = undefined describe("PetApi", () =>{ it("addPet", (done) => { - - petApi.addPet(pet).then(() => { return petApi.getPetById(pet.id) }).then((createdPet) => { @@ -38,7 +37,7 @@ describe("PetApi", () =>{ }).then((pet: Pet) => { done("Pet with id " + pet.id + " was not deleted!"); }).catch((err: any) => { - if (err instanceof ApiException && err.code == 404) { + if (err.code && err.code == 404) { done(); } else { done(err) @@ -118,8 +117,14 @@ describe("PetApi", () =>{ }) })*/ -/* it("", (done) => { - file - petApi.uploadFile(pet.id, "", file) - })*/ + it("uploadFile", (done) => { + const image = fs.readFileSync(__dirname + "/pet.png") + petApi.uploadFile(pet.id, "Metadata", { name: "pet.png", data: image}).then((response: any) => { + expect(response.code).to.be.gte(200).and.lt(300); + expect(response.message).to.contain("pet.png"); + done(); + }).catch((err) => { + done(err); + }) + }) }) \ No newline at end of file diff --git a/samples/client/petstore/typescript/tests/default/test/api/pet.png b/samples/client/petstore/typescript/tests/default/test/api/pet.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a9c49163db88f92e798e1c2aa4920ee6190829 GIT binary patch literal 1122 zcmV-o1fBbdP)Pv>k;Jhr>-0WM zqfHxc(XJkZAh2f0;gAyF_nm#aN+~I&5JCvSdygNrRv`otbzNtS>AFs9t+kd?a?T%* z)A#7L)>>=MIfSsT>+N=1*LB-A5GbWmN`2o8Avot!O8oc*!M^V~=NO~+exB!Pnm~|q zCL*nM&UxQ=B9c;K=bS%s{33&8S(arvpU=y(AOmad>+35KS!W+5c8t}76wlv2uV+qP|sF_u#B{a1pN5)la@o}qyrW6U{w@3(CWA;cI_WK=ch zTuQ06g5V1dV~k2Eob!F(rIe4d06nGTy@zw=d0y8QOr;beGREZlLO(rs6>Zz5lu}AD z#-J6{#4&&_%i_I9m&F)kjGS{sopWxu&-yUNXrAY;>ku*$-1i-^LvD1y^?IG>IfSrn zTT1CMl#~*%ng*W;VCtN+F@}g>%~sOu^?E*^=Xpl>>$;|t5H%4!;tC;-GkAZ0AIH%- zmve@NODWBim&*msb-7&N&YUwW)O3fowbp-TugAj{=f)Uo?KqCZFuc6H48t%CgSGbgGGL5R z2tf#e*?{wiw>1$Fp?dHo5fPDd?sPi6y}f}zYmJf|5CFHSeBQE5_0x-rt=4g|TbKZ3w z4AX`Ox)hbvTKD(moa_4@lt}J?0NP0@@loIR2p?%ddfd9`ENgAob#SLK#yNL**Z(De zENB^H4DP=M*EkTn5CYE=M2%C2{q?B^_zuSqpi;_O3sA-w^u-N>#}AIQ2>yl67$fH# zo-}Aq?6}178_@09({S!_n_SH&_zh5eBkt=b(0^-yCcu4wkgc_N79w7N z!cJ}f;iA*&gpNhLz-5fVR89SMq5gJJ*L9c>=p(c{+OkRUf6yNUecxly!!t;t$@0BJ oenc<~0|qjrfO8I?vH!RJ0MkcqZO@AHAOHXW07*qoM6N<$f;dkN^Z)<= literal 0 HcmV?d00001