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 }