Skip to content

Commit

Permalink
allow for backward compatible errors
Browse files Browse the repository at this point in the history
  • Loading branch information
eschutho committed Oct 25, 2023
1 parent e2fe967 commit 2e91e0d
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 20 deletions.
14 changes: 12 additions & 2 deletions superset-frontend/packages/superset-ui-core/src/models/Registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ export type Listener = (keys: string[]) => void;
export interface RegistryConfig {
name?: string;
overwritePolicy?: OverwritePolicy;
defaultValue?: any;
}

/**
Expand Down Expand Up @@ -88,13 +89,20 @@ export default class Registry<

listeners: Set<Listener>;

defaultValue?: V;

constructor(config: RegistryConfig = {}) {
const { name = '', overwritePolicy = OverwritePolicy.ALLOW } = config;
const {
name = '',
overwritePolicy = OverwritePolicy.ALLOW,
defaultValue,
} = config;
this.name = name;
this.overwritePolicy = overwritePolicy;
this.items = {};
this.promises = {};
this.listeners = new Set();
this.defaultValue = defaultValue;
}

clear() {
Expand Down Expand Up @@ -174,7 +182,9 @@ export default class Registry<

return item.value;
}

if (this.defaultValue) {
return this.defaultValue;
}
return undefined;
}

Expand Down
22 changes: 14 additions & 8 deletions superset-frontend/src/components/Datasource/DatasourceModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,11 @@ import {

import Modal from 'src/components/Modal';
import AsyncEsmComponent from 'src/components/AsyncEsmComponent';
import {
genericSupersetError,
SupersetError,
} from 'src/components/ErrorMessage/types';
import { SupersetError } from 'src/components/ErrorMessage/types';
import ErrorMessageWithStackTrace from 'src/components/ErrorMessage/ErrorMessageWithStackTrace';
import withToasts from 'src/components/MessageToasts/withToasts';
import { useSelector } from 'react-redux';
import { getClientErrorObject } from 'src/utils/getClientErrorObject';

const DatasourceEditor = AsyncEsmComponent(() => import('./DatasourceEditor'));

Expand Down Expand Up @@ -207,16 +205,24 @@ const DatasourceModal: FunctionComponent<DatasourceModalProps> = ({
})
.catch(response => {
setIsSaving(false);
response.json().then((errorJson: { errors: SupersetError[] }) => {
getClientErrorObject(response).then(error => {
let errorResponse: SupersetError | undefined;
let errorText: string | undefined;
// sip-40 error response
if (error?.errors?.length) {
errorResponse = error.errors[0];
} else if (typeof error.error === 'string') {
// backward compatible with old error messages
errorText = error.error;
}
modal.error({
title: t('Error saving dataset'),
okButtonProps: { danger: true, className: 'btn-danger' },
content: (
<ErrorMessageWithStackTrace
error={
errorJson?.errors?.[0] || genericSupersetError(errorJson)
}
error={errorResponse}
source="crud"
fallback={errorText}
/>
),
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,23 @@
* specific language governing permissions and limitations
* under the License.
*/
import { Registry, makeSingleton, OverwritePolicy } from '@superset-ui/core';
import {
Registry,
makeSingleton,
OverwritePolicy,
ErrorTypeEnum,
ErrorLevel,
} from '@superset-ui/core';
import { ErrorMessageComponent } from './types';

/* Generic error to be returned when the backend returns an error response that is not
* SIP-41 compliant. */
const genericSupersetError = (extra: object) => ({
error_type: ErrorTypeEnum.GENERIC_BACKEND_ERROR,
extra,
level: 'error' as ErrorLevel,
message: 'An error occurred',
});
class ErrorMessageComponentRegistry extends Registry<
ErrorMessageComponent,
ErrorMessageComponent
Expand All @@ -27,6 +41,7 @@ class ErrorMessageComponentRegistry extends Registry<
super({
name: 'ErrorMessageComponent',
overwritePolicy: OverwritePolicy.ALLOW,
defaultValue: genericSupersetError,
});
}
}
Expand Down
9 changes: 0 additions & 9 deletions superset-frontend/src/components/ErrorMessage/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,3 @@ export type ErrorMessageComponentProps<ExtraType = Record<string, any> | null> =

export type ErrorMessageComponent =
React.ComponentType<ErrorMessageComponentProps>;

/* Generic error to be returned when the backend returns an error response that is not
* SIP-41 compliant. */
export const genericSupersetError = (extra: object) => ({
error_type: ErrorTypeEnum.GENERIC_BACKEND_ERROR,
extra,
level: 'error' as ErrorLevel,
message: 'An error occurred',
});

0 comments on commit 2e91e0d

Please sign in to comment.