From e7b739bb3bccbcbfed41c57eefeebfcf3cb2a9ad Mon Sep 17 00:00:00 2001 From: Pierre Donias Date: Mon, 7 Nov 2016 12:30:29 +0100 Subject: [PATCH] feat(api-errors): error factories (#1) --- packages/xo-common/package.json | 3 +- packages/xo-common/src/api-errors.js | 79 ++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/packages/xo-common/package.json b/packages/xo-common/package.json index 5ac315af6..b0daf375e 100644 --- a/packages/xo-common/package.json +++ b/packages/xo-common/package.json @@ -25,7 +25,8 @@ }, "dependencies": { "babel-runtime": "^6.18.0", - "lodash": "^4.16.6" + "lodash": "^4.16.6", + "make-error": "^1.2.1" }, "devDependencies": { "babel-cli": "^6.18.0", diff --git a/packages/xo-common/src/api-errors.js b/packages/xo-common/src/api-errors.js index e69de29bb..c9dcb77ab 100644 --- a/packages/xo-common/src/api-errors.js +++ b/packages/xo-common/src/api-errors.js @@ -0,0 +1,79 @@ +import { BaseError } from 'make-error' +import { isArray, iteratee } from 'lodash' + +class XoError extends BaseError { + constructor ({ code, message, data }) { + super(message) + this.code = code + this.data = data + } + + toJsonRpcError () { + return { + message: this.message, + code: this.code, + data: this.data + } + } +} + +const create = (code, getProps) => { + const factory = args => new XoError({ ...getProps(args), code }) + factory.is = (error, predicate) => + error.code === code && iteratee(predicate)(error) + + return factory +} + +// ============================================================================= + +export const notImplemented = create(0, () => ({ + message: 'not implemented' +})) + +export const noSuchObject = create(1, (id, type) => ({ + data: { id, type }, + message: 'no such object' +})) + +export const unauthorized = create(2, () => ({ + message: 'not authenticated or not enough permissions' +})) + +export const invalidCredentials = create(3, () => ({ + message: 'invalid credentials' +})) + +// Deprecated alreadyAuthenticated (4) + +export const forbiddenOperation = create(5, (operation, reason) => ({ + data: { operation, reason }, + message: `forbidden operation: ${operation}` +})) + +// Deprecated GenericError (6) + +export const noHostsAvailable = create(7, () => ({ + message: 'no hosts available' +})) + +export const authenticationFailed = create(8, () => ({ + message: 'authentication failed' +})) + +export const hostUnreached = create(9, id => ({ + data: { id }, + message: 'host unreached' +})) + +export const invalidParameters = create(10, (message, errors) => { + if (isArray(message)) { + errors = message + message = undefined + } + + return { + data: { errors }, + message: message || 'invalid parameters' + } +})