summaryrefslogtreecommitdiff
path: root/internal/api/client/search/searchget.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/api/client/search/searchget.go')
-rw-r--r--internal/api/client/search/searchget.go195
1 files changed, 123 insertions, 72 deletions
diff --git a/internal/api/client/search/searchget.go b/internal/api/client/search/searchget.go
index d129bf4d6..33a90e078 100644
--- a/internal/api/client/search/searchget.go
+++ b/internal/api/client/search/searchget.go
@@ -18,10 +18,7 @@
package search
import (
- "errors"
- "fmt"
"net/http"
- "strconv"
"github.com/gin-gonic/gin"
apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model"
@@ -40,6 +37,98 @@ import (
// tags:
// - search
//
+// produces:
+// - application/json
+//
+// parameters:
+// -
+// name: max_id
+// type: string
+// description: >-
+// Return only items *OLDER* than the given max ID.
+// The item with the specified ID will not be included in the response.
+// Currently only used if 'type' is set to a specific type.
+// in: query
+// required: false
+// -
+// name: min_id
+// type: string
+// description: >-
+// Return only items *immediately newer* than the given min ID.
+// The item with the specified ID will not be included in the response.
+// Currently only used if 'type' is set to a specific type.
+// in: query
+// required: false
+// -
+// name: limit
+// type: integer
+// description: Number of each type of item to return.
+// default: 20
+// maximum: 40
+// minimum: 1
+// in: query
+// required: false
+// -
+// name: offset
+// type: integer
+// description: >-
+// Page number of results to return (starts at 0).
+// This parameter is currently not used, page by selecting
+// a specific query type and using maxID and minID instead.
+// default: 0
+// maximum: 10
+// minimum: 0
+// in: query
+// required: false
+// -
+// name: q
+// type: string
+// description: |-
+// Query string to search for. This can be in the following forms:
+// - `@[username]` -- search for an account with the given username on any domain. Can return multiple results.
+// - @[username]@[domain]` -- search for a remote account with exact username and domain. Will only ever return 1 result at most.
+// - `https://example.org/some/arbitrary/url` -- search for an account OR a status with the given URL. Will only ever return 1 result at most.
+// - any arbitrary string -- search for accounts or statuses containing the given string. Can return multiple results.
+// in: query
+// required: true
+// -
+// name: type
+// type: string
+// description: |-
+// Type of item to return. One of:
+// - `` -- empty string; return any/all results.
+// - `accounts` -- return account(s).
+// - `statuses` -- return status(es).
+// - `hashtags` -- return hashtag(s).
+// If `type` is specified, paging can be performed using max_id and min_id parameters.
+// If `type` is not specified, see the `offset` parameter for paging.
+// in: query
+// -
+// name: resolve
+// type: boolean
+// description: >-
+// If searching query is for `@[username]@[domain]`, or a URL, allow the GoToSocial
+// instance to resolve the search by making calls to remote instances (webfinger, ActivityPub, etc).
+// default: false
+// in: query
+// -
+// name: following
+// type: boolean
+// description: >-
+// If search type includes accounts, and search query is an arbitrary string, show only accounts
+// that the requesting account follows. If this is set to `true`, then the GoToSocial instance will
+// enhance the search by also searching within account notes, not just in usernames and display names.
+// default: false
+// in: query
+// -
+// name: exclude_unreviewed
+// type: boolean
+// description: >-
+// If searching for hashtags, exclude those not yet approved by instance admin.
+// Currently this parameter is unused.
+// default: false
+// in: query
+//
// security:
// - OAuth2 Bearer:
// - read:search
@@ -74,93 +163,55 @@ func (m *Module) SearchGETHandler(c *gin.Context) {
return
}
- excludeUnreviewed := false
- excludeUnreviewedString := c.Query(ExcludeUnreviewedKey)
- if excludeUnreviewedString != "" {
- var err error
- excludeUnreviewed, err = strconv.ParseBool(excludeUnreviewedString)
- if err != nil {
- err := fmt.Errorf("error parsing %s: %s", ExcludeUnreviewedKey, err)
- apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1)
- return
- }
+ limit, errWithCode := apiutil.ParseLimit(c.Query(apiutil.LimitKey), 20, 40, 1)
+ if errWithCode != nil {
+ apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1)
+ return
}
- query := c.Query(QueryKey)
- if query == "" {
- err := errors.New("query parameter q was empty")
- apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1)
+ offset, errWithCode := apiutil.ParseSearchOffset(c.Query(apiutil.SearchOffsetKey), 0, 10, 0)
+ if errWithCode != nil {
+ apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1)
return
}
- resolve := false
- resolveString := c.Query(ResolveKey)
- if resolveString != "" {
- var err error
- resolve, err = strconv.ParseBool(resolveString)
- if err != nil {
- err := fmt.Errorf("error parsing %s: %s", ResolveKey, err)
- apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1)
- return
- }
+ query, errWithCode := apiutil.ParseSearchQuery(c.Query(apiutil.SearchQueryKey))
+ if errWithCode != nil {
+ apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1)
+ return
}
- limit := 2
- limitString := c.Query(LimitKey)
- if limitString != "" {
- i, err := strconv.ParseInt(limitString, 10, 32)
- if err != nil {
- err := fmt.Errorf("error parsing %s: %s", LimitKey, err)
- apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1)
- return
- }
- limit = int(i)
- }
- if limit > 40 {
- limit = 40
- }
- if limit < 1 {
- limit = 1
+ resolve, errWithCode := apiutil.ParseSearchResolve(c.Query(apiutil.SearchResolveKey), false)
+ if errWithCode != nil {
+ apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1)
+ return
}
- offset := 0
- offsetString := c.Query(OffsetKey)
- if offsetString != "" {
- i, err := strconv.ParseInt(offsetString, 10, 32)
- if err != nil {
- err := fmt.Errorf("error parsing %s: %s", OffsetKey, err)
- apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1)
- return
- }
- offset = int(i)
+ following, errWithCode := apiutil.ParseSearchFollowing(c.Query(apiutil.SearchFollowingKey), false)
+ if errWithCode != nil {
+ apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1)
+ return
}
- following := false
- followingString := c.Query(FollowingKey)
- if followingString != "" {
- var err error
- following, err = strconv.ParseBool(followingString)
- if err != nil {
- err := fmt.Errorf("error parsing %s: %s", FollowingKey, err)
- apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1)
- return
- }
+ excludeUnreviewed, errWithCode := apiutil.ParseSearchExcludeUnreviewed(c.Query(apiutil.SearchExcludeUnreviewedKey), false)
+ if errWithCode != nil {
+ apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1)
+ return
}
- searchQuery := &apimodel.SearchQuery{
- AccountID: c.Query(AccountIDKey),
- MaxID: c.Query(MaxIDKey),
- MinID: c.Query(MinIDKey),
- Type: c.Query(TypeKey),
- ExcludeUnreviewed: excludeUnreviewed,
- Query: query,
- Resolve: resolve,
+ searchRequest := &apimodel.SearchRequest{
+ MaxID: c.Query(apiutil.MaxIDKey),
+ MinID: c.Query(apiutil.MinIDKey),
Limit: limit,
Offset: offset,
+ Query: query,
+ QueryType: c.Query(apiutil.SearchTypeKey),
+ Resolve: resolve,
Following: following,
+ ExcludeUnreviewed: excludeUnreviewed,
}
- results, errWithCode := m.processor.SearchGet(c.Request.Context(), authed, searchQuery)
+ results, errWithCode := m.processor.Search().Get(c.Request.Context(), authed.Account, searchRequest)
if errWithCode != nil {
apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1)
return