Support search v2 API
authorMikael Berthe <mikael@lilotux.net>
Thu, 06 Sep 2018 11:43:44 +0200
changeset 240 80c81e9b77b4
parent 239 ca5639b4768e
child 241 8538eaf18ce5
Support search v2 API
api.go
search.go
--- a/api.go	Thu Sep 06 11:28:42 2018 +0200
+++ b/api.go	Thu Sep 06 11:43:44 2018 +0200
@@ -130,7 +130,10 @@
 		return nil, err
 	}
 	if res.StatusCode < 200 || res.StatusCode >= 300 {
-		return nil, errors.Errorf("bad server status code (%d): %s",
+		// Please note that the error string code is used by Search()
+		// to check the error cause.
+		const errFormatString = "bad server status code (%d)"
+		return nil, errors.Errorf(errFormatString+": %s",
 			res.StatusCode, http.StatusText(res.StatusCode))
 	}
 
--- a/search.go	Thu Sep 06 11:28:42 2018 +0200
+++ b/search.go	Thu Sep 06 11:43:44 2018 +0200
@@ -7,21 +7,15 @@
 package madon
 
 import (
+	"strings"
+
 	"github.com/sendgrid/rest"
 )
 
 // Search search for contents (accounts or statuses) and returns a Results
-func (mc *Client) Search(query string, resolve bool) (*Results, error) {
-	if query == "" {
-		return nil, ErrInvalidParameter
-	}
-
-	params := make(apiCallParams)
-	params["q"] = query
-	if resolve {
-		params["resolve"] = "true"
-	}
-
+func (mc *Client) searchV1(params apiCallParams) (*Results, error) {
+	// We use a custom structure with shadowed Hashtags field,
+	// since the v1 version only returns strings.
 	var resultsV1 struct {
 		Results
 		Hashtags []string `json:"hashtags"`
@@ -39,3 +33,36 @@
 
 	return &results, nil
 }
+
+func (mc *Client) searchV2(params apiCallParams) (*Results, error) {
+	var results Results
+	if err := mc.apiCall("v2/"+"search", rest.Get, params, nil, nil, &results); err != nil {
+		return nil, err
+	}
+
+	return &results, nil
+}
+
+// Search search for contents (accounts or statuses) and returns a Results
+func (mc *Client) Search(query string, resolve bool) (*Results, error) {
+	if query == "" {
+		return nil, ErrInvalidParameter
+	}
+
+	// The parameters are the same in both v1 & v2 API versions
+	params := make(apiCallParams)
+	params["q"] = query
+	if resolve {
+		params["resolve"] = "true"
+	}
+
+	r, err := mc.searchV2(params)
+
+	// This is not a very beautiful way to check the error cause, I admit.
+	if err != nil && strings.Contains(err.Error(), "bad server status code (404)") {
+		// Fall back to v1 API endpoint
+		r, err = mc.searchV1(params)
+	}
+
+	return r, err
+}