diff --git a/internal/api/json.go b/internal/api/json.go index edc5f9df8..50bde239d 100644 --- a/internal/api/json.go +++ b/internal/api/json.go @@ -3,9 +3,11 @@ package api import ( "encoding/json" "strings" + + "github.com/stashapp/stash/pkg/models" ) -// JSONNumberToNumber converts a JSON number to either a float64 or int64. +// jsonNumberToNumber converts a JSON number to either a float64 or int64. func jsonNumberToNumber(n json.Number) interface{} { if strings.Contains(string(n), ".") { f, _ := n.Float64() @@ -15,6 +17,15 @@ func jsonNumberToNumber(n json.Number) interface{} { return ret } +// anyJSONNumberToNumber converts a JSON number using jsonNumberToNumber, otherwise it returns the existing value +func anyJSONNumberToNumber(v any) any { + if n, ok := v.(json.Number); ok { + return jsonNumberToNumber(n) + } + + return v +} + // ConvertMapJSONNumbers converts all JSON numbers in a map to either float64 or int64. func convertMapJSONNumbers(m map[string]interface{}) (ret map[string]interface{}) { if m == nil { @@ -34,3 +45,21 @@ func convertMapJSONNumbers(m map[string]interface{}) (ret map[string]interface{} return ret } + +func convertCustomFieldCriterionValues(c models.CustomFieldCriterionInput) models.CustomFieldCriterionInput { + nv := make([]any, len(c.Value)) + for i, v := range c.Value { + nv[i] = anyJSONNumberToNumber(v) + } + c.Value = nv + return c +} + +func convertCustomFieldCriterionInputJSONNumbers(c []models.CustomFieldCriterionInput) []models.CustomFieldCriterionInput { + ret := make([]models.CustomFieldCriterionInput, len(c)) + for i, v := range c { + ret[i] = convertCustomFieldCriterionValues(v) + } + + return ret +} diff --git a/internal/api/resolver_query_find_performer.go b/internal/api/resolver_query_find_performer.go index 41218fd01..0ee48dcd4 100644 --- a/internal/api/resolver_query_find_performer.go +++ b/internal/api/resolver_query_find_performer.go @@ -32,6 +32,9 @@ func (r *queryResolver) FindPerformers(ctx context.Context, performerFilter *mod } } + // #5682 - convert JSON numbers to float64 or int64 + performerFilter.CustomFields = convertCustomFieldCriterionInputJSONNumbers(performerFilter.CustomFields) + if err := r.withReadTxn(ctx, func(ctx context.Context) error { var performers []*models.Performer var err error