11package admin
22
33import (
4+ "bytes"
45 "fmt"
56 "io"
67 "log"
@@ -12,6 +13,7 @@ import (
1213
1314 "millions-of-words/fetch"
1415 loader "millions-of-words/loaders/supabase"
16+ "millions-of-words/models"
1517
1618 "github.com/labstack/echo/v4"
1719)
@@ -376,6 +378,104 @@ func (h *Handler) AlbumEditFormHandler(c echo.Context) error {
376378 }, c )
377379}
378380
381+ func (h * Handler ) AlbumEditPostHandler (c echo.Context ) error {
382+ if err := validateAuth (c ); err != nil {
383+ return err
384+ }
385+ albumID := c .Param ("id" )
386+
387+ releaseDate := c .FormValue ("release_date" )
388+ genre := c .FormValue ("genre" )
389+ country := c .FormValue ("country" )
390+ label := c .FormValue ("label" )
391+ notes := c .FormValue ("notes" )
392+
393+ albumReq := models.UpdateAlbumRequest {
394+ AlbumID : albumID ,
395+ ReleaseDate : releaseDate ,
396+ Genre : genre ,
397+ Country : country ,
398+ Label : label ,
399+ Notes : notes ,
400+ }
401+
402+ if err := loader .UpdateAlbum (albumReq ); err != nil {
403+ log .Printf ("Error updating album: %v" , err )
404+ return c .HTML (http .StatusOK , `<div class="text-red-500">Error: Failed to update album</div>` )
405+ }
406+
407+ album , err := loader .GetAlbumByID (albumID )
408+ if err == nil {
409+ for _ , track := range album .Tracks {
410+ lyricsField := "lyrics_" + strconv .Itoa (track .TrackNumber )
411+ lyrics := c .FormValue (lyricsField )
412+ if lyrics != track .Lyrics {
413+ trackReq := models.UpdateTrackRequest {
414+ AlbumID : albumID ,
415+ TrackName : track .Name ,
416+ TrackNumber : track .TrackNumber ,
417+ Lyrics : lyrics ,
418+ }
419+ if err := loader .UpdateTrack (trackReq ); err != nil {
420+ log .Printf ("Error updating track %d: %v" , track .TrackNumber , err )
421+ }
422+ }
423+ }
424+ }
425+
426+ return c .Redirect (http .StatusSeeOther , "/admin/content/album-edit/" + albumID )
427+ }
428+
429+ func (h * Handler ) TrackEditPostHandler (c echo.Context ) error {
430+ if err := validateAuth (c ); err != nil {
431+ return err
432+ }
433+ albumID := c .Param ("album_id" )
434+ trackNumberStr := c .Param ("track_number" )
435+ trackNumber , err := strconv .Atoi (trackNumberStr )
436+ if err != nil {
437+ return c .HTML (http .StatusBadRequest , "Invalid track number" )
438+ }
439+
440+ trackName := c .FormValue ("track_name" )
441+ lyrics := c .FormValue ("lyrics" )
442+
443+ trackReq := models.UpdateTrackRequest {
444+ AlbumID : albumID ,
445+ TrackName : trackName ,
446+ TrackNumber : trackNumber ,
447+ Lyrics : lyrics ,
448+ }
449+ if err := loader .UpdateTrack (trackReq ); err != nil {
450+ log .Printf ("Error updating track %d: %v" , trackNumber , err )
451+ return c .HTML (http .StatusOK , `<div class=\"text-red-500\">Error: Failed to update track</div>` )
452+ }
453+
454+ album , err := loader .GetAlbumByID (albumID )
455+ if err != nil {
456+ return c .HTML (http .StatusOK , `<div class=\"text-red-500\">Error: Failed to reload album</div>` )
457+ }
458+ var updatedTrack models.BandcampTrackData
459+ for _ , t := range album .Tracks {
460+ if t .TrackNumber == trackNumber {
461+ updatedTrack = t
462+ break
463+ }
464+ }
465+
466+ var buf bytes.Buffer
467+ err = h .templates .Render (& buf , "components/track-card" , map [string ]interface {}{
468+ "Track" : updatedTrack ,
469+ "AlbumID" : albumID ,
470+ }, c )
471+ if err != nil {
472+ log .Printf ("Error rendering track card template: %v" , err )
473+ return c .HTML (http .StatusInternalServerError , `<div class="text-red-500">Error: Failed to render track card</div>` )
474+ }
475+
476+ return c .HTML (http .StatusOK , buf .String ())
477+ }
478+
379479func validateAuth (c echo.Context ) error {
380480 cookie , err := c .Cookie ("session" )
381481 if err != nil {
0 commit comments