UNPKG

3.01 kBPlain TextView Raw
1import {APIConfig} from "./APIConfig";
2import * as shortid from "shortid";
3import {get, isNil} from "lodash";
4
5export class APIError {
6 id: string;
7 friendlyMessage: any;
8 rawError: Error;
9 statusCode: number;
10 extraData: any;
11
12 constructor(friendlyMessage: any, rawError?: Error, statusCode: number = 500, extraData?: any) {
13 this.id = shortid.generate();
14
15 // Is this already and API friendly error?
16 if (get(rawError, "isAPIFriendly", false)) {
17 this.friendlyMessage = (<any>rawError).message;
18 this.statusCode = (<any>rawError).statusCode;
19 }
20 else {
21 this.friendlyMessage = friendlyMessage;
22 this.statusCode = statusCode;
23 }
24
25 this.rawError = rawError;
26 this.extraData = extraData;
27 }
28
29 static shouldReject(error: Error, rejectFunction: Function) {
30 if (!isNil(error)) {
31 if (rejectFunction) {
32 rejectFunction(error);
33 }
34 return true;
35 }
36
37 return false;
38 }
39
40 static createValidationError(errors: { parameter: string, message: string }[]) {
41 return new APIError("validation_error", null, 400, errors);
42 }
43
44 static create404NotFoundError(): Error {
45 return APIError.createAPIFriendlyError("not found", 404);
46 }
47
48 static create401UnauthorizedError(): Error {
49 return APIError.createAPIFriendlyError("unauthorized", 401);
50 }
51
52 static createAPIFriendlyError(message: string, statusCode: number = 500): Error {
53 let error = new Error(message);
54 (<any>error).isAPIFriendly = true;
55 (<any>error).statusCode = statusCode;
56 return error;
57 }
58
59 private static _rawErrorOut(error: Error) {
60
61 let errorData: any = {
62 "error": error.toString()
63 };
64
65 let stack = error.stack;
66 if (stack) {
67 errorData.stack = stack.split('\n').map(function (line) {
68 return line.trim();
69 }).slice(1);
70 }
71
72 return errorData
73 }
74
75 out(includeRawError: boolean = APIConfig.DISPLAY_RAW_ERRORS) {
76 let output: any = {
77 "error": {
78 "id": this.id,
79 "message": this.friendlyMessage,
80 "details": this.extraData,
81 }
82 };
83
84 if (includeRawError && !isNil(this.rawError)) {
85 output.error.raw_error = APIError._rawErrorOut(this.rawError);
86 }
87
88 return output;
89 }
90
91 hapiOut(includeRawError: boolean = APIConfig.DISPLAY_RAW_ERRORS) {
92 let output: any = {
93 "this": "failed",
94 "with": this.statusCode,
95 "because": {
96 "message": this.friendlyMessage,
97 "details": this.extraData
98 },
99 "id": this.id
100 };
101
102 if (includeRawError && !isNil(this.rawError)) {
103 output.because.raw_error = APIError._rawErrorOut(this.rawError);
104 }
105
106 return output;
107 }
108}
\No newline at end of file