diff --git a/handlers/album.go b/handlers/album.go index 8aa05d2..a48a7f7 100644 --- a/handlers/album.go +++ b/handlers/album.go @@ -1,7 +1,6 @@ package handlers import ( - "context" "fmt" "net/http" @@ -20,7 +19,7 @@ func album(l *utils.Logger) http.HandlerFunc { id := fmt.Sprintf("%s/%s", artist, albumName) if a, err := getCache[data.Album](id); err == nil { - views.AlbumPage(a).Render(context.Background(), w) + utils.RenderTemplate(w, views.AlbumPage(a), l) return } @@ -30,7 +29,7 @@ func album(l *utils.Logger) http.HandlerFunc { if err != nil { l.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) - views.ErrorPage(500, "cannot reach Genius servers").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "cannot reach Genius servers"), l) return } @@ -38,7 +37,7 @@ func album(l *utils.Logger) http.HandlerFunc { if resp.StatusCode == http.StatusNotFound { w.WriteHeader(http.StatusNotFound) - views.ErrorPage(404, "page not found").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(404, "page not found"), l) return } @@ -46,14 +45,14 @@ func album(l *utils.Logger) http.HandlerFunc { if err != nil { l.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) - views.ErrorPage(500, "something went wrong").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "something went wrong"), l) return } cf := doc.Find(".cloudflare_content").Length() if cf > 0 { l.Error("cloudflare got in the way") - views.ErrorPage(500, "cloudflare is detected").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "cloudflare is detected"), l) return } @@ -62,7 +61,7 @@ func album(l *utils.Logger) http.HandlerFunc { l.Error(err.Error()) } - views.AlbumPage(a).Render(context.Background(), w) + utils.RenderTemplate(w, views.AlbumPage(a), l) if err = setCache(id, a); err != nil { l.Error(err.Error()) diff --git a/handlers/annotations.go b/handlers/annotations.go index 137bab3..47ddbae 100644 --- a/handlers/annotations.go +++ b/handlers/annotations.go @@ -2,7 +2,6 @@ package handlers import ( "bytes" - "context" "encoding/json" "fmt" "net/http" @@ -33,7 +32,7 @@ func annotations(l *utils.Logger) http.HandlerFunc { if err != nil { l.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) - views.ErrorPage(500, "cannot reach genius servers").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "cannot reach genius servers"), l) return } @@ -41,7 +40,7 @@ func annotations(l *utils.Logger) http.HandlerFunc { if resp.StatusCode == http.StatusNotFound { w.WriteHeader(http.StatusNotFound) - views.ErrorPage(404, "page not found").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(404, "page not found"), l) return } @@ -50,7 +49,7 @@ func annotations(l *utils.Logger) http.HandlerFunc { if err != nil { l.Error("Error paring genius api response: %s", err.Error()) w.WriteHeader(http.StatusInternalServerError) - views.ErrorPage(500, "something went wrong").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "something went wrong"), l) return } @@ -59,7 +58,7 @@ func annotations(l *utils.Logger) http.HandlerFunc { if err != nil { l.Error("could not unmarshal json: %s\n", err) w.WriteHeader(http.StatusInternalServerError) - views.ErrorPage(500, "something went wrong").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "something went wrong"), l) return } diff --git a/handlers/article.go b/handlers/article.go index 08b5e22..11b8dda 100644 --- a/handlers/article.go +++ b/handlers/article.go @@ -1,7 +1,6 @@ package handlers import ( - "context" "fmt" "net/http" @@ -17,7 +16,7 @@ func article(l *utils.Logger) http.HandlerFunc { articleSlug := mux.Vars(r)["article"] if a, err := getCache[data.Article](articleSlug); err == nil { - views.ArticlePage(a).Render(context.Background(), w) + utils.RenderTemplate(w, views.ArticlePage(a), l) return } @@ -27,7 +26,7 @@ func article(l *utils.Logger) http.HandlerFunc { if err != nil { l.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) - views.ErrorPage(500, "cannot reach Genius servers").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "cannot reach Genius servers"), l) return } @@ -35,7 +34,7 @@ func article(l *utils.Logger) http.HandlerFunc { if resp.StatusCode == http.StatusNotFound { w.WriteHeader(http.StatusNotFound) - views.ErrorPage(404, "page not found").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(404, "page not found"), l) return } @@ -43,14 +42,14 @@ func article(l *utils.Logger) http.HandlerFunc { if err != nil { l.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) - views.ErrorPage(500, "something went wrong").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "something went wrong"), l) return } cf := doc.Find(".cloudflare_content").Length() if cf > 0 { l.Error("cloudflare got in the way") - views.ErrorPage(500, "cloudflare is detected").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "cloudflare is detected"), l) return } @@ -59,7 +58,7 @@ func article(l *utils.Logger) http.HandlerFunc { l.Error(err.Error()) } - views.ArticlePage(a).Render(context.Background(), w) + utils.RenderTemplate(w, views.ArticlePage(a), l) if err = setCache(articleSlug, a); err != nil { l.Error(err.Error()) diff --git a/handlers/artist.go b/handlers/artist.go index 4406133..113a65e 100644 --- a/handlers/artist.go +++ b/handlers/artist.go @@ -1,7 +1,6 @@ package handlers import ( - "context" "fmt" "net/http" @@ -19,7 +18,7 @@ func artist(l *utils.Logger) http.HandlerFunc { id := fmt.Sprintf("artist:%s", artistName) if a, err := getCache[data.Artist](id); err == nil { - views.ArtistPage(a).Render(context.Background(), w) + utils.RenderTemplate(w, views.ArtistPage(a), l) return } @@ -29,7 +28,7 @@ func artist(l *utils.Logger) http.HandlerFunc { if err != nil { l.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) - views.ErrorPage(500, "cannot reach Genius servers").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "cannot reach Genius servers"), l) return } @@ -37,7 +36,7 @@ func artist(l *utils.Logger) http.HandlerFunc { if resp.StatusCode == http.StatusNotFound { w.WriteHeader(http.StatusNotFound) - views.ErrorPage(404, "page not found").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(404, "page not found"), l) return } @@ -45,14 +44,14 @@ func artist(l *utils.Logger) http.HandlerFunc { if err != nil { l.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) - views.ErrorPage(500, "something went wrong").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "something went wrong"), l) return } cf := doc.Find(".cloudflare_content").Length() if cf > 0 { l.Error("cloudflare got in the way") - views.ErrorPage(500, "cloudflare is detected").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "cloudflare is detected"), l) return } @@ -61,7 +60,7 @@ func artist(l *utils.Logger) http.HandlerFunc { l.Error(err.Error()) } - views.ArtistPage(a).Render(context.Background(), w) + utils.RenderTemplate(w, views.ArtistPage(a), l) if err = setCache(id, a); err != nil { l.Error(err.Error()) diff --git a/handlers/handler.go b/handlers/handler.go index 62e0f57..367741e 100644 --- a/handlers/handler.go +++ b/handlers/handler.go @@ -1,7 +1,6 @@ package handlers import ( - "context" "net/http" "github.com/a-h/templ" @@ -45,7 +44,7 @@ func New(logger *utils.Logger, staticFiles static) *mux.Router { r.NotFoundHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) - views.ErrorPage(404, "page not found").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(404, "page not found"), logger) }) return r diff --git a/handlers/lyrics.go b/handlers/lyrics.go index 8322d58..65906b3 100644 --- a/handlers/lyrics.go +++ b/handlers/lyrics.go @@ -1,7 +1,6 @@ package handlers import ( - "context" "fmt" "net/http" @@ -23,7 +22,7 @@ func lyrics(l *utils.Logger) http.HandlerFunc { } if s, err := getCache[data.Song](id); err == nil { - views.LyricsPage(s).Render(context.Background(), w) + utils.RenderTemplate(w, views.LyricsPage(s), l) return } @@ -32,7 +31,7 @@ func lyrics(l *utils.Logger) http.HandlerFunc { if err != nil { l.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) - views.ErrorPage(500, "cannot reach Genius servers").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "cannot reach Genius servers"), l) return } @@ -40,7 +39,7 @@ func lyrics(l *utils.Logger) http.HandlerFunc { if resp.StatusCode == http.StatusNotFound { w.WriteHeader(http.StatusNotFound) - views.ErrorPage(404, "page not found").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(404, "page not found"), l) return } @@ -48,14 +47,14 @@ func lyrics(l *utils.Logger) http.HandlerFunc { if err != nil { l.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) - views.ErrorPage(500, "something went wrong").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "something went wrong"), l) return } cf := doc.Find(".cloudflare_content").Length() if cf > 0 { l.Error("cloudflare got in the way") - views.ErrorPage(500, "cloudflare is detected").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "cloudflare is detected"), l) return } @@ -64,7 +63,8 @@ func lyrics(l *utils.Logger) http.HandlerFunc { l.Error(err.Error()) } - views.LyricsPage(s).Render(context.Background(), w) + utils.RenderTemplate(w, views.LyricsPage(s), l) + if err = setCache(id, s); err != nil { l.Error(err.Error()) } diff --git a/handlers/proxy.go b/handlers/proxy.go index b85ff82..6eae13c 100644 --- a/handlers/proxy.go +++ b/handlers/proxy.go @@ -1,7 +1,6 @@ package handlers import ( - "context" "fmt" "io" "mime" @@ -35,7 +34,7 @@ func imageProxy(l *utils.Logger) http.HandlerFunc { if !isValidExt(ext) { w.WriteHeader(http.StatusBadRequest) - views.ErrorPage(400, "something went wrong").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(400, "something went wrong"), l) return } @@ -46,13 +45,13 @@ func imageProxy(l *utils.Logger) http.HandlerFunc { if err != nil { l.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) - views.ErrorPage(500, "cannot reach Genius servers").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "cannot reach Genius servers"), l) return } if res.StatusCode != http.StatusOK { w.WriteHeader(http.StatusInternalServerError) - views.ErrorPage(500, "something went wrong").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "something went wrong"), l) return } diff --git a/handlers/search.go b/handlers/search.go index c662b04..84dc494 100644 --- a/handlers/search.go +++ b/handlers/search.go @@ -1,7 +1,6 @@ package handlers import ( - "context" "encoding/json" "fmt" "net/http" @@ -21,7 +20,7 @@ func search(l *utils.Logger) http.HandlerFunc { if err != nil { l.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) - views.ErrorPage(500, "cannot reach Genius servers").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "cannot reach Genius servers"), l) return } @@ -33,12 +32,12 @@ func search(l *utils.Logger) http.HandlerFunc { if err = d.Decode(&sRes); err != nil { l.Error(err.Error()) w.WriteHeader(http.StatusInternalServerError) - views.ErrorPage(500, "something went wrong").Render(context.Background(), w) + utils.RenderTemplate(w, views.ErrorPage(500, "something went wrong"), l) } results := data.SearchResults{Query: query, Sections: sRes.Response.Sections} - views.SearchPage(results).Render(context.Background(), w) + utils.RenderTemplate(w, views.SearchPage(results), l) } } diff --git a/utils/template.go b/utils/template.go new file mode 100644 index 0000000..91c8bb7 --- /dev/null +++ b/utils/template.go @@ -0,0 +1,19 @@ +package utils + +import ( + "context" + "net/http" + + "github.com/a-h/templ" +) + +func RenderTemplate(w http.ResponseWriter, t templ.Component, l *Logger) { + if err := t.Render(context.Background(), w); err != nil { + l.Error("unable to render template %s", err) + w.WriteHeader(http.StatusInternalServerError) + _, err := w.Write([]byte{}) + if err != nil { + l.Error(err.Error()) + } + } +}