commit 95ef2977add2edf137f8cafda5bdb15c59247913
parent 005b97f07e4fe0da72cd00b13616b03dc74c7c24
Author: brookjeynes <me@brookjeynes.dev>
Date: Sun, 3 May 2026 14:32:24 +1000
feat(db): save artist to db
Signed-off-by: brookjeynes <me@brookjeynes.dev>
Diffstat:
2 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/internal/db/artist.go b/internal/db/artist.go
@@ -0,0 +1,26 @@
+package db
+
+import (
+ "fmt"
+ "lyrics/internal/domain"
+ "time"
+)
+
+func UpsertArtist(e Execer, artist domain.Artist) error {
+ _, err := e.Exec(`
+ insert into artists (
+ name,
+ bio,
+ created_at
+ )
+ values (?, ?, ?)
+ on conflict(id) do update set
+ name = excluded.name,
+ bio = excluded.bio
+ `, artist.Name, artist.Bio, time.Now().Format(time.RFC3339))
+ if err != nil {
+ return fmt.Errorf("failed to insert or update artist: %w", err)
+ }
+
+ return nil
+}
diff --git a/internal/server/new-artist.go b/internal/server/new-artist.go
@@ -2,6 +2,7 @@ package server
import (
"fmt"
+ "lyrics/internal/db"
"lyrics/internal/domain"
"lyrics/internal/server/htmx"
newartist "lyrics/internal/server/ui/views/new-artist"
@@ -10,7 +11,7 @@ import (
type NewArtistForm struct {
Name string `schema:"name"`
- Bio string `schema:"bio"`
+ Bio string `schema:"biography"`
}
func parseNewArtistForm(form NewArtistForm) (domain.Artist, error) {
@@ -63,6 +64,26 @@ func (ss *ServerState) NewArtist(w http.ResponseWriter, r *http.Request) {
return
}
+ tx, err := ss.db.Begin()
+ if err != nil {
+ logger.Error("failed to begin db transaction", "err", err)
+ htmx.HxError(w, http.StatusBadRequest, "Failed to add artist.")
+ return
+ }
+
+ err = db.UpsertArtist(ss.db, newArtist)
+ if err != nil {
+ logger.Error("failed to save new artist into db", "err", err)
+ htmx.HxError(w, http.StatusBadRequest, "Failed to add artist.")
+ return
+ }
+
+ if err := tx.Commit(); err != nil {
+ logger.Error("failed to commit db transaction", "err", err)
+ htmx.HxError(w, http.StatusBadRequest, "Failed to add artist.")
+ return
+ }
+
logger.Debug("added artist", "artist", newArtist)
htmx.HxRedirect(w, "/")