@@ -16,14 +16,9 @@ import (
16
16
)
17
17
18
18
const (
19
- // HTTP status codes
20
- StatusOK = 200
21
- StatusBadRequest = 400
22
- StatusUnauthorized = 401
23
- StatusInternalServerError = 500
24
-
25
19
// Error messages
26
- ErrInvalidJSON = "Invalid JSON"
20
+ ErrInvalidJSON = "Invalid JSON"
21
+ ErrUserNotFound = "User not found"
27
22
28
23
// Runtime config errors
29
24
ErrRuntimeConfig = "runtime config read error"
@@ -39,7 +34,8 @@ func (a *API) getAllowedLimitsFromBucket(ctx context.Context) ([]string, error)
39
34
40
35
var config runtimeconfig.RuntimeConfigValues
41
36
if err := yaml .NewDecoder (reader ).Decode (& config ); err != nil {
42
- return []string {}, nil // No allowed limits if config can't be decoded
37
+ level .Error (a .logger ).Log ("msg" , "failed to decode runtime config" , "err" , err )
38
+ return []string {}, fmt .Errorf ("failed to decode runtime config" )
43
39
}
44
40
45
41
return config .APIAllowedLimits , nil
@@ -49,14 +45,19 @@ func (a *API) getAllowedLimitsFromBucket(ctx context.Context) ([]string, error)
49
45
func (a * API ) GetOverrides (w http.ResponseWriter , r * http.Request ) {
50
46
userID , _ , err := tenant .ExtractTenantIDFromHTTPRequest (r )
51
47
if err != nil {
52
- http .Error (w , err .Error (), StatusUnauthorized )
48
+ http .Error (w , err .Error (), http . StatusUnauthorized )
53
49
return
54
50
}
55
51
56
52
// Read overrides from bucket storage
57
53
overrides , err := a .getOverridesFromBucket (r .Context (), userID )
58
54
if err != nil {
59
- http .Error (w , err .Error (), StatusInternalServerError )
55
+ if err .Error () == ErrUserNotFound {
56
+ http .Error (w , "User not found" , http .StatusBadRequest )
57
+ } else {
58
+ level .Error (a .logger ).Log ("msg" , "failed to get overrides from bucket" , "userID" , userID , "err" , err )
59
+ http .Error (w , "Internal server error" , http .StatusInternalServerError )
60
+ }
60
61
return
61
62
}
62
63
@@ -72,65 +73,70 @@ func (a *API) GetOverrides(w http.ResponseWriter, r *http.Request) {
72
73
func (a * API ) SetOverrides (w http.ResponseWriter , r * http.Request ) {
73
74
userID , _ , err := tenant .ExtractTenantIDFromHTTPRequest (r )
74
75
if err != nil {
75
- http .Error (w , err .Error (), StatusUnauthorized )
76
+ http .Error (w , err .Error (), http . StatusUnauthorized )
76
77
return
77
78
}
78
79
79
80
var overrides map [string ]interface {}
80
81
if err := json .NewDecoder (r .Body ).Decode (& overrides ); err != nil {
81
- http .Error (w , ErrInvalidJSON , StatusBadRequest )
82
+ http .Error (w , ErrInvalidJSON , http . StatusBadRequest )
82
83
return
83
84
}
84
85
85
86
// Get allowed limits from runtime config
86
87
allowedLimits , err := a .getAllowedLimitsFromBucket (r .Context ())
87
88
if err != nil {
88
- http .Error (w , "Failed to read allowed limits" , StatusInternalServerError )
89
+ level .Error (a .logger ).Log ("msg" , "failed to get allowed limits from bucket" , "userID" , userID , "err" , err )
90
+ http .Error (w , "Internal server error" , http .StatusInternalServerError )
89
91
return
90
92
}
91
93
92
94
// Validate that only allowed limits are being changed
93
95
if err := ValidateOverrides (overrides , allowedLimits ); err != nil {
94
- http .Error (w , err .Error (), StatusBadRequest )
96
+ level .Error (a .logger ).Log ("msg" , "invalid overrides validation" , "userID" , userID , "err" , err )
97
+ http .Error (w , "Invalid overrides" , http .StatusBadRequest )
95
98
return
96
99
}
97
100
98
101
// Validate that values don't exceed hard limits from runtime config
99
102
if err := a .validateHardLimits (overrides , userID ); err != nil {
100
- http .Error (w , err .Error (), StatusBadRequest )
103
+ level .Error (a .logger ).Log ("msg" , "hard limits validation failed" , "userID" , userID , "err" , err )
104
+ http .Error (w , "Invalid overrides" , http .StatusBadRequest )
101
105
return
102
106
}
103
107
104
108
// Write overrides to bucket storage
105
109
if err := a .setOverridesToBucket (r .Context (), userID , overrides ); err != nil {
106
- http .Error (w , err .Error (), StatusInternalServerError )
110
+ level .Error (a .logger ).Log ("msg" , "failed to set overrides to bucket" , "userID" , userID , "err" , err )
111
+ http .Error (w , "Internal server error" , http .StatusInternalServerError )
107
112
return
108
113
}
109
114
110
- w .WriteHeader (StatusOK )
115
+ w .WriteHeader (http . StatusOK )
111
116
}
112
117
113
118
// DeleteOverrides removes tenant-specific overrides
114
119
func (a * API ) DeleteOverrides (w http.ResponseWriter , r * http.Request ) {
115
120
userID , _ , err := tenant .ExtractTenantIDFromHTTPRequest (r )
116
121
if err != nil {
117
- http .Error (w , err .Error (), StatusUnauthorized )
122
+ http .Error (w , err .Error (), http . StatusUnauthorized )
118
123
return
119
124
}
120
125
121
126
if err := a .deleteOverridesFromBucket (r .Context (), userID ); err != nil {
122
- http .Error (w , err .Error (), StatusInternalServerError )
127
+ level .Error (a .logger ).Log ("msg" , "failed to delete overrides from bucket" , "userID" , userID , "err" , err )
128
+ http .Error (w , "Internal server error" , http .StatusInternalServerError )
123
129
return
124
130
}
125
131
126
- w .WriteHeader (StatusOK )
132
+ w .WriteHeader (http . StatusOK )
127
133
}
128
134
129
135
// getOverridesFromBucket reads overrides for a specific tenant from the runtime config file
130
136
func (a * API ) getOverridesFromBucket (ctx context.Context , userID string ) (map [string ]interface {}, error ) {
131
137
reader , err := a .bucketClient .Get (ctx , a .runtimeConfigPath )
132
138
if err != nil {
133
- return map [ string ] interface {}{}, nil
139
+ return nil , fmt . Errorf ( "failed to get runtime config: %w" , err )
134
140
}
135
141
defer reader .Close ()
136
142
@@ -155,8 +161,11 @@ func (a *API) getOverridesFromBucket(ctx context.Context, userID string) (map[st
155
161
156
162
return result , nil
157
163
}
164
+ // User does not exist in config - return error
165
+ return nil , fmt .Errorf (ErrUserNotFound )
158
166
}
159
167
168
+ // No tenant limits configured - return empty map (no overrides)
160
169
return map [string ]interface {}{}, nil
161
170
}
162
171
0 commit comments