1 | import {APIConfig} from "./APIConfig";
|
2 | import shortid from "shortid";
|
3 | import {get, isNil} from "lodash";
|
4 |
|
5 | export 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 |
|
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 |