Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 4 additions & 6 deletions frontend/src/libs/index.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
export {
default as isErrorWithMessage,
isErrorWithError,
isRequestErrorWithDetail,
isRequestFormErrors,
isRequestFormFieldError,
isRequestFormErrors2,
} from './isErrorWithMessage';
isResponseServerFormFieldError,
isResponseServerError,
getServerError,
} from './serverErrors';
import { format, formatDistanceToNowStrict } from 'date-fns';

// eslint-disable-next-line @typescript-eslint/no-explicit-any
Expand Down
68 changes: 0 additions & 68 deletions frontend/src/libs/isErrorWithMessage.ts

This file was deleted.

51 changes: 51 additions & 0 deletions frontend/src/libs/serverErrors.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { isArray } from 'lodash';

import { FormFieldError, ResponseServerError } from './types';

export default function serverErrors(error: unknown): error is { data: { message: string } } {
return (
typeof error === 'object' &&
error !== null &&
'data' in error &&
// eslint-disable-next-line @typescript-eslint/no-explicit-any
typeof ((error as any).data as any)?.message === 'string'
);
}

export function isResponseServerFormFieldError(fieldError: unknown): fieldError is FormFieldError {
return (
typeof fieldError === 'object' &&
fieldError !== null &&
fieldError !== undefined &&
'loc' in fieldError &&
'msg' in fieldError &&
isArray(fieldError?.loc) &&
typeof fieldError?.msg === 'string'
);
}

export function isResponseServerError(formErrors: unknown): formErrors is ResponseServerError {
return (
typeof formErrors === 'object' &&
formErrors !== null &&
formErrors !== undefined &&
'detail' in formErrors &&
isArray(formErrors?.detail) &&
!!formErrors.detail.length &&
'msg' in formErrors.detail[0]
);
}

export function getServerError(error: any): string {
let errorText = error?.error;

const errorData = error.data;

if (isResponseServerError(errorData)) {
const errorDetail = errorData.detail;

errorText = errorDetail.flatMap(({ msg }) => msg).join(', ');
}

return errorText;
}
14 changes: 3 additions & 11 deletions frontend/src/libs/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,11 @@ export type FormFieldError = {
code: string;
};

export type FormError = {
export type ResponseServerErrorItem = {
msg: string;
code: string;
};

export type FormErrors = {
detail: FormFieldError[];
};

export type FormErrors2 = {
detail: (FormFieldError | FormError)[];
};

export type RequestErrorWithDetail = {
detail: string;
export type ResponseServerError = {
detail: (FormFieldError | ResponseServerErrorItem)[];
};
14 changes: 2 additions & 12 deletions frontend/src/pages/Fleets/List/useDeleteFleet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { useCallback, useState } from 'react';
import { useTranslation } from 'react-i18next';

import { useNotifications } from 'hooks';
import { isRequestFormErrors2 } from 'libs';
import { getServerError } from 'libs';
import { useDeleteFleetMutation } from 'services/fleet';

export const useDeleteFleet = () => {
Expand Down Expand Up @@ -40,19 +40,9 @@ export const useDeleteFleet = () => {
return Promise.all(requests)
.finally(() => setIsDeleting(false))
.catch((error) => {
let errorText = error?.error;

const errorData = error.data;

if (isRequestFormErrors2(errorData)) {
const errorDetail = errorData.detail;

errorText = errorDetail.flatMap(({ msg }) => msg).join(', ');
}

pushNotification({
type: 'error',
content: t('common.server_error', { error: errorText }),
content: t('common.server_error', { error: getServerError(error) }),
});
});
}, []);
Expand Down
15 changes: 2 additions & 13 deletions frontend/src/pages/Instances/List/hooks/useActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@ import { useCallback, useState } from 'react';
import { useTranslation } from 'react-i18next';

import { useNotifications } from 'hooks';
import { getServerError } from 'libs';
import { useDeleteInstancesMutation } from 'services/instance';

import { isRequestFormErrors2 } from '../../../../libs';

export const useActions = () => {
const { t } = useTranslation();
const [deleteInstances] = useDeleteInstancesMutation();
Expand Down Expand Up @@ -46,19 +45,9 @@ export const useActions = () => {
return Promise.all(requests)
.finally(() => setIsDeleting(false))
.catch((error) => {
let errorText = error?.error;

const errorData = error.data;

if (isRequestFormErrors2(errorData)) {
const errorDetail = errorData.detail;

errorText = errorDetail.flatMap(({ msg }) => msg).join(', ');
}

pushNotification({
type: 'error',
content: t('common.server_error', { error: errorText }),
content: t('common.server_error', { error: getServerError(error) }),
});
});
}, []);
Expand Down
8 changes: 7 additions & 1 deletion frontend/src/pages/Project/Add/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { useNavigate } from 'react-router-dom';
import { ContentLayout, Header } from 'components';

import { useBreadcrumbs, useNotifications } from 'hooks';
import { getServerError } from 'libs';
import { ROUTES } from 'routes';
import { useCreateProjectMutation } from 'services/project';

Expand Down Expand Up @@ -43,7 +44,12 @@ export const ProjectAdd: React.FC = () => {

navigate(ROUTES.PROJECT.DETAILS.SETTINGS.FORMAT(data.project_name));
})
.catch((error) => console.log(error));
.catch((error) => {
pushNotification({
type: 'error',
content: t('common.server_error', { error: getServerError(error) }),
});
});

return request;
};
Expand Down
8 changes: 6 additions & 2 deletions frontend/src/pages/Project/Backends/Add/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { useNavigate, useParams } from 'react-router-dom';
import { Container, Header } from 'components';

