From dc2907aced112b947543f6d50dc118d7a44c28c8 Mon Sep 17 00:00:00 2001 From: aeb-sia <50743092+aeb-sia@users.noreply.github.com> Date: Thu, 12 Sep 2019 14:44:56 +0200 Subject: [PATCH] typescript-node: Use HttpError class when rejecting promises (#3876) * Use HttpError class when rejecting promises Fixes #3872 * Update samples * Test the new code in client.ts --- .../resources/typescript-node/api-all.mustache | 7 +++++++ .../typescript-node/api-single.mustache | 4 +++- .../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 ++++++++++-------- .../petstore/typescript-node/npm/client.ts | 13 ++++++++++++- 11 files changed, 88 insertions(+), 42 deletions(-) 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 514b5e0d10f..adac7f8cacb 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 91b263cb5d2..53e16de1677 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)); } } }); diff --git a/samples/client/petstore/typescript-node/default/api/apis.ts b/samples/client/petstore/typescript-node/default/api/apis.ts index 2bbfc445eaf..d3fb76d4a5a 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 2566d2b9353..0131e39e7f2 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 cf3b545a3d0..6d19eabc0a7 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 374daf1f1bd..eab57a38e45 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 2bbfc445eaf..d3fb76d4a5a 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 2566d2b9353..0131e39e7f2 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 cf3b545a3d0..6d19eabc0a7 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 374daf1f1bd..eab57a38e45 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)); } } }); diff --git a/samples/client/petstore/typescript-node/npm/client.ts b/samples/client/petstore/typescript-node/npm/client.ts index 1dc7593c31c..9bd1d10f7c4 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); });