github.com/qri-io/qri@v0.10.1-0.20220104210721-c771715036cb/remote/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  	"github.com/qri-io/qri/remote/registry"
     9  )
    10  
    11  const (
    12  	defaultOffset = 0
    13  	defaultLimit  = 25
    14  )
    15  
    16  // NewSearchHandler creates a search handler function taht operates on a *registry.Searchable
    17  func NewSearchHandler(s registry.Searchable) http.HandlerFunc {
    18  	return func(w http.ResponseWriter, r *http.Request) {
    19  		p := &registry.SearchParams{}
    20  		switch r.Header.Get("Content-Type") {
    21  		case "application/json":
    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  		default:
    30  			p.Limit = apiutil.ReqParamInt(r, "limit", defaultLimit)
    31  			p.Offset = apiutil.ReqParamInt(r, "offset", defaultOffset)
    32  			p.Q = r.FormValue("q")
    33  		}
    34  		switch r.Method {
    35  		case "GET":
    36  			results, err := s.Search(*p)
    37  			if err != nil {
    38  				apiutil.WriteErrResponse(w, http.StatusBadRequest, err)
    39  				return
    40  			}
    41  			apiutil.WriteResponse(w, results)
    42  			return
    43  		}
    44  	}
    45  }