artist.go (1561B)
1 package server 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "lyrics/internal/db" 8 "lyrics/internal/domain" 9 "lyrics/internal/server/htmx" 10 "lyrics/internal/server/routes" 11 artistview "lyrics/internal/server/ui/views/artist" 12 "net/http" 13 "strconv" 14 ) 15 16 func (ss *ServerState) Artist(w http.ResponseWriter, r *http.Request) { 17 logger := ss.logger.With("handler", "Artist") 18 19 idStr := r.PathValue("id") 20 id, err := strconv.Atoi(idStr) 21 if err != nil { 22 logger.Error("failed to convert artist id to integer", "id", idStr, "err", err) 23 htmx.HxError(w, http.StatusBadRequest, err.Error()) 24 return 25 } 26 27 slug := r.PathValue("slug") 28 logger = logger.With("id", id, "slug", slug) 29 30 artist, releases, singles, featured, err := db.Artist(ss.db, domain.ArtistID(id)) 31 if err != nil { 32 logger.Error("failed to get artist", "err", err) 33 htmx.HxError(w, http.StatusInternalServerError, fmt.Sprintf("failed to query for artist '%s'", slug)) 34 return 35 } 36 37 artistName := artist.Name 38 if artist.LatinName != nil { 39 artistName = *artist.LatinName 40 } 41 42 if domain.Slug(artistName) != slug { 43 htmx.HxRedirect(w, http.StatusMovedPermanently, routes.ArtistPath(domain.ArtistID(id), artistName)) 44 return 45 } 46 47 err = artistview.Artist(artistview.ArtistParams{ 48 Artist: artist, 49 Releases: releases, 50 Singles: singles, 51 Featured: featured, 52 }).Render(r.Context(), w) 53 if err != nil { 54 if errors.Is(err, context.Canceled) { 55 return 56 } 57 58 logger.Error("failed to render artist page", "err", err) 59 http.Error(w, "Internal Server Error", http.StatusInternalServerError) 60 return 61 } 62 }