lyrics

lyrics
git clone git://brookjeynes.dev/bjeynes/lyrics.git
Log | Files | Refs

search.go (1384B)


      1 package server
      2 
      3 import (
      4 	"context"
      5 	"errors"
      6 	"lyrics/internal/server/htmx"
      7 	"lyrics/internal/server/ui/views/search"
      8 	"net/http"
      9 	"strconv"
     10 )
     11 
     12 func (ss *ServerState) Search(w http.ResponseWriter, r *http.Request) {
     13 	var err error
     14 	logger := ss.logger.With("handler", "Search")
     15 
     16 	query := r.URL.Query().Get("query")
     17 	searchType := r.URL.Query().Get("type")
     18 	pageStr := r.URL.Query().Get("page")
     19 	limitStr := r.URL.Query().Get("limit")
     20 
     21 	if limitStr == "" {
     22 		limitStr = "25"
     23 	}
     24 
     25 	limit, err := strconv.ParseInt(limitStr, 10, 64)
     26 	if err != nil {
     27 		logger.Error("failed to parse limit value", "err", err)
     28 		limit = 25
     29 	}
     30 	if limit < 1 {
     31 		limit = 25
     32 	}
     33 	if limit > 100 {
     34 		limit = 100
     35 	}
     36 
     37 	if pageStr == "" {
     38 		pageStr = "1"
     39 	}
     40 
     41 	page, err := strconv.ParseInt(pageStr, 10, 64)
     42 	if err != nil {
     43 		logger.Error("failed to parse page value", "err", err)
     44 		page = 1
     45 	}
     46 	if page <= 0 {
     47 		page = 1
     48 	}
     49 
     50 	logger = logger.With("query", query, "type", searchType)
     51 
     52 	htmx.HxRedirect(w, http.StatusOK, r.URL.String())
     53 	err = search.Search(search.SearchParams{
     54 		SearchType: searchType,
     55 		Query:      query,
     56 		Limit:      limit,
     57 		Page:       page,
     58 	}).Render(r.Context(), w)
     59 	if err != nil {
     60 		if errors.Is(err, context.Canceled) {
     61 			return
     62 		}
     63 
     64 		logger.Error("failed to render new song page", "err", err)
     65 		http.Error(w, "Internal Server Error", http.StatusInternalServerError)
     66 		return
     67 	}
     68 
     69 }