github.com/qri-io/qri@v0.10.1-0.20220104210721-c771715036cb/registry/regserver/handlers/search.go (about)

     1  package handlers
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/http"
     6  
     7  	apiutil "github.com/qri-io/qri/api/util"
     8  	qhttp "github.com/qri-io/qri/lib/http"
     9  	"github.com/qri-io/qri/registry"
    10  )
    11  
    12  const (
    13  	defaultOffset = 0
    14  	defaultLimit  = 25
    15  )
    16  
    17  // NewSearchHandler creates a search handler function taht operates on a *registry.Searchable
    18  func NewSearchHandler(s registry.Searchable) http.HandlerFunc {
    19  	return func(w http.ResponseWriter, r *http.Request) {
    20  		p := &registry.SearchParams{}
    21  		if r.Header.Get("Content-Type") == qhttp.JSONMimeType && r.Method == http.MethodPost {
    22  			if err := json.NewDecoder(r.Body).Decode(p); err != nil {
    23  				apiutil.WriteErrResponse(w, http.StatusBadRequest, err)
    24  				return
    25  			}
    26  			if p.Limit == 0 {
    27  				p.Limit = defaultLimit
    28  			}
    29  		} else {
    30  			p.Limit = apiutil.ReqParamInt(r, "limit", defaultLimit)
    31  			p.Offset = apiutil.ReqParamInt(r, "offset", defaultOffset)
    32  			p.Q = r.FormValue("q")
    33  		}
    34  		results, err := s.Search(*p)
    35  		if err != nil {
    36  			apiutil.WriteErrResponse(w, http.StatusBadRequest, err)
    37  			return
    38  		}
    39  		apiutil.WriteResponse(w, results)
    40  	}
    41  }