@@ -16,14 +16,9 @@ import (
1616)
1717
1818const (
19- // HTTP status codes
20- StatusOK = 200
21- StatusBadRequest = 400
22- StatusUnauthorized = 401
23- StatusInternalServerError = 500
24-
2519 // Error messages
26- ErrInvalidJSON = "Invalid JSON"
20+ ErrInvalidJSON = "Invalid JSON"
21+ ErrUserNotFound = "User not found"
2722
2823 // Runtime config errors
2924 ErrRuntimeConfig = "runtime config read error"
@@ -39,7 +34,8 @@ func (a *API) getAllowedLimitsFromBucket(ctx context.Context) ([]string, error)
3934
4035 var config runtimeconfig.RuntimeConfigValues
4136 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" )
4339 }
4440
4541 return config .APIAllowedLimits , nil
@@ -49,14 +45,19 @@ func (a *API) getAllowedLimitsFromBucket(ctx context.Context) ([]string, error)
4945func (a * API ) GetOverrides (w http.ResponseWriter , r * http.Request ) {
5046 userID , _ , err := tenant .ExtractTenantIDFromHTTPRequest (r )
5147 if err != nil {
52- http .Error (w , err .Error (), StatusUnauthorized )
48+ http .Error (w , err .Error (), http . StatusUnauthorized )
5349 return
5450 }
5551
5652 // Read overrides from bucket storage
5753 overrides , err := a .getOverridesFromBucket (r .Context (), userID )
5854 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+ }
6061 return
6162 }
6263
@@ -72,65 +73,70 @@ func (a *API) GetOverrides(w http.ResponseWriter, r *http.Request) {
7273func (a * API ) SetOverrides (w http.ResponseWriter , r * http.Request ) {
7374 userID , _ , err := tenant .ExtractTenantIDFromHTTPRequest (r )
7475 if err != nil {
75- http .Error (w , err .Error (), StatusUnauthorized )
76+ http .Error (w , err .Error (), http . StatusUnauthorized )
7677 return
7778 }
7879
7980 var overrides map [string ]interface {}
8081 if err := json .NewDecoder (r .Body ).Decode (& overrides ); err != nil {
81- http .Error (w , ErrInvalidJSON , StatusBadRequest )
82+ http .Error (w , ErrInvalidJSON , http . StatusBadRequest )
8283 return
8384 }
8485
8586 // Get allowed limits from runtime config
8687 allowedLimits , err := a .getAllowedLimitsFromBucket (r .Context ())
8788 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 )
8991 return
9092 }
9193
9294 // Validate that only allowed limits are being changed
9395 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 )
9598 return
9699 }
97100
98101 // Validate that values don't exceed hard limits from runtime config
99102 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 )
101105 return
102106 }
103107
104108 // Write overrides to bucket storage
105109 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 )
107112 return
108113 }
109114
110- w .WriteHeader (StatusOK )
115+ w .WriteHeader (http . StatusOK )
111116}
112117
113118// DeleteOverrides removes tenant-specific overrides
114119func (a * API ) DeleteOverrides (w http.ResponseWriter , r * http.Request ) {
115120 userID , _ , err := tenant .ExtractTenantIDFromHTTPRequest (r )
116121 if err != nil {
117- http .Error (w , err .Error (), StatusUnauthorized )
122+ http .Error (w , err .Error (), http . StatusUnauthorized )
118123 return
119124 }
120125
121126 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 )
123129 return
124130 }
125131
126- w .WriteHeader (StatusOK )
132+ w .WriteHeader (http . StatusOK )
127133}
128134
129135// getOverridesFromBucket reads overrides for a specific tenant from the runtime config file
130136func (a * API ) getOverridesFromBucket (ctx context.Context , userID string ) (map [string ]interface {}, error ) {
131137 reader , err := a .bucketClient .Get (ctx , a .runtimeConfigPath )
132138 if err != nil {
133- return map [ string ] interface {}{}, nil
139+ return nil , fmt . Errorf ( "failed to get runtime config: %w" , err )
134140 }
135141 defer reader .Close ()
136142
@@ -155,8 +161,11 @@ func (a *API) getOverridesFromBucket(ctx context.Context, userID string) (map[st
155161
156162 return result , nil
157163 }
164+ // User does not exist in config - return error
165+ return nil , fmt .Errorf (ErrUserNotFound )
158166 }
159167
168+ // No tenant limits configured - return empty map (no overrides)
160169 return map [string ]interface {}{}, nil
161170}
162171
0 commit comments