From 2bb71d2097b1978c4796ace29fe401addfe2404a Mon Sep 17 00:00:00 2001 From: Simon Hanna Date: Wed, 11 Sep 2019 17:03:22 +0200 Subject: [PATCH 1/3] Use HttpError class when rejecting promises Fixes #3872 --- .../src/main/resources/typescript-node/api-all.mustache | 7 +++++++ .../src/main/resources/typescript-node/api-single.mustache | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/resources/typescript-node/api-all.mustache b/modules/openapi-generator/src/main/resources/typescript-node/api-all.mustache index 514b5e0d10fd..adac7f8cacb1 100644 --- a/modules/openapi-generator/src/main/resources/typescript-node/api-all.mustache +++ b/modules/openapi-generator/src/main/resources/typescript-node/api-all.mustache @@ -8,5 +8,12 @@ import { {{ classname }} } from './{{ classFilename }}'; export * from './{{ classFilename }}Interface' {{/withInterfaces}} {{/apis}} +import http = require('http'); +export class HttpError extends Error { + constructor (public response: http.{{#supportsES6}}IncomingMessage{{/supportsES6}}{{^supportsES6}}ClientResponse{{/supportsES6}}, public body: any, public statusCode?: number) { + super('HTTP request failed'); + this.name = 'HttpError'; + } +} export const APIS = [{{#apis}}{{#operations}}{{ classname }}{{/operations}}{{^-last}}, {{/-last}}{{/apis}}]; {{/apiInfo}} diff --git a/modules/openapi-generator/src/main/resources/typescript-node/api-single.mustache b/modules/openapi-generator/src/main/resources/typescript-node/api-single.mustache index 91b263cb5d22..53e16de1677a 100644 --- a/modules/openapi-generator/src/main/resources/typescript-node/api-single.mustache +++ b/modules/openapi-generator/src/main/resources/typescript-node/api-single.mustache @@ -22,6 +22,8 @@ import { OAuth } from '../model/models'; {{/authMethods}} {{/hasAuthMethods}} +import { HttpError } from './apis'; + let defaultBasePath = '{{{basePath}}}'; // =============================================== @@ -222,7 +224,7 @@ export class {{classname}} { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); From d28a320bf7ac64fe6771f8bd87f992d20f9077b1 Mon Sep 17 00:00:00 2001 From: Simon Hanna Date: Thu, 12 Sep 2019 08:45:27 +0200 Subject: [PATCH 2/3] Update samples --- .../typescript-node/default/api/apis.ts | 7 +++++++ .../typescript-node/default/api/petApi.ts | 18 ++++++++++-------- .../typescript-node/default/api/storeApi.ts | 10 ++++++---- .../typescript-node/default/api/userApi.ts | 18 ++++++++++-------- .../petstore/typescript-node/npm/api/apis.ts | 7 +++++++ .../petstore/typescript-node/npm/api/petApi.ts | 18 ++++++++++-------- .../typescript-node/npm/api/storeApi.ts | 10 ++++++---- .../typescript-node/npm/api/userApi.ts | 18 ++++++++++-------- 8 files changed, 66 insertions(+), 40 deletions(-) diff --git a/samples/client/petstore/typescript-node/default/api/apis.ts b/samples/client/petstore/typescript-node/default/api/apis.ts index 2bbfc445eaf0..d3fb76d4a5ab 100644 --- a/samples/client/petstore/typescript-node/default/api/apis.ts +++ b/samples/client/petstore/typescript-node/default/api/apis.ts @@ -4,4 +4,11 @@ export * from './storeApi'; import { StoreApi } from './storeApi'; export * from './userApi'; import { UserApi } from './userApi'; +import http = require('http'); +export class HttpError extends Error { + constructor (public response: http.ClientResponse, public body: any, public statusCode?: number) { + super('HTTP request failed'); + this.name = 'HttpError'; + } +} export const APIS = [PetApi, StoreApi, UserApi]; diff --git a/samples/client/petstore/typescript-node/default/api/petApi.ts b/samples/client/petstore/typescript-node/default/api/petApi.ts index 2566d2b93533..0131e39e7f25 100644 --- a/samples/client/petstore/typescript-node/default/api/petApi.ts +++ b/samples/client/petstore/typescript-node/default/api/petApi.ts @@ -21,6 +21,8 @@ import { ObjectSerializer, Authentication, VoidAuth } from '../model/models'; import { OAuth } from '../model/models'; import { ApiKeyAuth } from '../model/models'; +import { HttpError } from './apis'; + let defaultBasePath = 'http://petstore.swagger.io/v2'; // =============================================== @@ -129,7 +131,7 @@ export class PetApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -188,7 +190,7 @@ export class PetApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -249,7 +251,7 @@ export class PetApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -310,7 +312,7 @@ export class PetApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -368,7 +370,7 @@ export class PetApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -425,7 +427,7 @@ export class PetApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -492,7 +494,7 @@ export class PetApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -561,7 +563,7 @@ export class PetApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); diff --git a/samples/client/petstore/typescript-node/default/api/storeApi.ts b/samples/client/petstore/typescript-node/default/api/storeApi.ts index cf3b545a3d04..6d19eabc0a7b 100644 --- a/samples/client/petstore/typescript-node/default/api/storeApi.ts +++ b/samples/client/petstore/typescript-node/default/api/storeApi.ts @@ -19,6 +19,8 @@ import { Order } from '../model/order'; import { ObjectSerializer, Authentication, VoidAuth } from '../model/models'; import { ApiKeyAuth } from '../model/models'; +import { HttpError } from './apis'; + let defaultBasePath = 'http://petstore.swagger.io/v2'; // =============================================== @@ -120,7 +122,7 @@ export class StoreApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -171,7 +173,7 @@ export class StoreApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -227,7 +229,7 @@ export class StoreApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -283,7 +285,7 @@ export class StoreApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); diff --git a/samples/client/petstore/typescript-node/default/api/userApi.ts b/samples/client/petstore/typescript-node/default/api/userApi.ts index 374daf1f1bdf..eab57a38e453 100644 --- a/samples/client/petstore/typescript-node/default/api/userApi.ts +++ b/samples/client/petstore/typescript-node/default/api/userApi.ts @@ -18,6 +18,8 @@ import { User } from '../model/user'; import { ObjectSerializer, Authentication, VoidAuth } from '../model/models'; +import { HttpError } from './apis'; + let defaultBasePath = 'http://petstore.swagger.io/v2'; // =============================================== @@ -117,7 +119,7 @@ export class UserApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -172,7 +174,7 @@ export class UserApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -227,7 +229,7 @@ export class UserApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -282,7 +284,7 @@ export class UserApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -338,7 +340,7 @@ export class UserApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -407,7 +409,7 @@ export class UserApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -455,7 +457,7 @@ export class UserApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -517,7 +519,7 @@ export class UserApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); diff --git a/samples/client/petstore/typescript-node/npm/api/apis.ts b/samples/client/petstore/typescript-node/npm/api/apis.ts index 2bbfc445eaf0..d3fb76d4a5ab 100644 --- a/samples/client/petstore/typescript-node/npm/api/apis.ts +++ b/samples/client/petstore/typescript-node/npm/api/apis.ts @@ -4,4 +4,11 @@ export * from './storeApi'; import { StoreApi } from './storeApi'; export * from './userApi'; import { UserApi } from './userApi'; +import http = require('http'); +export class HttpError extends Error { + constructor (public response: http.ClientResponse, public body: any, public statusCode?: number) { + super('HTTP request failed'); + this.name = 'HttpError'; + } +} export const APIS = [PetApi, StoreApi, UserApi]; diff --git a/samples/client/petstore/typescript-node/npm/api/petApi.ts b/samples/client/petstore/typescript-node/npm/api/petApi.ts index 2566d2b93533..0131e39e7f25 100644 --- a/samples/client/petstore/typescript-node/npm/api/petApi.ts +++ b/samples/client/petstore/typescript-node/npm/api/petApi.ts @@ -21,6 +21,8 @@ import { ObjectSerializer, Authentication, VoidAuth } from '../model/models'; import { OAuth } from '../model/models'; import { ApiKeyAuth } from '../model/models'; +import { HttpError } from './apis'; + let defaultBasePath = 'http://petstore.swagger.io/v2'; // =============================================== @@ -129,7 +131,7 @@ export class PetApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -188,7 +190,7 @@ export class PetApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -249,7 +251,7 @@ export class PetApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -310,7 +312,7 @@ export class PetApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -368,7 +370,7 @@ export class PetApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -425,7 +427,7 @@ export class PetApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -492,7 +494,7 @@ export class PetApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -561,7 +563,7 @@ export class PetApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); diff --git a/samples/client/petstore/typescript-node/npm/api/storeApi.ts b/samples/client/petstore/typescript-node/npm/api/storeApi.ts index cf3b545a3d04..6d19eabc0a7b 100644 --- a/samples/client/petstore/typescript-node/npm/api/storeApi.ts +++ b/samples/client/petstore/typescript-node/npm/api/storeApi.ts @@ -19,6 +19,8 @@ import { Order } from '../model/order'; import { ObjectSerializer, Authentication, VoidAuth } from '../model/models'; import { ApiKeyAuth } from '../model/models'; +import { HttpError } from './apis'; + let defaultBasePath = 'http://petstore.swagger.io/v2'; // =============================================== @@ -120,7 +122,7 @@ export class StoreApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -171,7 +173,7 @@ export class StoreApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -227,7 +229,7 @@ export class StoreApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -283,7 +285,7 @@ export class StoreApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); diff --git a/samples/client/petstore/typescript-node/npm/api/userApi.ts b/samples/client/petstore/typescript-node/npm/api/userApi.ts index 374daf1f1bdf..eab57a38e453 100644 --- a/samples/client/petstore/typescript-node/npm/api/userApi.ts +++ b/samples/client/petstore/typescript-node/npm/api/userApi.ts @@ -18,6 +18,8 @@ import { User } from '../model/user'; import { ObjectSerializer, Authentication, VoidAuth } from '../model/models'; +import { HttpError } from './apis'; + let defaultBasePath = 'http://petstore.swagger.io/v2'; // =============================================== @@ -117,7 +119,7 @@ export class UserApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -172,7 +174,7 @@ export class UserApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -227,7 +229,7 @@ export class UserApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -282,7 +284,7 @@ export class UserApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -338,7 +340,7 @@ export class UserApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -407,7 +409,7 @@ export class UserApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -455,7 +457,7 @@ export class UserApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); @@ -517,7 +519,7 @@ export class UserApi { if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { resolve({ response: response, body: body }); } else { - reject({ response: response, body: body }); + reject(new HttpError(response, body, response.statusCode)); } } }); From 4c2044964fb4892a4bfafc7239f82754aea3054f Mon Sep 17 00:00:00 2001 From: Simon Hanna Date: Thu, 12 Sep 2019 13:40:46 +0200 Subject: [PATCH 3/3] Test the new code in client.ts --- .../client/petstore/typescript-node/npm/client.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/samples/client/petstore/typescript-node/npm/client.ts b/samples/client/petstore/typescript-node/npm/client.ts index 1dc7593c31c3..9bd1d10f7c42 100644 --- a/samples/client/petstore/typescript-node/npm/client.ts +++ b/samples/client/petstore/typescript-node/npm/client.ts @@ -155,5 +155,16 @@ petApi.addPet(pet) }) .then((res) => { console.log('Deleted pet'); - process.exit(exitCode); + // process.exit(exitCode); + petApi.deletePet(petId).then((res) => { + throw new Error('Unexpected success'); + }).catch((e) => { + if (e instanceof Error && e.name === 'HttpError' && e.message === 'HTTP request failed') { + console.log('Throws Http Errors correctly'); + process.exit(exitCode); + } else { + throw new Error(`Throws unexpected error:\n ${e}`); + } + }); + // process.exit(exitCode); });