Skip to content

Commit f7ff155

Browse files
authored
fix: percentageFee error messages | GBI-2642&GBI-2643 (#712)
* fix: percentageFee error messages | GBI-2642&GBI-2643 * fix: golang-cli
1 parent 45c6642 commit f7ff155

File tree

4 files changed

+29
-4
lines changed

4 files changed

+29
-4
lines changed

internal/adapters/entrypoints/rest/assets/static/configUtils.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,13 @@ async function postConfig(sectionId, endpoint, config, csrfToken) {
9797
body: JSON.stringify({ configuration: config })
9898
});
9999
if (!response.ok) {
100-
const errorData = await response.json();
100+
const errorData = await response.json();
101+
if (errorData.details && typeof errorData.details === 'object') {
102+
const detailMessages = Object.entries(errorData.details)
103+
.map(([field, message]) => `${field}: ${message}`)
104+
.join(', ');
105+
throw new Error(detailMessages);
106+
}
101107
throw new Error(`Error saving ${sectionId} configuration: ${errorData.message || 'Unknown error'}`);
102108
}
103109
return true;

internal/adapters/entrypoints/rest/assets/static/management.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ function checkFeeWarnings() {
389389
const existingToast = document.getElementById('warningToast');
390390
if (shouldWarn) {
391391
if (!existingToast) {
392-
showWarningToast('It is recommended to enable at least one of "feePercentage" or "fixedFee".');
392+
showWarningToast('You have configured a zero-fee setting. This means you won’t earn fees from bridging transactions.');
393393
} else {
394394
bootstrap.Toast.getOrCreateInstance(existingToast).show();
395395
}

internal/adapters/entrypoints/rest/common.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,25 @@ func DecodeRequest[T any](w http.ResponseWriter, req *http.Request, body *T) err
134134
return nil
135135
}
136136

137+
func getValidationMessage(field validator.FieldError) string {
138+
switch field.Tag() {
139+
case "required":
140+
return "is required"
141+
case "numeric":
142+
return "must be numeric"
143+
case "positive_string":
144+
return "must be a positive number"
145+
case "gte":
146+
return "must be greater than or equal to " + field.Param()
147+
case "lte":
148+
return "must be less than or equal to " + field.Param()
149+
case "max_decimal_places":
150+
return fmt.Sprintf("must have at most %s decimal places", field.Param())
151+
default:
152+
return "validation failed: " + field.Tag()
153+
}
154+
}
155+
137156
func ValidateRequest[T any](w http.ResponseWriter, body *T) error {
138157
var validationErrors validator.ValidationErrors
139158
err := RequestValidator.Struct(body)
@@ -145,7 +164,7 @@ func ValidateRequest[T any](w http.ResponseWriter, body *T) error {
145164
}
146165
details := make(ErrorDetails)
147166
for _, field := range validationErrors {
148-
details[field.Field()] = "validation failed: " + field.Tag()
167+
details[field.Field()] = getValidationMessage(field)
149168
}
150169
jsonErr := NewErrorResponseWithDetails("validation error", details, true)
151170
JsonErrorResponse(w, http.StatusBadRequest, jsonErr)

internal/adapters/entrypoints/rest/common_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ func TestValidateRequest(t *testing.T) {
171171
assert.Contains(t, response.Message, "validation error")
172172
assert.Len(t, response.Details, 2)
173173
for key := range response.Details {
174-
assert.Contains(t, response.Details[key], "validation failed")
174+
assert.NotEmpty(t, response.Details[key])
175175
}
176176
assert.True(t, response.Recoverable)
177177
})

0 commit comments

Comments
 (0)