From c929f8381348d938533b8b01f3287f9ddc8353b9 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Fri, 29 May 2020 07:22:09 -0700 Subject: [PATCH] feat: Improved error filtering and reporting (#1293) --- app/scenes/Document/components/DataLoader.js | 9 ++++++-- app/utils/ApiClient.js | 23 +++++++++++++++++--- app/utils/errors.js | 9 ++++++++ package.json | 1 + server/app.js | 7 ++++++ server/static/index.html | 11 +++++++++- yarn.lock | 5 +++++ 7 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 app/utils/errors.js diff --git a/app/scenes/Document/components/DataLoader.js b/app/scenes/Document/components/DataLoader.js index fde5a510..cb28a8d3 100644 --- a/app/scenes/Document/components/DataLoader.js +++ b/app/scenes/Document/components/DataLoader.js @@ -17,6 +17,7 @@ import DocumentsStore from 'stores/DocumentsStore'; import PoliciesStore from 'stores/PoliciesStore'; import RevisionsStore from 'stores/RevisionsStore'; import UiStore from 'stores/UiStore'; +import { OfflineError } from 'utils/errors'; type Props = {| match: Object, @@ -47,7 +48,7 @@ class DataLoader extends React.Component { if (this.document) { const policy = this.props.policies.get(this.document.id); - if (!policy) { + if (!policy && !this.error) { this.loadDocument(); } } @@ -131,7 +132,11 @@ class DataLoader extends React.Component { const { location, policies, ui } = this.props; if (this.error) { - return navigator.onLine ? : ; + return this.error instanceof OfflineError ? ( + + ) : ( + + ); } const document = this.document; diff --git a/app/utils/ApiClient.js b/app/utils/ApiClient.js index 35dd6481..57bc59df 100644 --- a/app/utils/ApiClient.js +++ b/app/utils/ApiClient.js @@ -4,6 +4,14 @@ import { map, trim } from 'lodash'; import invariant from 'invariant'; import stores from 'stores'; import download from './download'; +import { + AuthorizationError, + NetworkError, + NotFoundError, + OfflineError, + RequestError, + UpdateRequiredError, +} from './errors'; type Options = { baseUrl?: string, @@ -62,9 +70,9 @@ class ApiClient { }); } catch (err) { if (window.navigator.onLine) { - throw new Error('A network error occurred, try again?'); + throw new NetworkError('A network error occurred, try again?'); } else { - throw new Error('No internet connection available'); + throw new OfflineError('No internet connection available'); } } @@ -104,9 +112,18 @@ class ApiClient { if (response.status === 400 && error.error === 'editor_update_required') { window.location.reload(true); + throw new UpdateRequiredError(error.message); } - throw new Error(error.message); + if (response.status === 403) { + throw new AuthorizationError(error.message); + } + + if (response.status === 404) { + throw new NotFoundError(error.message); + } + + throw new RequestError(error.message); }; get = (path: string, data: ?Object, options?: Object) => { diff --git a/app/utils/errors.js b/app/utils/errors.js new file mode 100644 index 00000000..da15cf3c --- /dev/null +++ b/app/utils/errors.js @@ -0,0 +1,9 @@ +// @flow +import ExtendableError from 'es6-error'; + +export class AuthorizationError extends ExtendableError {} +export class NetworkError extends ExtendableError {} +export class NotFoundError extends ExtendableError {} +export class OfflineError extends ExtendableError {} +export class RequestError extends ExtendableError {} +export class UpdateRequiredError extends ExtendableError {} diff --git a/package.json b/package.json index 2230a69b..a066166f 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,7 @@ "debug": "^4.1.1", "dotenv": "^4.0.0", "emoji-regex": "^6.5.1", + "es6-error": "^4.1.1", "exports-loader": "^0.6.4", "file-loader": "^1.1.6", "flow-typed": "^2.6.2", diff --git a/server/app.js b/server/app.js index 297656f5..426d13d7 100644 --- a/server/app.js +++ b/server/app.js @@ -93,6 +93,13 @@ if (process.env.SENTRY_DSN) { dsn: process.env.SENTRY_DSN, environment: process.env.NODE_ENV, maxBreadcrumbs: 0, + ignoreErrors: [ + // emitted by Koa when bots attempt to snoop on paths such as wp-admin + // or the user submits a bad request. These are expected in normal running + // of the application + 'BadRequestError', + 'UnauthorizedError', + ], }); } diff --git a/server/static/index.html b/server/static/index.html index b4972454..c7fafc51 100644 --- a/server/static/index.html +++ b/server/static/index.html @@ -40,7 +40,16 @@ >