diff options
-rw-r--r-- | FrontEnd/src/http/common.ts | 60 | ||||
-rw-r--r-- | FrontEnd/src/http/token.ts | 8 | ||||
-rw-r--r-- | FrontEnd/src/services/user.ts | 4 |
3 files changed, 40 insertions, 32 deletions
diff --git a/FrontEnd/src/http/common.ts b/FrontEnd/src/http/common.ts index 0a27b908..5a8c0346 100644 --- a/FrontEnd/src/http/common.ts +++ b/FrontEnd/src/http/common.ts @@ -1,12 +1,31 @@ -import rawAxios, { AxiosError, AxiosResponse } from "axios"; +import axios, { Axios, AxiosError, AxiosResponse } from "axios"; import { Base64 } from "js-base64"; +import { identity } from "lodash"; import { BehaviorSubject, Observable } from "rxjs"; +export { axios }; + export const apiBaseUrl = "/api"; -export const axios = rawAxios.create(); +export class HttpNetworkError extends Error { + constructor(public innerError?: AxiosError) { + super(); + } +} -function convertToNetworkError(error: AxiosError): never { +export class HttpForbiddenError extends Error { + constructor(public innerError?: AxiosError) { + super(); + } +} + +export class HttpNotFoundError extends Error { + constructor(public innerError?: AxiosError) { + super(); + } +} + +function convertNetworkError(error: AxiosError): never { if (error.isAxiosError && error.response == null) { throw new HttpNetworkError(error); } else { @@ -14,7 +33,7 @@ function convertToNetworkError(error: AxiosError): never { } } -function convertToForbiddenError(error: AxiosError): never { +function convertForbiddenError(error: AxiosError): never { if ( error.isAxiosError && error.response != null && @@ -26,7 +45,7 @@ function convertToForbiddenError(error: AxiosError): never { } } -function convertToNotFoundError(error: AxiosError): never { +function convertNotFoundError(error: AxiosError): never { if ( error.isAxiosError && error.response != null && @@ -38,12 +57,13 @@ function convertToNotFoundError(error: AxiosError): never { } } -rawAxios.interceptors.response.use(undefined, convertToNetworkError); -rawAxios.interceptors.response.use(undefined, convertToForbiddenError); -rawAxios.interceptors.response.use(undefined, convertToNotFoundError); -axios.interceptors.response.use(undefined, convertToNetworkError); -axios.interceptors.response.use(undefined, convertToForbiddenError); -axios.interceptors.response.use(undefined, convertToNotFoundError); +export function configureAxios(axios: Axios): void { + axios.interceptors.response.use(identity, convertNetworkError); + axios.interceptors.response.use(identity, convertForbiddenError); + axios.interceptors.response.use(identity, convertNotFoundError); +} + +configureAxios(axios); const tokenSubject = new BehaviorSubject<string | null>(null); @@ -106,24 +126,6 @@ export function extractErrorCode( return null; } -export class HttpNetworkError extends Error { - constructor(public innerError?: AxiosError) { - super(); - } -} - -export class HttpForbiddenError extends Error { - constructor(public innerError?: AxiosError) { - super(); - } -} - -export class HttpNotFoundError extends Error { - constructor(public innerError?: AxiosError) { - super(); - } -} - export class NotModified {} export interface BlobWithEtag { diff --git a/FrontEnd/src/http/token.ts b/FrontEnd/src/http/token.ts index f8b09d63..3de42d21 100644 --- a/FrontEnd/src/http/token.ts +++ b/FrontEnd/src/http/token.ts @@ -1,14 +1,18 @@ // Don't use axios in common because it will contains // authorization header, which shouldn't be used in token apis. -import axios, { AxiosError } from "axios"; +import originalAxios, { AxiosError } from "axios"; import { apiBaseUrl, convertToIfErrorCodeIs, extractResponseData, + configureAxios, } from "./common"; import { HttpUser } from "./user"; +const axios = originalAxios.create(); +configureAxios(axios); + export interface HttpCreateTokenRequest { username: string; password: string; @@ -42,7 +46,7 @@ export interface IHttpTokenClient { export class HttpTokenClient implements IHttpTokenClient { create(req: HttpCreateTokenRequest): Promise<HttpCreateTokenResponse> { return axios - .post<HttpCreateTokenResponse>(`${apiBaseUrl}/token/create`, req) + .post<HttpCreateTokenResponse>(`${apiBaseUrl}/token/create`, req, {}) .then(extractResponseData) .catch( convertToIfErrorCodeIs(11010101, HttpCreateTokenBadCredentialError) diff --git a/FrontEnd/src/services/user.ts b/FrontEnd/src/services/user.ts index 2f42dd59..bc33d113 100644 --- a/FrontEnd/src/services/user.ts +++ b/FrontEnd/src/services/user.ts @@ -1,5 +1,6 @@ import { useState, useEffect } from "react"; import { BehaviorSubject, Observable } from "rxjs"; +import { AxiosError } from "axios"; import { UiLogicError } from "@/common"; @@ -11,7 +12,6 @@ import { import { getHttpUserClient, HttpUser, UserPermission } from "@/http/user"; import { pushAlert } from "./alert"; -import { AxiosError } from "axios"; interface IAuthUser extends HttpUser { token: string; @@ -67,6 +67,8 @@ export class UserService { type: "danger", message: "user.tokenInvalid", }); + } else { + throw e; } }); |