diff --git a/cmd/gonic/gonic.go b/cmd/gonic/gonic.go index 510df55..60be307 100644 --- a/cmd/gonic/gonic.go +++ b/cmd/gonic/gonic.go @@ -349,7 +349,7 @@ func main() { }) } - lastfmAPIKey, _ := dbc.GetSetting("lastfm_api_key") + lastfmAPIKey, _ := dbc.GetSetting(db.LastFMAPIKey) if lastfmAPIKey != "" { g.Add(func() error { log.Printf("starting job 'refresh artist info'\n") diff --git a/db/db.go b/db/db.go index 7e4edaf..4f6240e 100644 --- a/db/db.go +++ b/db/db.go @@ -54,22 +54,6 @@ func NewMock() (*DB, error) { return New(":memory:", mockOptions()) } -func (db *DB) GetSetting(key string) (string, error) { - var setting Setting - if err := db.Where("key=?", key).First(&setting).Error; err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { - return "", err - } - return setting.Value, nil -} - -func (db *DB) SetSetting(key, value string) error { - return db. - Where("key=?", key). - Assign(Setting{Key: key, Value: value}). - FirstOrCreate(&Setting{}). - Error -} - func (db *DB) InsertBulkLeftMany(table string, head []string, left int, col []int) error { if len(col) == 0 { return nil @@ -137,3 +121,27 @@ func (db *DB) TransactionChunked(data []int64, cb ChunkFunc) error { return nil }) } + +type SettingKey string + +const ( + LastFMAPIKey SettingKey = "lastfm_api_key" //nolint:gosec + LastFMSecret SettingKey = "lastfm_secret" + LastScanTime SettingKey = "last_scan_time" +) + +func (db *DB) GetSetting(key SettingKey) (string, error) { + var setting Setting + if err := db.Where("key=?", key).First(&setting).Error; err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { + return "", err + } + return setting.Value, nil +} + +func (db *DB) SetSetting(key SettingKey, value string) error { + return db. + Where("key=?", key). + Assign(Setting{Key: key, Value: value}). + FirstOrCreate(&Setting{}). + Error +} diff --git a/db/db_test.go b/db/db_test.go index 659de56..d28e00c 100644 --- a/db/db_test.go +++ b/db/db_test.go @@ -21,7 +21,7 @@ func randKey() string { } func TestGetSetting(t *testing.T) { - key := randKey() + key := SettingKey(randKey()) value := "howdy" require := require.New(t) diff --git a/db/model.go b/db/model.go index e3510b8..2087ba2 100644 --- a/db/model.go +++ b/db/model.go @@ -174,8 +174,8 @@ type User struct { } type Setting struct { - Key string `gorm:"not null; primary_key; auto_increment:false" sql:"default: null"` - Value string `sql:"default: null"` + Key SettingKey `gorm:"not null; primary_key; auto_increment:false" sql:"default: null"` + Value string `sql:"default: null"` } type Play struct { diff --git a/scanner/scanner.go b/scanner/scanner.go index ff379f4..916ce37 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -115,7 +115,7 @@ func (s *Scanner) ScanAndClean(opts ScanOptions) (*Context, error) { return nil, fmt.Errorf("clean genres: %w", err) } - if err := s.db.SetSetting("last_scan_time", strconv.FormatInt(time.Now().Unix(), 10)); err != nil { + if err := s.db.SetSetting(db.LastScanTime, strconv.FormatInt(time.Now().Unix(), 10)); err != nil { return nil, fmt.Errorf("set scan time: %w", err) } diff --git a/scrobble/lastfm/scrobbler.go b/scrobble/lastfm/scrobbler.go index ce0a183..e629158 100644 --- a/scrobble/lastfm/scrobbler.go +++ b/scrobble/lastfm/scrobbler.go @@ -34,11 +34,11 @@ func (s *Scrobbler) Scrobble(user *db.User, track *db.Track, stamp time.Time, su return fmt.Errorf("track has no album artists") } - apiKey, err := s.db.GetSetting("lastfm_api_key") + apiKey, err := s.db.GetSetting(db.LastFMAPIKey) if err != nil { return fmt.Errorf("get api key: %w", err) } - secret, err := s.db.GetSetting("lastfm_secret") + secret, err := s.db.GetSetting(db.LastFMSecret) if err != nil { return fmt.Errorf("get secret: %w", err) } diff --git a/scrobble/lastfm/scrobbler_test.go b/scrobble/lastfm/scrobbler_test.go index 31bd583..0b288e6 100644 --- a/scrobble/lastfm/scrobbler_test.go +++ b/scrobble/lastfm/scrobbler_test.go @@ -22,8 +22,8 @@ func TestScrobble(t *testing.T) { err = testDB.Migrate(db.MigrationContext{}) require.NoError(err) - testDB.SetSetting("lastfm_api_key", "apiKey1") - testDB.SetSetting("lastfm_secret", "secret1") + testDB.SetSetting(db.LastFMAPIKey, "apiKey1") + testDB.SetSetting(db.LastFMSecret, "secret1") user := &db.User{ LastFMSession: "lastFMSession1", diff --git a/server/ctrladmin/handlers.go b/server/ctrladmin/handlers.go index 3b3b13b..c707f0a 100644 --- a/server/ctrladmin/handlers.go +++ b/server/ctrladmin/handlers.go @@ -50,7 +50,7 @@ func (c *Controller) ServeHome(r *http.Request) *Response { c.DB.Table("tracks").Count(&data.TrackCount) // lastfm box data.RequestRoot = c.BaseURL(r) - data.CurrentLastFMAPIKey, _ = c.DB.GetSetting("lastfm_api_key") + data.CurrentLastFMAPIKey, _ = c.DB.GetSetting(db.LastFMAPIKey) data.DefaultListenBrainzURL = listenbrainz.BaseURL // users box @@ -67,7 +67,7 @@ func (c *Controller) ServeHome(r *http.Request) *Response { Find(&data.RecentFolders) data.IsScanning = c.Scanner.IsScanning() - if tStr, _ := c.DB.GetSetting("last_scan_time"); tStr != "" { + if tStr, _ := c.DB.GetSetting(db.LastScanTime); tStr != "" { i, _ := strconv.ParseInt(tStr, 10, 64) data.LastScanTime = time.Unix(i, 0) } @@ -97,11 +97,11 @@ func (c *Controller) ServeLinkLastFMDo(r *http.Request) *Response { if token == "" { return &Response{code: 400, err: "please provide a token"} } - apiKey, err := c.DB.GetSetting("lastfm_api_key") + apiKey, err := c.DB.GetSetting(db.LastFMAPIKey) if err != nil { return &Response{redirect: r.Referer(), flashW: []string{fmt.Sprintf("couldn't get api key: %v", err)}} } - secret, err := c.DB.GetSetting("lastfm_secret") + secret, err := c.DB.GetSetting(db.LastFMSecret) if err != nil { return &Response{redirect: r.Referer(), flashW: []string{fmt.Sprintf("couldn't get secret: %v", err)}} } @@ -338,10 +338,10 @@ func (c *Controller) ServeCreateUserDo(r *http.Request) *Response { func (c *Controller) ServeUpdateLastFMAPIKey(r *http.Request) *Response { data := &templateData{} var err error - if data.CurrentLastFMAPIKey, err = c.DB.GetSetting("lastfm_api_key"); err != nil { + if data.CurrentLastFMAPIKey, err = c.DB.GetSetting(db.LastFMAPIKey); err != nil { return &Response{redirect: r.Referer(), flashW: []string{fmt.Sprintf("couldn't get api key: %v", err)}} } - if data.CurrentLastFMAPISecret, err = c.DB.GetSetting("lastfm_secret"); err != nil { + if data.CurrentLastFMAPISecret, err = c.DB.GetSetting(db.LastFMSecret); err != nil { return &Response{redirect: r.Referer(), flashW: []string{fmt.Sprintf("couldn't get secret: %v", err)}} } return &Response{ @@ -359,10 +359,10 @@ func (c *Controller) ServeUpdateLastFMAPIKeyDo(r *http.Request) *Response { flashW: []string{err.Error()}, } } - if err := c.DB.SetSetting("lastfm_api_key", apiKey); err != nil { + if err := c.DB.SetSetting(db.LastFMAPIKey, apiKey); err != nil { return &Response{redirect: r.Referer(), flashW: []string{fmt.Sprintf("couldn't set api key: %v", err)}} } - if err := c.DB.SetSetting("lastfm_secret", secret); err != nil { + if err := c.DB.SetSetting(db.LastFMSecret, secret); err != nil { return &Response{redirect: r.Referer(), flashW: []string{fmt.Sprintf("couldn't set secret: %v", err)}} } return &Response{redirect: "/admin/home"} diff --git a/server/ctrlsubsonic/handlers_by_tags.go b/server/ctrlsubsonic/handlers_by_tags.go index 8b4e51a..b120068 100644 --- a/server/ctrlsubsonic/handlers_by_tags.go +++ b/server/ctrlsubsonic/handlers_by_tags.go @@ -320,7 +320,7 @@ func (c *Controller) ServeGetArtistInfoTwo(r *http.Request) *spec.Response { sub := spec.NewResponse() sub.ArtistInfoTwo = &spec.ArtistInfo{} - apiKey, _ := c.DB.GetSetting("lastfm_api_key") + apiKey, _ := c.DB.GetSetting(db.LastFMAPIKey) if apiKey == "" { return sub } @@ -541,7 +541,7 @@ func (c *Controller) ServeGetTopSongs(r *http.Request) *spec.Response { return spec.NewError(0, "finding artist by name: %v", err) } - apiKey, _ := c.DB.GetSetting("lastfm_api_key") + apiKey, _ := c.DB.GetSetting(db.LastFMAPIKey) if apiKey == "" { return spec.NewResponse() } @@ -598,7 +598,7 @@ func (c *Controller) ServeGetSimilarSongs(r *http.Request) *spec.Response { if err != nil || id.Type != specid.Track { return spec.NewError(10, "please provide an track `id` parameter") } - apiKey, _ := c.DB.GetSetting("lastfm_api_key") + apiKey, _ := c.DB.GetSetting(db.LastFMAPIKey) if apiKey == "" { return spec.NewResponse() } @@ -668,7 +668,7 @@ func (c *Controller) ServeGetSimilarSongsTwo(r *http.Request) *spec.Response { return spec.NewError(10, "please provide an artist `id` parameter") } - apiKey, _ := c.DB.GetSetting("lastfm_api_key") + apiKey, _ := c.DB.GetSetting(db.LastFMAPIKey) if apiKey == "" { return spec.NewResponse() }