diff --git a/packages/hydra-cli/src/commands/deployments/ls.ts b/packages/hydra-cli/src/commands/deployments/ls.ts index 0046fd2d5..7fe46714f 100644 --- a/packages/hydra-cli/src/commands/deployments/ls.ts +++ b/packages/hydra-cli/src/commands/deployments/ls.ts @@ -7,16 +7,19 @@ export default class Ls extends Command { async run(): Promise { const deployments = await deploymentList() - cli.table( - deployments, - { - id: {}, - status: {}, - name: {}, - artifactUrl: {}, - version: {}, - }, - {} - ) + if (deployments) { + cli.table( + deployments, + { + id: {}, + status: {}, + name: {}, + artifactUrl: {}, + version: {}, + deploymentUrl: {}, + }, + {} + ) + } } } diff --git a/packages/hydra-cli/src/rest-client/request.ts b/packages/hydra-cli/src/rest-client/request.ts new file mode 100644 index 000000000..3b8e9022d --- /dev/null +++ b/packages/hydra-cli/src/rest-client/request.ts @@ -0,0 +1,27 @@ +import * as fetch from 'node-fetch' +export async function request( + apiUrl: string, + fetchContext: fetch.RequestInit | undefined +): Promise { + const response = await fetch.default(apiUrl, fetchContext) + const responseBody = await response.clone().json() + if (response.status === 401) { + throw new Error( + `Bad credentials data. Run hydra-cli login or check your account` + ) + } else if (response.status === 400 && responseBody.errors.length === 0) { + throw new Error(responseBody.message) + } else if (response.status === 400 && responseBody.errors.length !== 0) { + let validationErrorString = 'some validation problems\n' + for (const error of responseBody.errors) { + for (const constraint of Object.values(error.constraints)) { + validationErrorString += `${constraint}\n` + } + } + throw new Error(validationErrorString) + } else if (response.status === 200) { + return response + } else { + throw new Error(`Server error`) + } +} diff --git a/packages/hydra-cli/src/rest-client/routes/deploy.ts b/packages/hydra-cli/src/rest-client/routes/deploy.ts index 762d47ef3..ec6734973 100644 --- a/packages/hydra-cli/src/rest-client/routes/deploy.ts +++ b/packages/hydra-cli/src/rest-client/routes/deploy.ts @@ -1,6 +1,6 @@ import { baseUrl } from '../baseUrl' import { getCreds } from '../../creds' -import fetch from 'node-fetch' +import { request } from '../request' export type ResponseBody = { id: string @@ -13,9 +13,9 @@ export type ResponseBody = { export async function deploy( deploymentName: string, artifactUrl: string -): Promise { +): Promise { const apiUrl = `${baseUrl}/client/deployment` - const response = await fetch(apiUrl, { + const response = await request(apiUrl, { method: 'post', body: JSON.stringify({ name: deploymentName, @@ -30,9 +30,5 @@ export async function deploy( const responseBody = await response.json() if (response.status === 200) { return `Created deployment with name ${responseBody.name}` - } else { - throw new Error( - `Failed, status ${response.status}, message: ${responseBody.message}` - ) } } diff --git a/packages/hydra-cli/src/rest-client/routes/deployments.ts b/packages/hydra-cli/src/rest-client/routes/deployments.ts index 935297aa5..25c61368a 100644 --- a/packages/hydra-cli/src/rest-client/routes/deployments.ts +++ b/packages/hydra-cli/src/rest-client/routes/deployments.ts @@ -1,6 +1,6 @@ import { baseUrl } from '../baseUrl' import { getCreds } from '../../creds' -import fetch from 'node-fetch' +import { request } from '../request' export type ResponseBody = { id: string @@ -10,9 +10,9 @@ export type ResponseBody = { version: number } -export async function deploymentList(): Promise { +export async function deploymentList(): Promise { const apiUrl = `${baseUrl}/client/deployment` - const response = await fetch(apiUrl, { + const response = await request(apiUrl, { method: 'get', headers: { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -23,9 +23,5 @@ export async function deploymentList(): Promise { const responseBody = await response.json() if (response.status === 200) { return responseBody - } else { - throw new Error( - `Failed, status ${response.status}, message: ${responseBody.message}` - ) } } diff --git a/packages/hydra-cli/src/rest-client/routes/me.ts b/packages/hydra-cli/src/rest-client/routes/me.ts index fc5ad1f22..d2b985127 100644 --- a/packages/hydra-cli/src/rest-client/routes/me.ts +++ b/packages/hydra-cli/src/rest-client/routes/me.ts @@ -1,9 +1,9 @@ import { baseUrl } from '../baseUrl' -import fetch from 'node-fetch' +import { request } from '../request' -export async function me(authToken: string): Promise { +export async function me(authToken: string): Promise { const apiUrl = `${baseUrl}/client/me` - const response = await fetch(apiUrl, { + const response = await request(apiUrl, { headers: { authorization: `token ${authToken}`, }, @@ -11,9 +11,5 @@ export async function me(authToken: string): Promise { const responseBody = await response.json() if (response.status === 200) { return `Successfully logged as ${responseBody.username}` - } else { - throw new Error( - `Failed, status ${response.status}, message: ${responseBody.message}` - ) } } diff --git a/packages/hydra-cli/test/rest/deploy-command.test.ts b/packages/hydra-cli/test/rest/deploy-command.test.ts index bb77ab0d8..3011c5fb6 100644 --- a/packages/hydra-cli/test/rest/deploy-command.test.ts +++ b/packages/hydra-cli/test/rest/deploy-command.test.ts @@ -57,7 +57,9 @@ describe('deploy command', () => { .do(() => creds.setCreds('test_creds')) // perhaps we got an expired or broken creds .command(['deploy', '-n', successResponseFixture.name]) .catch((err) => - expect(err.message.indexOf('status 401')).to.satisfy((index) => index > 0) + expect(err.message.indexOf('Run hydra-cli login')).to.satisfy( + (index) => index > 0 + ) ) .it('show error message when broken creds') })