import { useBreadcrumbs, useNotifications } from 'hooks';
import { getServerError } from 'libs';
import { ROUTES } from 'routes';
import {
// useCreateBackendMutation,
Expand Down Expand Up @@ -85,8 +86,11 @@ export const BackendAdd: React.FC = () => {

navigate(ROUTES.PROJECT.DETAILS.SETTINGS.FORMAT(paramProjectName));
})
.catch((error: never) => {
console.log(error);
.catch((error) => {
pushNotification({
type: 'error',
content: t('common.server_error', { error: getServerError(error) }),
});
});

return request;
Expand Down
8 changes: 7 additions & 1 deletion frontend/src/pages/Project/Backends/Edit/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { pick } from 'lodash';
import { Container, Header, Loader } from 'components';

import { useBreadcrumbs, useNotifications } from 'hooks';
import { getServerError } from 'libs';
import { ROUTES } from 'routes';
import {
// useGetBackendConfigQuery,
Expand Down Expand Up @@ -100,7 +101,12 @@ export const BackendEdit: React.FC = () => {
content: t('backend.edit.success_notification'),
});
})
.catch(console.log);
.catch((error) => {
pushNotification({
type: 'error',
content: t('common.server_error', { error: getServerError(error) }),
});
});

return request;
};
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/pages/Project/Backends/Form/AWS/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { FormInput, FormMultiselect, FormMultiselectOptions, FormSelect, InfoLin

import { useHelpPanel, useNotifications } from 'hooks';
import useIsMounted from 'hooks/useIsMounted';
import { isRequestFormErrors2, isRequestFormFieldError } from 'libs';
import { isResponseServerError, isResponseServerFormFieldError } from 'libs';
import { useBackendValuesMutation } from 'services/backend';
import { AWSCredentialTypeEnum } from 'types';

Expand Down Expand Up @@ -94,9 +94,9 @@ export const AWSBackend: React.FC<IProps> = ({ loading }) => {
// @ts-ignore
const errorRequestData = errorResponse?.data;

if (isRequestFormErrors2(errorRequestData)) {
if (isResponseServerError(errorRequestData)) {
errorRequestData.detail.forEach((error) => {
if (isRequestFormFieldError(error)) {
if (isResponseServerFormFieldError(error)) {
setError(error.loc.join('.'), { type: 'custom', message: error.msg });
} else {
pushNotification({
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/pages/Project/Backends/Form/Azure/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import {

import { useHelpPanel, useNotifications } from 'hooks';
import useIsMounted from 'hooks/useIsMounted';
import { isRequestFormErrors2, isRequestFormFieldError } from 'libs';
import { isResponseServerError, isResponseServerFormFieldError } from 'libs';
import { useBackendValuesMutation } from 'services/backend';
import { AzureCredentialTypeEnum } from 'types';

Expand Down Expand Up @@ -117,9 +117,9 @@ export const AzureBackend: React.FC<IProps> = ({ loading }) => {
// @ts-ignore
const errorRequestData = errorResponse?.data;

if (isRequestFormErrors2(errorRequestData)) {
if (isResponseServerError(errorRequestData)) {
errorRequestData.detail.forEach((error) => {
if (isRequestFormFieldError(error)) {
if (isResponseServerFormFieldError(error)) {
setError(error.loc.join('.'), { type: 'custom', message: error.msg });
} else {
pushNotification({
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/pages/Project/Backends/Form/GCP/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {

import { useHelpPanel, useNotifications } from 'hooks';
import useIsMounted from 'hooks/useIsMounted';
import { isRequestFormErrors2, isRequestFormFieldError } from 'libs';
import { isResponseServerError, isResponseServerFormFieldError } from 'libs';
import { useBackendValuesMutation } from 'services/backend';
import { GCPCredentialTypeEnum } from 'types';

Expand Down Expand Up @@ -115,9 +115,9 @@ export const GCPBackend: React.FC<IProps> = ({ loading }) => {
// @ts-ignore
const errorRequestData = errorResponse?.data;

if (isRequestFormErrors2(errorRequestData)) {
if (isResponseServerError(errorRequestData)) {
errorRequestData.detail.forEach((error) => {
if (isRequestFormFieldError(error)) {
if (isResponseServerFormFieldError(error)) {
if (error.loc.length === 1 && error.loc[0] === 'credentials') {
setError(FIELD_NAMES.CREDENTIALS.TYPE, { type: 'custom', message: error.msg });
} else {
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/pages/Project/Backends/Form/Lambda/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { FormInput, FormMultiselect, FormMultiselectOptions, InfoLink, SpaceBetw

import { useHelpPanel, useNotifications } from 'hooks';
import useIsMounted from 'hooks/useIsMounted';
import { isRequestFormErrors2, isRequestFormFieldError } from 'libs';
import { isResponseServerError, isResponseServerFormFieldError } from 'libs';
import { useBackendValuesMutation } from 'services/backend';

import { API_KEY_HELP, FIELD_NAMES, REGIONS_HELP } from './constants';
Expand Down Expand Up @@ -66,9 +66,9 @@ export const LambdaBackend: React.FC<IProps> = ({ loading }) => {
// @ts-ignore
const errorRequestData = errorResponse?.data;

if (isRequestFormErrors2(errorRequestData)) {
if (isResponseServerError(errorRequestData)) {
errorRequestData.detail.forEach((error) => {
if (isRequestFormFieldError(error)) {
if (isResponseServerFormFieldError(error)) {
setError(error.loc.join('.'), { type: 'custom', message: error.msg });
} else {
pushNotification({
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/pages/Project/Backends/Form/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next';
import { Alert, Button, FormField, FormTiles, FormUI, Grid, InfoLink, SpaceBetween, TilesProps } from 'components';

import { useHelpPanel, useNotifications } from 'hooks';
import { isRequestFormErrors2, isRequestFormFieldError } from 'libs';
import { isResponseServerError, isResponseServerFormFieldError } from 'libs';
import { useGetBackendTypesQuery } from 'services/backend';

import { AWSBackend } from './AWS';
Expand Down Expand Up @@ -63,9 +63,9 @@ export const BackendForm: React.FC<IProps> = ({ initialValues, onCancel, loading
onSubmitProp(data).catch((errorResponse) => {
const errorRequestData = errorResponse?.data;

if (isRequestFormErrors2(errorRequestData)) {
if (isResponseServerError(errorRequestData)) {
errorRequestData.detail.forEach((error) => {
if (isRequestFormFieldError(error)) {
if (isResponseServerFormFieldError(error)) {
setError(error.loc.join('.') as FieldPath<TBackendConfig>, { type: 'custom', message: error.msg });
} else {
pushNotification({
Expand Down
Loading