@@ -18,15 +18,14 @@ package restHandler
18
18
19
19
import (
20
20
"encoding/json"
21
- "errors"
22
- "github.com/devtron-labs/devtron/pkg/attributes/bean"
23
21
"net/http"
24
22
23
+ "github.com/devtron-labs/devtron/pkg/attributes/bean"
24
+
25
25
"github.com/devtron-labs/devtron/api/restHandler/common"
26
26
"github.com/devtron-labs/devtron/pkg/attributes"
27
27
"github.com/devtron-labs/devtron/pkg/auth/authorisation/casbin"
28
28
"github.com/devtron-labs/devtron/pkg/auth/user"
29
- "github.com/gorilla/mux"
30
29
"go.uber.org/zap"
31
30
)
32
31
@@ -56,18 +55,32 @@ func NewUserAttributesRestHandlerImpl(logger *zap.SugaredLogger, enforcer casbin
56
55
}
57
56
58
57
func (handler * UserAttributesRestHandlerImpl ) AddUserAttributes (w http.ResponseWriter , r * http.Request ) {
59
- dto , success := handler .validateUserAttributesRequest (w , r , "PatchUserAttributes " )
58
+ dto , success := handler .validateUserAttributesRequest (w , r , "AddUserAttributes " )
60
59
if ! success {
61
60
return
62
61
}
63
62
64
- handler .logger .Infow ("request payload, AddUserAttributes" , "payload" , dto )
63
+ handler .logger .Infow ("Adding user attributes" ,
64
+ "operation" , "add_user_attributes" ,
65
+ "userId" , dto .UserId ,
66
+ "key" , dto .Key )
67
+
65
68
resp , err := handler .userAttributesService .AddUserAttributes (dto )
66
69
if err != nil {
67
- handler .logger .Errorw ("service err, AddUserAttributes" , "err" , err , "payload" , dto )
68
- common .WriteJsonResp (w , err , nil , http .StatusInternalServerError )
70
+ handler .logger .Errorw ("Failed to add user attributes" ,
71
+ "operation" , "add_user_attributes" ,
72
+ "userId" , dto .UserId ,
73
+ "key" , dto .Key ,
74
+ "err" , err )
75
+
76
+ // Use enhanced error response builder
77
+ errBuilder := common .NewErrorResponseBuilder (w , r ).
78
+ WithOperation ("user attributes creation" ).
79
+ WithResource ("user attribute" , dto .Key )
80
+ errBuilder .HandleError (err )
69
81
return
70
82
}
83
+
71
84
common .WriteJsonResp (w , nil , resp , http .StatusOK )
72
85
}
73
86
@@ -78,18 +91,32 @@ func (handler *UserAttributesRestHandlerImpl) AddUserAttributes(w http.ResponseW
78
91
// @Success 200 {object} attributes.UserAttributesDto
79
92
// @Router /orchestrator/attributes/user/update [POST]
80
93
func (handler * UserAttributesRestHandlerImpl ) UpdateUserAttributes (w http.ResponseWriter , r * http.Request ) {
81
- dto , success := handler .validateUserAttributesRequest (w , r , "PatchUserAttributes " )
94
+ dto , success := handler .validateUserAttributesRequest (w , r , "UpdateUserAttributes " )
82
95
if ! success {
83
96
return
84
97
}
85
98
86
- handler .logger .Infow ("request payload, UpdateUserAttributes" , "payload" , dto )
99
+ handler .logger .Infow ("Updating user attributes" ,
100
+ "operation" , "update_user_attributes" ,
101
+ "userId" , dto .UserId ,
102
+ "key" , dto .Key )
103
+
87
104
resp , err := handler .userAttributesService .UpdateUserAttributes (dto )
88
105
if err != nil {
89
- handler .logger .Errorw ("service err, UpdateUserAttributes" , "err" , err , "payload" , dto )
90
- common .WriteJsonResp (w , err , nil , http .StatusInternalServerError )
106
+ handler .logger .Errorw ("Failed to update user attributes" ,
107
+ "operation" , "update_user_attributes" ,
108
+ "userId" , dto .UserId ,
109
+ "key" , dto .Key ,
110
+ "err" , err )
111
+
112
+ // Use enhanced error response builder
113
+ errBuilder := common .NewErrorResponseBuilder (w , r ).
114
+ WithOperation ("user attributes update" ).
115
+ WithResource ("user attribute" , dto .Key )
116
+ errBuilder .HandleError (err )
91
117
return
92
118
}
119
+
93
120
common .WriteJsonResp (w , nil , resp , http .StatusOK )
94
121
}
95
122
@@ -99,38 +126,68 @@ func (handler *UserAttributesRestHandlerImpl) PatchUserAttributes(w http.Respons
99
126
return
100
127
}
101
128
102
- handler .logger .Infow ("request payload, PatchUserAttributes" , "payload" , dto )
129
+ handler .logger .Infow ("Patching user attributes" ,
130
+ "operation" , "patch_user_attributes" ,
131
+ "userId" , dto .UserId ,
132
+ "key" , dto .Key )
133
+
103
134
resp , err := handler .userAttributesService .PatchUserAttributes (dto )
104
135
if err != nil {
105
- handler .logger .Errorw ("service err, PatchUserAttributes" , "err" , err , "payload" , dto )
106
- common .WriteJsonResp (w , err , nil , http .StatusInternalServerError )
136
+ handler .logger .Errorw ("Failed to patch user attributes" ,
137
+ "operation" , "patch_user_attributes" ,
138
+ "userId" , dto .UserId ,
139
+ "key" , dto .Key ,
140
+ "err" , err )
141
+
142
+ // Use enhanced error response builder
143
+ errBuilder := common .NewErrorResponseBuilder (w , r ).
144
+ WithOperation ("user attributes patch" ).
145
+ WithResource ("user attribute" , dto .Key )
146
+ errBuilder .HandleError (err )
107
147
return
108
148
}
149
+
109
150
common .WriteJsonResp (w , nil , resp , http .StatusOK )
110
151
}
111
152
112
153
func (handler * UserAttributesRestHandlerImpl ) validateUserAttributesRequest (w http.ResponseWriter , r * http.Request , operation string ) (* bean.UserAttributesDto , bool ) {
154
+ // 1. Authentication check using enhanced error handling
113
155
userId , err := handler .userService .GetLoggedInUser (r )
114
156
if userId == 0 || err != nil {
115
157
common .HandleUnauthorized (w , r )
116
158
return nil , false
117
159
}
118
160
161
+ // 2. Request body parsing with enhanced error handling
119
162
decoder := json .NewDecoder (r .Body )
120
163
var dto bean.UserAttributesDto
121
164
err = decoder .Decode (& dto )
122
165
if err != nil {
123
- handler .logger .Errorw ("request err, " + operation , "err" , err , "payload" , dto )
124
- common .WriteJsonResp (w , err , nil , http .StatusBadRequest )
166
+ handler .logger .Errorw ("Request parsing error" ,
167
+ "operation" , operation ,
168
+ "err" , err ,
169
+ "userId" , userId )
170
+
171
+ // Use enhanced error response builder for request parsing errors
172
+ errBuilder := common .NewErrorResponseBuilder (w , r ).
173
+ WithOperation (operation ).
174
+ WithResource ("user attributes" , "" )
175
+ errBuilder .HandleError (err )
125
176
return nil , false
126
177
}
127
178
128
179
dto .UserId = userId
129
180
181
+ // 3. Get user email with enhanced error handling
130
182
emailId , err := handler .userService .GetActiveEmailById (userId )
131
183
if err != nil {
132
- handler .logger .Errorw ("request err, " + operation , "err" , err , "payload" , dto )
133
- common .WriteJsonResp (w , errors .New ("unauthorized" ), nil , http .StatusForbidden )
184
+ handler .logger .Errorw ("Failed to get user email" ,
185
+ "operation" , operation ,
186
+ "userId" , userId ,
187
+ "err" , err )
188
+
189
+ // Use enhanced error response for forbidden access
190
+ common .WriteForbiddenError (w , "access user attributes" , "user" )
134
191
return nil , false
135
192
}
136
193
dto .EmailId = emailId
@@ -145,36 +202,58 @@ func (handler *UserAttributesRestHandlerImpl) validateUserAttributesRequest(w ht
145
202
// @Success 200 {object} attributes.UserAttributesDto
146
203
// @Router /orchestrator/attributes/user/get [GET]
147
204
func (handler * UserAttributesRestHandlerImpl ) GetUserAttribute (w http.ResponseWriter , r * http.Request ) {
205
+ // 1. Authentication check using enhanced error handling
148
206
userId , err := handler .userService .GetLoggedInUser (r )
149
207
if userId == 0 || err != nil {
150
208
common .HandleUnauthorized (w , r )
151
209
return
152
210
}
153
211
154
- vars := mux .Vars (r )
155
- key := vars ["key" ]
156
- if key == "" {
157
- handler .logger .Errorw ("request err, GetUserAttribute" , "err" , err , "key" , key )
158
- common .WriteJsonResp (w , err , nil , http .StatusBadRequest )
212
+ // 2. Enhanced parameter extraction with automatic validation
213
+ key , err := common .ExtractStringPathParamWithContext (w , r , "key" )
214
+ if err != nil {
215
+ // Error already written by ExtractStringPathParamWithContext
159
216
return
160
217
}
161
218
162
- dto := bean.UserAttributesDto {}
163
-
219
+ // 3. Get user email with enhanced error handling
164
220
emailId , err := handler .userService .GetActiveEmailById (userId )
165
221
if err != nil {
166
- handler .logger .Errorw ("request err, UpdateUserAttributes" , "err" , err , "payload" , dto )
167
- common .WriteJsonResp (w , errors .New ("unauthorized" ), nil , http .StatusForbidden )
222
+ handler .logger .Errorw ("Failed to get user email" ,
223
+ "operation" , "get_user_attribute" ,
224
+ "userId" , userId ,
225
+ "key" , key ,
226
+ "err" , err )
227
+
228
+ // Use enhanced error response for forbidden access
229
+ common .WriteForbiddenError (w , "access user attributes" , "user" )
168
230
return
169
231
}
170
- dto .EmailId = emailId
171
- dto .Key = key
172
232
233
+ // 4. Prepare DTO
234
+ dto := bean.UserAttributesDto {
235
+ UserId : userId ,
236
+ EmailId : emailId ,
237
+ Key : key ,
238
+ }
239
+
240
+ // 5. Service call with enhanced error handling
173
241
res , err := handler .userAttributesService .GetUserAttribute (& dto )
174
242
if err != nil {
175
- handler .logger .Errorw ("service err, GetAttributesById" , "err" , err )
176
- common .WriteJsonResp (w , err , nil , http .StatusInternalServerError )
243
+ handler .logger .Errorw ("Failed to get user attribute" ,
244
+ "operation" , "get_user_attribute" ,
245
+ "userId" , userId ,
246
+ "key" , key ,
247
+ "err" , err )
248
+
249
+ // Use enhanced error response builder
250
+ errBuilder := common .NewErrorResponseBuilder (w , r ).
251
+ WithOperation ("user attribute retrieval" ).
252
+ WithResource ("user attribute" , key )
253
+ errBuilder .HandleError (err )
177
254
return
178
255
}
256
+
257
+ // 6. Success response
179
258
common .WriteJsonResp (w , nil , res , http .StatusOK )
180
259
}
0 commit comments