1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-11-01 19:07:38 +01:00
unleash.unleash/src/lib/middleware
Thomas Heartman 9943179393
Clean up old errors (#3633)
This PR attempts to improve the error handling introduced in #3607.

## About the changes

## **tl;dr:**
- Make `UnleashError` constructor protected
- Make all custom errors inherit from `UnleashError`.
- Add tests to ensure that all special error cases include their
relevant data
- Remove `PasswordMismatchError` and `BadRequestError`. These don't
exist.
- Add a few new error types: `ContentTypeError`, `NotImplementedError`,
`UnauthorizedError`
- Remove the `...rest` parameter from error constructor
- Add an unexported `GenericUnleashError` class
- Move OpenAPI conversion function to `BadDataError` clas
- Remove explicit `Error.captureStackTrace`. This is done automatically.
- Extract `getPropFromString` function and add tests

### **In a more verbose fashion**

The main thing is that all our internal errors now inherit
from`UnleashError`. This allows us to simplify the `UnleashError`
constructor and error handling in general while still giving us the
extra benefits we added to that class. However, it _does_ also mean that
I've had to update **all** existing error classes.

The constructor for `UnleashError` is now protected and all places that
called that constructor directly have been updated. Because the base
error isn't available anymore, I've added three new errors to cover use
cases that we didn't already have covered: `NotImplementedError`,
`UnauthorizedError`, `ContentTypeError`. This is to stay consistent in
how we report errors to the user.

There is also an internal class, `GenericUnleashError` that inherits
from the base error. This class is only used in conversions for cases
where we don't know what the error is. It is not exported.

In making all the errors inherit, I've also removed the `...rest`
parameter from the `UnleashError` constructor. We don't need this
anymore.

Following on from the fixes with missing properties in #3638, I have
added tests for all errors that contain extra data.

Some of the error names that were originally used when creating the list
don't exist in the backend. `BadRequestError` and
`PasswordMismatchError` have been removed.

The `BadDataError` class now contains the conversion code for OpenAPI
validation errors. In doing so, I extracted and tested the
`getPropFromString` function.

### Main files

Due to the nature of the changes, there's a lot of files to look at. So
to make it easier to know where to turn your attention:

The changes in `api-error.ts` contain the main changes: protected
constructor, removal of OpenAPI conversion (moved into `BadDataError`.

`api-error.test.ts` contains tests to make sure that errors work as
expected.

Aside from `get-prop-from-string.ts` and the tests, everything else is
just the required updates to go through with the changes.

## Discussion points

I've gone for inheritance of the Error type over composition. This is in
large part because throwing actual Error instances instead of just
objects is preferable (because they collect stack traces, for instance).
However, it's quite possible that we could solve the same thing in a
more elegant fashion using composition.

## For later / suggestions for further improvements

The `api-error` files still contain a lot of code. I think it might be
beneficial to break each Error into a separate folder that includes the
error, its tests, and its schema (if required). It would help decouple
it a bit.

We don't currently expose the schema anywhere, so it's not available in
the openapi spec. We should look at exposing it too.

Finally, it would be good to go through each individual error message
and update each one to be as helpful as possible.
2023-05-11 11:10:57 +02:00
..
api-token-middleware.test.ts chore: deprecate username on api-tokens (#3616) 2023-05-04 09:56:00 +02:00
api-token-middleware.ts
authorization-middleware.ts Clean up old errors (#3633) 2023-05-11 11:10:57 +02:00
catch-all-error-handler.ts
conditional-middleware.ts
content_type_checker.test.ts feat: unify error responses (#3607) 2023-04-25 13:40:46 +00:00
content_type_checker.ts Clean up old errors (#3633) 2023-05-11 11:10:57 +02:00
cors-origin-middleware.test.ts
cors-origin-middleware.ts
demo-authentication.ts chore: deprecate username on api-tokens (#3616) 2023-05-04 09:56:00 +02:00
index.ts
maintenance-middleware.ts
no-authentication.test.ts
no-authentication.ts
oss-authentication.test.ts
oss-authentication.ts
pat-middleware.test.ts fix: log missing user at warn level (#3735) 2023-05-10 13:31:42 +02:00
pat-middleware.ts fix: log missing user at warn level (#3735) 2023-05-10 13:31:42 +02:00
rbac-middleware.test.ts chore: deprecate username on api-tokens (#3616) 2023-05-04 09:56:00 +02:00
rbac-middleware.ts
request-logger.ts
response-time-metrics.ts
secure-headers.ts feat: add plausible as connect src (#3619) 2023-04-25 14:24:54 +03:00
session-db.ts
unless-middleware.ts