summaryrefslogtreecommitdiff
path: root/internal/api/util/parsequery.go
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2023-06-21 18:26:40 +0200
committerLibravatar GitHub <noreply@github.com>2023-06-21 17:26:40 +0100
commit831ae09f8bab04af854243421047371339c3e190 (patch)
treef7709d478cc363dc1899bdb658fe20e2dc7986f3 /internal/api/util/parsequery.go
parent[docs] Disambiguate docker version, don't recommend opening localhost (#1913) (diff)
downloadgotosocial-831ae09f8bab04af854243421047371339c3e190.tar.xz
[feature] Add partial text search for accounts + statuses (#1836)
Diffstat (limited to 'internal/api/util/parsequery.go')
-rw-r--r--internal/api/util/parsequery.go152
1 files changed, 140 insertions, 12 deletions
diff --git a/internal/api/util/parsequery.go b/internal/api/util/parsequery.go
index 92578a739..460ca3e05 100644
--- a/internal/api/util/parsequery.go
+++ b/internal/api/util/parsequery.go
@@ -25,34 +25,162 @@ import (
)
const (
+ /* Common keys */
+
LimitKey = "limit"
LocalKey = "local"
+ MaxIDKey = "max_id"
+ MinIDKey = "min_id"
+
+ /* Search keys */
+
+ SearchExcludeUnreviewedKey = "exclude_unreviewed"
+ SearchFollowingKey = "following"
+ SearchLookupKey = "acct"
+ SearchOffsetKey = "offset"
+ SearchQueryKey = "q"
+ SearchResolveKey = "resolve"
+ SearchTypeKey = "type"
)
-func ParseLimit(limit string, defaultLimit int) (int, gtserror.WithCode) {
- if limit == "" {
- return defaultLimit, nil
+// parseError returns gtserror.WithCode set to 400 Bad Request, to indicate
+// to the caller that a key was set to a value that could not be parsed.
+func parseError(key string, value, defaultValue any, err error) gtserror.WithCode {
+ err = fmt.Errorf("error parsing key %s with value %s as %T: %w", key, value, defaultValue, err)
+ return gtserror.NewErrorBadRequest(err, err.Error())
+}
+
+func requiredError(key string) gtserror.WithCode {
+ err := fmt.Errorf("required key %s was not set or had empty value", key)
+ return gtserror.NewErrorBadRequest(err, err.Error())
+}
+
+/*
+ Parse functions for *OPTIONAL* parameters with default values.
+*/
+
+func ParseLimit(value string, defaultValue int, max, min int) (int, gtserror.WithCode) {
+ key := LimitKey
+
+ if value == "" {
+ return defaultValue, nil
}
- i, err := strconv.Atoi(limit)
+ i, err := strconv.Atoi(value)
if err != nil {
- err := fmt.Errorf("error parsing %s: %w", LimitKey, err)
- return 0, gtserror.NewErrorBadRequest(err, err.Error())
+ return defaultValue, parseError(key, value, defaultValue, err)
+ }
+
+ if i > max {
+ i = max
+ } else if i < min {
+ i = min
}
return i, nil
}
-func ParseLocal(local string, defaultLocal bool) (bool, gtserror.WithCode) {
- if local == "" {
- return defaultLocal, nil
+func ParseLocal(value string, defaultValue bool) (bool, gtserror.WithCode) {
+ key := LimitKey
+
+ if value == "" {
+ return defaultValue, nil
}
- i, err := strconv.ParseBool(local)
+ i, err := strconv.ParseBool(value)
if err != nil {
- err := fmt.Errorf("error parsing %s: %w", LocalKey, err)
- return false, gtserror.NewErrorBadRequest(err, err.Error())
+ return defaultValue, parseError(key, value, defaultValue, err)
}
return i, nil
}
+
+func ParseSearchExcludeUnreviewed(value string, defaultValue bool) (bool, gtserror.WithCode) {
+ key := SearchExcludeUnreviewedKey
+
+ if value == "" {
+ return defaultValue, nil
+ }
+
+ i, err := strconv.ParseBool(value)
+ if err != nil {
+ return defaultValue, parseError(key, value, defaultValue, err)
+ }
+
+ return i, nil
+}
+
+func ParseSearchFollowing(value string, defaultValue bool) (bool, gtserror.WithCode) {
+ key := SearchFollowingKey
+
+ if value == "" {
+ return defaultValue, nil
+ }
+
+ i, err := strconv.ParseBool(value)
+ if err != nil {
+ return defaultValue, parseError(key, value, defaultValue, err)
+ }
+
+ return i, nil
+}
+
+func ParseSearchOffset(value string, defaultValue int, max, min int) (int, gtserror.WithCode) {
+ key := SearchOffsetKey
+
+ if value == "" {
+ return defaultValue, nil
+ }
+
+ i, err := strconv.Atoi(value)
+ if err != nil {
+ return defaultValue, parseError(key, value, defaultValue, err)
+ }
+
+ if i > max {
+ i = max
+ } else if i < min {
+ i = min
+ }
+
+ return i, nil
+}
+
+func ParseSearchResolve(value string, defaultValue bool) (bool, gtserror.WithCode) {
+ key := SearchResolveKey
+
+ if value == "" {
+ return defaultValue, nil
+ }
+
+ i, err := strconv.ParseBool(value)
+ if err != nil {
+ return defaultValue, parseError(key, value, defaultValue, err)
+ }
+
+ return i, nil
+}
+
+/*
+ Parse functions for *REQUIRED* parameters.
+*/
+
+func ParseSearchLookup(value string) (string, gtserror.WithCode) {
+ key := SearchLookupKey
+
+ if value == "" {
+ return "", requiredError(key)
+ }
+
+ return value, nil
+}
+
+func ParseSearchQuery(value string) (string, gtserror.WithCode) {
+ key := SearchQueryKey
+
+ if value == "" {
+ return "", requiredError(key)
+ }
+
+ return value, nil
+}