lyrics

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

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 }