From 15ac75c90c1686a6dd58e7b2036d6e9a5f3dbbc4 Mon Sep 17 00:00:00 2001 From: Shikanime Deva Date: Fri, 26 Jun 2026 15:03:58 +0200 Subject: [PATCH] refactor: use HTTP code constant from NestJS instead of static values Signed-off-by: William Phetsinorath Change-Id: I5b6db65fcf411b3bfddc4a72430b8d4c6a6a6964 --- .../MODULARISATION-CARTOGRAPHIE.md | 2 +- .../src/modules/argocd/argocd-health.service.ts | 4 ++-- .../src/modules/gitlab/gitlab-health.service.ts | 4 ++-- .../src/modules/keycloak/keycloak-health.service.ts | 4 ++-- .../src/modules/nexus/nexus-health.service.ts | 4 ++-- .../src/modules/nexus/nexus-http-client.service.ts | 10 +++++----- .../src/modules/opencds/opencds-health.service.ts | 4 ++-- .../src/modules/project/project.controller.ts | 8 ++++---- .../src/modules/registry/registry-health.service.ts | 4 ++-- .../modules/registry/registry-http-client.service.ts | 10 +++++----- .../src/modules/registry/registry-testing.utils.ts | 7 ++++--- .../src/modules/registry/registry.service.spec.ts | 7 ++++--- .../modules/service-chain/open-cds-client.service.ts | 3 ++- .../src/modules/service-chain/service-chain.utils.ts | 3 ++- .../src/modules/sonarqube/sonarqube-health.service.ts | 4 ++-- .../modules/sonarqube/sonarqube-http-client.service.ts | 10 +++++----- .../src/modules/vault/vault-health.service.ts | 4 ++-- .../src/modules/vault/vault-http-client.service.ts | 8 ++++---- 18 files changed, 52 insertions(+), 48 deletions(-) diff --git a/apps/server-nestjs/documentation/Modularisation-de-console-server/MODULARISATION-CARTOGRAPHIE.md b/apps/server-nestjs/documentation/Modularisation-de-console-server/MODULARISATION-CARTOGRAPHIE.md index d9c3066263..a5e6b10c1d 100644 --- a/apps/server-nestjs/documentation/Modularisation-de-console-server/MODULARISATION-CARTOGRAPHIE.md +++ b/apps/server-nestjs/documentation/Modularisation-de-console-server/MODULARISATION-CARTOGRAPHIE.md @@ -18,7 +18,7 @@ Cartographier l'ensemble des modules de l'application backend actuelle pour : | Decision | Choix | |----------|-------| -| Approche migration | Bottom-up (feuilles d'abord, puis remontee vers les modules couples) | +| Approche migration | Bottom-up (feuilles d'abord, puis remontée vers les modules couples) | | Contrats API | Decorateurs NestJS natifs + class-validator (abandon de ts-rest) | | queries-index.ts | Supprime des le depart : chaque module NestJS possede ses propres queries Prisma | | Systeme d'evenements | `@nestjs/event-emitter` (remplacement progressif de `@cpn-console/hooks`) | diff --git a/apps/server-nestjs/src/modules/argocd/argocd-health.service.ts b/apps/server-nestjs/src/modules/argocd/argocd-health.service.ts index 0a929bd6e4..4271b4dfd0 100644 --- a/apps/server-nestjs/src/modules/argocd/argocd-health.service.ts +++ b/apps/server-nestjs/src/modules/argocd/argocd-health.service.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable } from '@nestjs/common' +import { HttpStatus, Inject, Injectable } from '@nestjs/common' import { HealthIndicatorService } from '@nestjs/terminus' import { ConfigurationService } from '../infrastructure/configuration/configuration.service' @@ -16,7 +16,7 @@ export class ArgoCDHealthService { const url = new URL('/api/version', this.config.argocdUrl).toString() try { const response = await fetch(url) - if (response.status < 500) return indicator.up({ httpStatus: response.status }) + if (response.status < HttpStatus.INTERNAL_SERVER_ERROR) return indicator.up({ httpStatus: response.status }) return indicator.down({ httpStatus: response.status }) } catch (error) { return indicator.down(error instanceof Error ? error.message : String(error)) diff --git a/apps/server-nestjs/src/modules/gitlab/gitlab-health.service.ts b/apps/server-nestjs/src/modules/gitlab/gitlab-health.service.ts index 87346f32e5..fc50892690 100644 --- a/apps/server-nestjs/src/modules/gitlab/gitlab-health.service.ts +++ b/apps/server-nestjs/src/modules/gitlab/gitlab-health.service.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable } from '@nestjs/common' +import { HttpStatus, Inject, Injectable } from '@nestjs/common' import { HealthIndicatorService } from '@nestjs/terminus' import { ConfigurationService } from '../infrastructure/configuration/configuration.service' @@ -17,7 +17,7 @@ export class GitlabHealthService { const url = new URL('/-/health', urlBase).toString() try { const response = await fetch(url) - if (response.status < 500) return indicator.up({ httpStatus: response.status }) + if (response.status < HttpStatus.INTERNAL_SERVER_ERROR) return indicator.up({ httpStatus: response.status }) return indicator.down({ httpStatus: response.status }) } catch (error) { return indicator.down(error instanceof Error ? error.message : String(error)) diff --git a/apps/server-nestjs/src/modules/keycloak/keycloak-health.service.ts b/apps/server-nestjs/src/modules/keycloak/keycloak-health.service.ts index bf2de7d151..e2d1c31286 100644 --- a/apps/server-nestjs/src/modules/keycloak/keycloak-health.service.ts +++ b/apps/server-nestjs/src/modules/keycloak/keycloak-health.service.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable } from '@nestjs/common' +import { HttpStatus, Inject, Injectable } from '@nestjs/common' import { HealthIndicatorService } from '@nestjs/terminus' import { ConfigurationService } from '../infrastructure/configuration/configuration.service' @@ -18,7 +18,7 @@ export class KeycloakHealthService { try { const response = await fetch(url) - if (response.status < 500) return indicator.up({ httpStatus: response.status }) + if (response.status < HttpStatus.INTERNAL_SERVER_ERROR) return indicator.up({ httpStatus: response.status }) return indicator.down({ httpStatus: response.status }) } catch (error) { return indicator.down(error instanceof Error ? error.message : String(error)) diff --git a/apps/server-nestjs/src/modules/nexus/nexus-health.service.ts b/apps/server-nestjs/src/modules/nexus/nexus-health.service.ts index 8cf4223b4c..9453ee1d10 100644 --- a/apps/server-nestjs/src/modules/nexus/nexus-health.service.ts +++ b/apps/server-nestjs/src/modules/nexus/nexus-health.service.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable } from '@nestjs/common' +import { HttpStatus, Inject, Injectable } from '@nestjs/common' import { HealthIndicatorService } from '@nestjs/terminus' import { ConfigurationService } from '../infrastructure/configuration/configuration.service' @@ -23,7 +23,7 @@ export class NexusHealthService { try { const response = await fetch(url, { headers }) - if (response.status < 500) return indicator.up({ httpStatus: response.status }) + if (response.status < HttpStatus.INTERNAL_SERVER_ERROR) return indicator.up({ httpStatus: response.status }) return indicator.down({ httpStatus: response.status }) } catch (error) { return indicator.down(error instanceof Error ? error.message : String(error)) diff --git a/apps/server-nestjs/src/modules/nexus/nexus-http-client.service.ts b/apps/server-nestjs/src/modules/nexus/nexus-http-client.service.ts index 674d8ee663..e89cc70aa4 100644 --- a/apps/server-nestjs/src/modules/nexus/nexus-http-client.service.ts +++ b/apps/server-nestjs/src/modules/nexus/nexus-http-client.service.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable } from '@nestjs/common' +import { HttpStatus, Inject, Injectable } from '@nestjs/common' import { trace } from '@opentelemetry/api' import { ConfigurationService } from '../infrastructure/configuration/configuration.service' import { StartActiveSpan } from '../infrastructure/telemetry/telemetry.decorator' @@ -10,7 +10,7 @@ export interface NexusFetchOptions { } export interface NexusResponse { - status: number + status: HttpStatus data: T | null } @@ -21,7 +21,7 @@ export type NexusErrorKind export class NexusError extends Error { readonly kind: NexusErrorKind - readonly status?: number + readonly status?: HttpStatus readonly method?: string readonly path?: string readonly statusText?: string @@ -29,7 +29,7 @@ export class NexusError extends Error { constructor( kind: NexusErrorKind, message: string, - details: { status?: number, method?: string, path?: string, statusText?: string } = {}, + details: { status?: HttpStatus, method?: string, path?: string, statusText?: string } = {}, ) { super(message) this.name = 'NexusError' @@ -119,7 +119,7 @@ export class NexusHttpClientService { } async function handleResponse(response: Response): Promise> { - if (response.status === 204) return { status: response.status, data: null } + if (response.status === HttpStatus.NO_CONTENT) return { status: response.status, data: null } const contentType = response.headers.get('content-type') ?? '' const parsed = contentType.includes('application/json') ? await response.json() diff --git a/apps/server-nestjs/src/modules/opencds/opencds-health.service.ts b/apps/server-nestjs/src/modules/opencds/opencds-health.service.ts index 3cdc6d8181..f91f493f5b 100644 --- a/apps/server-nestjs/src/modules/opencds/opencds-health.service.ts +++ b/apps/server-nestjs/src/modules/opencds/opencds-health.service.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable } from '@nestjs/common' +import { HttpStatus, Inject, Injectable } from '@nestjs/common' import { HealthIndicatorService } from '@nestjs/terminus' import { ConfigurationService } from '../infrastructure/configuration/configuration.service' @@ -21,7 +21,7 @@ export class OpenCdsHealthService { } const response = await fetch(url, { headers }) - if (response.status < 500) return indicator.up({ httpStatus: response.status }) + if (response.status < HttpStatus.INTERNAL_SERVER_ERROR) return indicator.up({ httpStatus: response.status }) return indicator.down({ httpStatus: response.status }) } catch (error) { return indicator.down(error instanceof Error ? error.message : String(error)) diff --git a/apps/server-nestjs/src/modules/project/project.controller.ts b/apps/server-nestjs/src/modules/project/project.controller.ts index b42005cc37..a10afe449f 100644 --- a/apps/server-nestjs/src/modules/project/project.controller.ts +++ b/apps/server-nestjs/src/modules/project/project.controller.ts @@ -3,7 +3,7 @@ import type { FastifyRequest } from 'fastify' import type { UserContext } from '../infrastructure/auth/auth-user.decorator' import type { ProjectContext } from '../infrastructure/permission/project/project.guard' import { AdminAuthorized, projectContract } from '@cpn-console/shared' -import { Body, Controller, Delete, ForbiddenException, Get, HttpCode, Inject, Post, Put, Query, Req, UseGuards } from '@nestjs/common' +import { Body, Controller, Delete, ForbiddenException, Get, HttpCode, HttpStatus, Inject, Post, Put, Query, Req, UseGuards } from '@nestjs/common' import { json2csv } from 'json-2-csv' import { AuthUser } from '../infrastructure/auth/auth-user.decorator' import { RequireProjectAccess } from '../infrastructure/permission/project/project-access.decorator' @@ -43,7 +43,7 @@ export class ProjectController { } @Post('') - @HttpCode(201) + @HttpCode(HttpStatus.CREATED) @UseGuards(UserGuard) @RequireAdminPermission('ManageProjects') async create( @@ -64,7 +64,7 @@ export class ProjectController { } @Put('/:projectId') - @HttpCode(200) + @HttpCode(HttpStatus.OK) @UseGuards(ProjectGuard) @RequireProjectStatus('initializing', 'created', 'failed', 'warning') @RequireProjectPermission('Manage') @@ -78,7 +78,7 @@ export class ProjectController { } @Delete('/:projectId') - @HttpCode(204) + @HttpCode(HttpStatus.NO_CONTENT) @UseGuards(ProjectGuard) @RequireProjectPermission('Manage') async archive( diff --git a/apps/server-nestjs/src/modules/registry/registry-health.service.ts b/apps/server-nestjs/src/modules/registry/registry-health.service.ts index fa3569b4ca..2a1b33454c 100644 --- a/apps/server-nestjs/src/modules/registry/registry-health.service.ts +++ b/apps/server-nestjs/src/modules/registry/registry-health.service.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable } from '@nestjs/common' +import { HttpStatus, Inject, Injectable } from '@nestjs/common' import { HealthIndicatorService } from '@nestjs/terminus' import { ConfigurationService } from '../infrastructure/configuration/configuration.service' @@ -23,7 +23,7 @@ export class RegistryHealthService { try { const response = await fetch(url, { method: 'GET', headers }) - if (response.status < 500) return indicator.up({ httpStatus: response.status }) + if (response.status < HttpStatus.INTERNAL_SERVER_ERROR) return indicator.up({ httpStatus: response.status }) return indicator.down({ httpStatus: response.status }) } catch (error) { return indicator.down(error instanceof Error ? error.message : String(error)) diff --git a/apps/server-nestjs/src/modules/registry/registry-http-client.service.ts b/apps/server-nestjs/src/modules/registry/registry-http-client.service.ts index f20c87f738..cfe57239a2 100644 --- a/apps/server-nestjs/src/modules/registry/registry-http-client.service.ts +++ b/apps/server-nestjs/src/modules/registry/registry-http-client.service.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable } from '@nestjs/common' +import { HttpStatus, Inject, Injectable } from '@nestjs/common' import { trace } from '@opentelemetry/api' import { ConfigurationService } from '../infrastructure/configuration/configuration.service' import { encodeBasicAuth } from './registry.utils' @@ -13,7 +13,7 @@ export interface RegistryFetchOptions { } export interface RegistryResponse { - status: number + status: HttpStatus data: T | null } @@ -23,7 +23,7 @@ export type RegistryErrorKind export class RegistryError extends Error { readonly kind: RegistryErrorKind - readonly status?: number + readonly status?: HttpStatus readonly method?: string readonly path?: string readonly statusText?: string @@ -31,7 +31,7 @@ export class RegistryError extends Error { constructor( kind: RegistryErrorKind, message: string, - details: { status?: number, method?: string, path?: string, statusText?: string } = {}, + details: { status?: HttpStatus, method?: string, path?: string, statusText?: string } = {}, ) { super(message) this.name = 'RegistryError' @@ -112,7 +112,7 @@ export class RegistryHttpClientService { } async function handleResponse(response: Response): Promise> { - if (response.status === 204) return { status: response.status, data: null } + if (response.status === HttpStatus.NO_CONTENT) return { status: response.status, data: null } const contentType = response.headers.get('content-type') ?? '' const parsed = contentType.includes('application/json') ? await response.json() diff --git a/apps/server-nestjs/src/modules/registry/registry-testing.utils.ts b/apps/server-nestjs/src/modules/registry/registry-testing.utils.ts index a61a7768a2..c04eae0429 100644 --- a/apps/server-nestjs/src/modules/registry/registry-testing.utils.ts +++ b/apps/server-nestjs/src/modules/registry/registry-testing.utils.ts @@ -1,17 +1,18 @@ import type { ProjectWithDetails } from './registry-datastore.service' import type { RegistryResponse } from './registry-http-client.service' import { faker } from '@faker-js/faker' +import { HttpStatus } from '@nestjs/common' export function makeOkResponse(data: T): RegistryResponse { - return { status: 200, data } + return { status: HttpStatus.OK, data } } export function makeCreatedResponse(data: T): RegistryResponse { - return { status: 201, data } + return { status: HttpStatus.CREATED, data } } export function makeNoContent(): RegistryResponse { - return { status: 204, data: null } + return { status: HttpStatus.NO_CONTENT, data: null } } export function makeProjectWithDetails(overrides: Partial = {}) { diff --git a/apps/server-nestjs/src/modules/registry/registry.service.spec.ts b/apps/server-nestjs/src/modules/registry/registry.service.spec.ts index 0b4e3b9565..9fde08c567 100644 --- a/apps/server-nestjs/src/modules/registry/registry.service.spec.ts +++ b/apps/server-nestjs/src/modules/registry/registry.service.spec.ts @@ -1,6 +1,7 @@ import type { DeepMockProxy } from 'vitest-mock-extended' import { ENABLED } from '@cpn-console/shared' import { faker } from '@faker-js/faker' +import { HttpStatus } from '@nestjs/common' import { Test } from '@nestjs/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' import { mockDeep } from 'vitest-mock-extended' @@ -132,9 +133,9 @@ describe('registryService', () => { const project = makeProjectWithDetails() client.addGroupMember.mockImplementation(async (_projectName, body) => { if (body.member_group.group_name === `/${project.slug}/console/admin` && body.role_id === 2) { - return { status: 400, data: null } + return { status: HttpStatus.BAD_REQUEST, data: null } } - return { status: 201, data: null } + return { status: HttpStatus.CREATED, data: null } }) await expect(service.handleUpsert(project)).resolves.toEqual({ @@ -301,7 +302,7 @@ describe('registryService', () => { }) it('should not delete project when it does not exist', async () => { - client.getProjectByName.mockResolvedValueOnce({ status: 404, data: null }) + client.getProjectByName.mockResolvedValueOnce({ status: HttpStatus.NOT_FOUND, data: null }) await service.handleDelete(makeProjectWithDetails()) expect(client.deleteProjectByName).not.toHaveBeenCalled() }) diff --git a/apps/server-nestjs/src/modules/service-chain/open-cds-client.service.ts b/apps/server-nestjs/src/modules/service-chain/open-cds-client.service.ts index 2374211ed4..b018e8d450 100644 --- a/apps/server-nestjs/src/modules/service-chain/open-cds-client.service.ts +++ b/apps/server-nestjs/src/modules/service-chain/open-cds-client.service.ts @@ -1,3 +1,4 @@ +import type { HttpStatus } from '@nestjs/common' import type { Dispatcher, HeadersInit } from 'undici' import { Inject, Injectable, Logger } from '@nestjs/common' import { Agent, fetch, Headers, ProxyAgent } from 'undici' @@ -19,7 +20,7 @@ export interface OpenCdsRequestOptions { export class OpenCdsClientError extends Error { constructor( - public readonly status: number, + public readonly status: HttpStatus, public readonly statusText: string, public readonly body?: string, ) { diff --git a/apps/server-nestjs/src/modules/service-chain/service-chain.utils.ts b/apps/server-nestjs/src/modules/service-chain/service-chain.utils.ts index 53d5db9aa2..3500ad7ec9 100644 --- a/apps/server-nestjs/src/modules/service-chain/service-chain.utils.ts +++ b/apps/server-nestjs/src/modules/service-chain/service-chain.utils.ts @@ -1,8 +1,9 @@ +import type { HttpStatus } from '@nestjs/common' import type { Response } from 'undici' export class OpenCdsClientError extends Error { constructor( - public readonly status: number, + public readonly status: HttpStatus, public readonly statusText: string, public readonly body?: string, ) { diff --git a/apps/server-nestjs/src/modules/sonarqube/sonarqube-health.service.ts b/apps/server-nestjs/src/modules/sonarqube/sonarqube-health.service.ts index 870f53eebc..25f2cc5a11 100644 --- a/apps/server-nestjs/src/modules/sonarqube/sonarqube-health.service.ts +++ b/apps/server-nestjs/src/modules/sonarqube/sonarqube-health.service.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable } from '@nestjs/common' +import { HttpStatus, Inject, Injectable } from '@nestjs/common' import { HealthIndicatorService } from '@nestjs/terminus' import { ConfigurationService } from '../infrastructure/configuration/configuration.service' @@ -24,7 +24,7 @@ export class SonarqubeHealthService { try { const response = await fetch(url, { headers }) - if (response.status < 500) return indicator.up({ httpStatus: response.status }) + if (response.status < HttpStatus.INTERNAL_SERVER_ERROR) return indicator.up({ httpStatus: response.status }) return indicator.down({ httpStatus: response.status }) } catch (error) { return indicator.down(error instanceof Error ? error.message : String(error)) diff --git a/apps/server-nestjs/src/modules/sonarqube/sonarqube-http-client.service.ts b/apps/server-nestjs/src/modules/sonarqube/sonarqube-http-client.service.ts index f1d508723e..9318e5d569 100644 --- a/apps/server-nestjs/src/modules/sonarqube/sonarqube-http-client.service.ts +++ b/apps/server-nestjs/src/modules/sonarqube/sonarqube-http-client.service.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable } from '@nestjs/common' +import { HttpStatus, Inject, Injectable } from '@nestjs/common' import { trace } from '@opentelemetry/api' import { ConfigurationService } from '../infrastructure/configuration/configuration.service' @@ -8,7 +8,7 @@ export interface SonarqubeFetchOptions { } export interface SonarqubeResponse { - status: number + status: HttpStatus data: T | null } @@ -16,14 +16,14 @@ export type SonarqubeErrorKind = 'NotConfigured' | 'ClientError' | 'ServerError' export class SonarqubeError extends Error { readonly kind: SonarqubeErrorKind - readonly status?: number + readonly status?: HttpStatus readonly method?: string readonly path?: string constructor( kind: SonarqubeErrorKind, message: string, - details: { status?: number, method?: string, path?: string } = {}, + details: { status?: HttpStatus, method?: string, path?: string } = {}, ) { super(message) this.name = 'SonarqubeError' @@ -99,7 +99,7 @@ function formatErrorMessage(status: number, data: unknown): string { } async function handleResponse(response: Response): Promise> { - if (response.status === 204) return { status: response.status, data: null } + if (response.status === HttpStatus.NO_CONTENT) return { status: response.status, data: null } const contentType = response.headers.get('content-type') ?? '' const parsed = contentType.includes('application/json') ? await response.json() diff --git a/apps/server-nestjs/src/modules/vault/vault-health.service.ts b/apps/server-nestjs/src/modules/vault/vault-health.service.ts index 5db057091f..649770a558 100644 --- a/apps/server-nestjs/src/modules/vault/vault-health.service.ts +++ b/apps/server-nestjs/src/modules/vault/vault-health.service.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable } from '@nestjs/common' +import { HttpStatus, Inject, Injectable } from '@nestjs/common' import { HealthIndicatorService } from '@nestjs/terminus' import { ConfigurationService } from '../infrastructure/configuration/configuration.service' @@ -17,7 +17,7 @@ export class VaultHealthService { const url = new URL('/v1/sys/health', urlBase).toString() try { const response = await fetch(url) - if (response.status < 500) return indicator.up({ httpStatus: response.status }) + if (response.status < HttpStatus.INTERNAL_SERVER_ERROR) return indicator.up({ httpStatus: response.status }) return indicator.down({ httpStatus: response.status }) } catch (error) { return indicator.down(error instanceof Error ? error.message : String(error)) diff --git a/apps/server-nestjs/src/modules/vault/vault-http-client.service.ts b/apps/server-nestjs/src/modules/vault/vault-http-client.service.ts index 7af75440af..6cba06e0b5 100644 --- a/apps/server-nestjs/src/modules/vault/vault-http-client.service.ts +++ b/apps/server-nestjs/src/modules/vault/vault-http-client.service.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable, Logger } from '@nestjs/common' +import { HttpStatus, Inject, Injectable, Logger } from '@nestjs/common' import { trace } from '@opentelemetry/api' import z from 'zod' import { ConfigurationService } from '../infrastructure/configuration/configuration.service' @@ -19,7 +19,7 @@ export type VaultErrorKind export class VaultError extends Error { readonly kind: VaultErrorKind - readonly status?: number + readonly status?: HttpStatus readonly method?: string readonly path?: string readonly statusText?: string @@ -28,7 +28,7 @@ export class VaultError extends Error { constructor( kind: VaultErrorKind, message: string, - details: { status?: number, method?: string, path?: string, statusText?: string, reasons?: string[] } = {}, + details: { status?: HttpStatus, method?: string, path?: string, statusText?: string, reasons?: string[] } = {}, ) { super(message) this.name = 'VaultError' @@ -113,7 +113,7 @@ export class VaultHttpClientService { } private async handleResponse(response: Response, method: string, path: string): Promise { - if (response.status === 204) return null + if (response.status === HttpStatus.NO_CONTENT) return null if (!response.ok) { await this.throwForStatus(response, method, path)