1
+ const { ValidationError : ObjectionValidationError } = require ( '../utils/objection' ) ;
2
+ const { UniqueViolationError, NotNullViolationError, ForeignKeyViolationError, DataError } = require ( 'objection-db-errors' ) ;
1
3
const { i18n } = require ( '../resources' ) ;
2
4
const {
5
+ LogicError,
6
+ BadRequestError,
3
7
ValidationError,
4
- NotFoundError
5
- } = require ( 'objection' ) ;
8
+ ServerError,
9
+ AuthorizationError,
10
+ ForbiddenError,
11
+ NotFoundError,
12
+ TimeoutError } = require ( '../utils/errors' ) ;
6
13
7
- const {
8
- DBError,
9
- ConstraintViolationError,
10
- UniqueViolationError,
11
- NotNullViolationError,
12
- ForeignKeyViolationError,
13
- CheckViolationError,
14
- DataError
15
- } = require ( 'objection-db-errors' ) ;
14
+ function generateResponse ( e ) {
15
+ switch ( e . constructor ) {
16
+ case ObjectionValidationError :
17
+ return new ValidationError ( 'orm_validation' , { ...e } ) ;
16
18
17
- module . exports = function errorHandler ( err , req , res , next ) {
18
- // TODO: REFACTOR
19
- // If error thrown by us
20
- if ( err . isJoi ) {
21
- return res . status ( 400 ) . send ( {
22
- message : err . message ,
23
- type : 'ModelValidation' ,
24
- data : err . details
25
- } ) ;
26
- }
27
- return handler ( err , res )
28
- } ;
19
+ case UniqueViolationError :
20
+ return new LogicError ( 'unique_violation' , { message : e . detail , field : e . columns [ 0 ] , constraint : e . constraint } ) ;
21
+
22
+ case NotNullViolationError :
23
+ return new ValidationError ( 'field_null' , { message : `${ e . column } can't be null.` , field : e . column , constraint : e . constraint } ) ; // TODO: i18n message
24
+
25
+ case ForeignKeyViolationError :
26
+ return new LogicError ( 'foreign_key_violation' , { message : e . detail , constraint : e . constraint } ) ;
27
+
28
+ case DataError :
29
+ return new BadRequestError ( 'invalid_data' , e ) ;
30
+
31
+ case SyntaxError :
32
+ return new BadRequestError ( 'json_syntax' ) ;
29
33
30
- function handler ( err , res ) {
31
- if ( err instanceof ValidationError ) {
32
- res . status ( 400 ) . send ( {
33
- message : err . message ,
34
- type : err . type ,
35
- data : { }
36
- } ) ;
37
- } else if ( err instanceof NotFoundError ) {
38
- res . status ( 404 ) . send ( {
39
- message : err . message ,
40
- type : 'NotFound' ,
41
- data : { }
42
- } ) ;
43
- } else if ( err instanceof UniqueViolationError ) {
44
- res . status ( 409 ) . send ( {
45
- message : err . message ,
46
- type : 'UniqueViolation' ,
47
- data : {
48
- columns : err . columns ,
49
- table : err . table ,
50
- constraint : err . constraint
51
- }
52
- } ) ;
53
- } else if ( err instanceof NotNullViolationError ) {
54
- res . status ( 400 ) . send ( {
55
- message : err . message ,
56
- type : 'NotNullViolation' ,
57
- data : {
58
- column : err . column ,
59
- table : err . table ,
60
- }
61
- } ) ;
62
- } else if ( err instanceof ForeignKeyViolationError ) {
63
- res . status ( 409 ) . send ( {
64
- message : err . message ,
65
- type : 'ForeignKeyViolation' ,
66
- data : {
67
- table : err . table ,
68
- constraint : err . constraint
69
- }
70
- } ) ;
71
- } else if ( err instanceof CheckViolationError ) {
72
- res . status ( 400 ) . send ( {
73
- message : err . message ,
74
- type : 'CheckViolation' ,
75
- data : {
76
- table : err . table ,
77
- constraint : err . constraint
78
- }
79
- } ) ;
80
- } else if ( err instanceof DataError ) {
81
- res . status ( 400 ) . send ( {
82
- message : err . message ,
83
- type : 'InvalidData' ,
84
- data : { }
85
- } ) ;
86
- } else if ( err instanceof DBError ) {
87
- res . status ( 500 ) . send ( {
88
- message : err . message ,
89
- type : 'UnknownDatabaseError' ,
90
- data : { }
91
- } ) ;
92
- } else {
93
- if ( err . type ) {
94
- return res . status ( err . status ) . send ( {
95
- error : {
96
- type : err . type ,
97
- code : err . code ,
98
- message : i18n . t ( err . code ) ,
99
- } ,
100
- } ) ;
101
- }
102
- console . log ( err ) ; // eslint-disable-line no-console
103
- res . status ( 500 ) . send ( {
104
- message : err . message ,
105
- type : 'UnknownError' ,
106
- data : { }
107
- } ) ;
34
+ case NotFoundError :
35
+ case BadRequestError :
36
+ case LogicError :
37
+ case ValidationError :
38
+ case AuthorizationError :
39
+ case ForbiddenError :
40
+ case ServerError :
41
+ return e ;
42
+
43
+ case Error :
44
+ if ( e . isJoi ) return new ValidationError ( 'field_validation' , { message : e . details [ 0 ] . message , field : e . details [ 0 ] . path } ) ;
45
+ return new ServerError ( 'error' , { message : e . message } ) ;
46
+
47
+ default :
48
+ if ( e . code === 'ETIMEDOUT' ) return new TimeoutError ( 'timeout_error' , { ...e } ) ;
49
+ return new ServerError ( 'unhandled_error' , { errorClass : e . constructor . name , ...e } ) ;
108
50
}
109
- }
51
+ }
52
+
53
+
54
+ function errorHandler ( err , req , res , next ) {
55
+ const { status, ...response } = generateResponse ( err ) ;
56
+ return res
57
+ . status ( status )
58
+ . json ( response ) ;
59
+ }
60
+
61
+ module . exports = errorHandler ;
0 commit comments