mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-12 04:29:04 +08:00
feat(error): base setup for error handling in frontend (#7851)
* feat(login): add error response v2 and error handler v2 * feat(error): added the base error class * feat(error): added the base error class * feat(error): remove unnecessary code * feat(error): fix types * feat(error): add http status code helper
This commit is contained in:
parent
8dc749b9dd
commit
0c28067f89
@ -82,6 +82,7 @@
|
|||||||
"history": "4.10.1",
|
"history": "4.10.1",
|
||||||
"html-webpack-plugin": "5.5.0",
|
"html-webpack-plugin": "5.5.0",
|
||||||
"http-proxy-middleware": "3.0.3",
|
"http-proxy-middleware": "3.0.3",
|
||||||
|
"http-status-codes": "2.3.0",
|
||||||
"i18next": "^21.6.12",
|
"i18next": "^21.6.12",
|
||||||
"i18next-browser-languagedetector": "^6.1.3",
|
"i18next-browser-languagedetector": "^6.1.3",
|
||||||
"i18next-http-backend": "^1.3.2",
|
"i18next-http-backend": "^1.3.2",
|
||||||
|
46
frontend/src/api/ErrorResponseHandlerV2.ts
Normal file
46
frontend/src/api/ErrorResponseHandlerV2.ts
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import { AxiosError } from 'axios';
|
||||||
|
import { ErrorV2 } from 'types/api';
|
||||||
|
import APIError from 'types/api/error';
|
||||||
|
|
||||||
|
// reference - https://axios-http.com/docs/handling_errors
|
||||||
|
export function ErrorResponseHandlerV2(error: AxiosError<ErrorV2>): never {
|
||||||
|
const { response, request } = error;
|
||||||
|
// The request was made and the server responded with a status code
|
||||||
|
// that falls out of the range of 2xx
|
||||||
|
if (response) {
|
||||||
|
throw new APIError({
|
||||||
|
httpStatusCode: response.status || 500,
|
||||||
|
error: {
|
||||||
|
code: response.data.code,
|
||||||
|
message: response.data.message,
|
||||||
|
url: response.data.url,
|
||||||
|
errors: response.data.errors,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// The request was made but no response was received
|
||||||
|
// `error.request` is an instance of XMLHttpRequest in the browser and an instance of
|
||||||
|
// http.ClientRequest in node.js
|
||||||
|
if (request) {
|
||||||
|
throw new APIError({
|
||||||
|
httpStatusCode: error.status || 500,
|
||||||
|
error: {
|
||||||
|
code: error.code || error.name,
|
||||||
|
message: error.message,
|
||||||
|
url: '',
|
||||||
|
errors: [],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Something happened in setting up the request that triggered an Error
|
||||||
|
throw new APIError({
|
||||||
|
httpStatusCode: error.status || 500,
|
||||||
|
error: {
|
||||||
|
code: error.name,
|
||||||
|
message: error.message,
|
||||||
|
url: '',
|
||||||
|
errors: [],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
26
frontend/src/api/login/login.ts
Normal file
26
frontend/src/api/login/login.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import axios from 'api';
|
||||||
|
import { ErrorResponseHandlerV2 } from 'api/ErrorResponseHandlerV2';
|
||||||
|
import { AxiosError } from 'axios';
|
||||||
|
import { ErrorV2, SuccessResponseV2 } from 'types/api';
|
||||||
|
import { PayloadProps, Props } from 'types/api/user/login';
|
||||||
|
|
||||||
|
const login = async (
|
||||||
|
props: Props,
|
||||||
|
): Promise<SuccessResponseV2<PayloadProps>> => {
|
||||||
|
try {
|
||||||
|
const response = await axios.post<PayloadProps>(`/login`, {
|
||||||
|
...props,
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
httpStatusCode: response.status,
|
||||||
|
data: response.data,
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
ErrorResponseHandlerV2(error as AxiosError<ErrorV2>);
|
||||||
|
// this line is never reached but ts isn't detecting the never type properly for the ErrorResponseHandlerV2
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default login;
|
18
frontend/src/types/api/error.ts
Normal file
18
frontend/src/types/api/error.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import { StatusCodes } from 'http-status-codes';
|
||||||
|
|
||||||
|
import { ErrorResponseV2 } from '.';
|
||||||
|
|
||||||
|
class APIError extends Error {
|
||||||
|
error: ErrorResponseV2;
|
||||||
|
|
||||||
|
constructor(error: ErrorResponseV2) {
|
||||||
|
super(error.error.message);
|
||||||
|
this.error = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
getHttpStatusCode(): StatusCodes {
|
||||||
|
return this.error.httpStatusCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default APIError;
|
@ -1,3 +1,4 @@
|
|||||||
|
import { StatusCodes } from 'http-status-codes';
|
||||||
import { ErrorStatusCode, SuccessStatusCode } from 'types/common';
|
import { ErrorStatusCode, SuccessStatusCode } from 'types/common';
|
||||||
|
|
||||||
export type ApiResponse<T> = { data: T };
|
export type ApiResponse<T> = { data: T };
|
||||||
@ -17,3 +18,24 @@ export interface SuccessResponse<T, P = unknown> {
|
|||||||
error: null;
|
error: null;
|
||||||
params?: P;
|
params?: P;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Standardize SuccessResponse and Error Response
|
||||||
|
export interface AdditionalErrors {
|
||||||
|
message: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ErrorV2 {
|
||||||
|
code: string;
|
||||||
|
message: string;
|
||||||
|
url: string;
|
||||||
|
errors: AdditionalErrors[];
|
||||||
|
}
|
||||||
|
export interface ErrorResponseV2 {
|
||||||
|
httpStatusCode: StatusCodes;
|
||||||
|
error: ErrorV2;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SuccessResponseV2<T> {
|
||||||
|
httpStatusCode: StatusCodes;
|
||||||
|
data: T;
|
||||||
|
}
|
||||||
|
@ -10024,6 +10024,11 @@ http-proxy@^1.18.1:
|
|||||||
follow-redirects "^1.0.0"
|
follow-redirects "^1.0.0"
|
||||||
requires-port "^1.0.0"
|
requires-port "^1.0.0"
|
||||||
|
|
||||||
|
http-status-codes@2.3.0:
|
||||||
|
version "2.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-2.3.0.tgz#987fefb28c69f92a43aecc77feec2866349a8bfc"
|
||||||
|
integrity sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==
|
||||||
|
|
||||||
https-proxy-agent@^5.0.0:
|
https-proxy-agent@^5.0.0:
|
||||||
version "5.0.1"
|
version "5.0.1"
|
||||||
resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz"
|
resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user