@@ -2,6 +2,15 @@ import { HTTP_STATUS } from '../../shared/constants/http/http-status.js';
2
2
import { ITEM_CONSTANTS } from './person.constant.js' ;
3
3
import { validateItem } from './person.schema.js' ;
4
4
5
+
6
+ const validatePositiveInteger = ( value , fieldName = 'ID' ) => {
7
+ const parsed = parseInt ( value ) ;
8
+ if ( isNaN ( parsed ) || parsed <= 0 ) {
9
+ throw new Error ( `Invalid ${ fieldName } parameter. Must be a positive integer.` ) ;
10
+ }
11
+ return parsed ;
12
+ } ;
13
+
5
14
class Controller {
6
15
constructor ( service ) {
7
16
this . service = service ;
@@ -21,11 +30,27 @@ class Controller {
21
30
22
31
getItemById = async ( req , res , next ) => {
23
32
try {
24
- const result = await this . service . getItemById ( parseInt ( req . params . id ) ) ;
25
- res . locals = { data : result , statusCode : HTTP_STATUS . OK } ;
33
+ const id = validatePositiveInteger ( req . params . id ) ;
26
34
35
+ const result = await this . service . getItemById ( id ) ;
36
+ res . locals = { data : result , statusCode : HTTP_STATUS . OK } ;
27
37
return next ( ) ;
38
+
28
39
} catch ( error ) {
40
+ if ( error . message . includes ( 'Invalid' ) && error . message . includes ( 'parameter' ) ) {
41
+ return next ( {
42
+ statusCode : HTTP_STATUS . BAD_REQUEST ,
43
+ message : error . message ,
44
+ context : `${ req . method } ${ req . originalUrl } ` ,
45
+ details : {
46
+ path : req . originalUrl ,
47
+ errorCode : HTTP_STATUS . BAD_REQUEST ,
48
+ timestamp : new Date ( ) . toISOString ( ) ,
49
+ receivedId : req . params . id
50
+ }
51
+ } ) ;
52
+ }
53
+
29
54
if ( error . message === ITEM_CONSTANTS . NOT_FOUND ) {
30
55
return next ( {
31
56
statusCode : HTTP_STATUS . NOT_FOUND ,
@@ -48,7 +73,6 @@ class Controller {
48
73
validateItem ( req . body ) ;
49
74
const result = await this . service . createItem ( req . body ) ;
50
75
res . locals = { data : result , statusCode : HTTP_STATUS . CREATED } ;
51
-
52
76
return next ( ) ;
53
77
} catch ( error ) {
54
78
if ( error . message === ITEM_CONSTANTS . ALREADY_EXISTS ) {
@@ -57,44 +81,92 @@ class Controller {
57
81
if ( error . name === 'ValidationError' ) {
58
82
return next ( { statusCode : HTTP_STATUS . BAD_REQUEST , message : error . message } ) ;
59
83
}
60
-
61
84
return next ( error ) ;
62
85
}
63
86
} ;
64
87
65
88
updateItem = async ( req , res , next ) => {
66
89
try {
90
+ const id = validatePositiveInteger ( req . params . id ) ;
91
+
67
92
validateItem ( req . body ) ;
68
- const result = await this . service . updateItem ( parseInt ( req . params . id ) , req . body ) ;
93
+ const result = await this . service . updateItem ( id , req . body ) ;
69
94
res . locals = { data : result , statusCode : HTTP_STATUS . OK } ;
70
-
71
95
return next ( ) ;
96
+
72
97
} catch ( error ) {
98
+ if ( error . message . includes ( 'Invalid' ) && error . message . includes ( 'parameter' ) ) {
99
+ return next ( {
100
+ statusCode : HTTP_STATUS . BAD_REQUEST ,
101
+ message : error . message ,
102
+ context : `${ req . method } ${ req . originalUrl } ` ,
103
+ details : {
104
+ path : req . originalUrl ,
105
+ errorCode : HTTP_STATUS . BAD_REQUEST ,
106
+ timestamp : new Date ( ) . toISOString ( ) ,
107
+ receivedId : req . params . id
108
+ }
109
+ } ) ;
110
+ }
111
+
73
112
if ( error . message === ITEM_CONSTANTS . NOT_FOUND ) {
74
- return next ( { statusCode : HTTP_STATUS . NOT_FOUND , message : error . message } ) ;
113
+ return next ( {
114
+ statusCode : HTTP_STATUS . NOT_FOUND ,
115
+ message : error . message ,
116
+ context : `${ req . method } ${ req . originalUrl } ` ,
117
+ details : {
118
+ path : req . originalUrl ,
119
+ errorCode : HTTP_STATUS . NOT_FOUND ,
120
+ timestamp : new Date ( ) . toISOString ( ) ,
121
+ }
122
+ } ) ;
75
123
}
76
124
if ( error . name === 'ValidationError' ) {
77
125
return next ( { statusCode : HTTP_STATUS . BAD_REQUEST , message : error . message } ) ;
78
126
}
79
-
80
127
return next ( error ) ;
81
128
}
82
129
} ;
83
130
84
131
deleteItem = async ( req , res , next ) => {
85
132
try {
86
- const result = await this . service . deleteItem ( parseInt ( req . params . id ) ) ;
87
- res . locals = { data : result , statusCode : HTTP_STATUS . OK } ;
133
+ const id = validatePositiveInteger ( req . params . id ) ;
88
134
135
+ const result = await this . service . deleteItem ( id ) ;
136
+ res . locals = { data : result , statusCode : HTTP_STATUS . OK } ;
89
137
return next ( ) ;
138
+
90
139
} catch ( error ) {
91
- if ( error . message === ITEM_CONSTANTS . NOT_FOUND ) {
92
- return next ( { statusCode : HTTP_STATUS . NOT_FOUND , message : error . message } ) ;
140
+ if ( error . message . includes ( 'Invalid' ) && error . message . includes ( 'parameter' ) ) {
141
+ return next ( {
142
+ statusCode : HTTP_STATUS . BAD_REQUEST ,
143
+ message : error . message ,
144
+ context : `${ req . method } ${ req . originalUrl } ` ,
145
+ details : {
146
+ path : req . originalUrl ,
147
+ errorCode : HTTP_STATUS . BAD_REQUEST ,
148
+ timestamp : new Date ( ) . toISOString ( ) ,
149
+ receivedId : req . params . id
150
+ }
151
+ } ) ;
93
152
}
94
153
154
+ if ( error . message === ITEM_CONSTANTS . NOT_FOUND ) {
155
+ return next ( {
156
+ statusCode : HTTP_STATUS . NOT_FOUND ,
157
+ message : error . message ,
158
+ context : `${ req . method } ${ req . originalUrl } ` ,
159
+ details : {
160
+ path : req . originalUrl ,
161
+ errorCode : HTTP_STATUS . NOT_FOUND ,
162
+ timestamp : new Date ( ) . toISOString ( ) ,
163
+ }
164
+ } ) ;
165
+ }
95
166
return next ( error ) ;
96
167
}
97
168
} ;
169
+
98
170
}
99
171
100
172
export default Controller ;
0 commit comments