fix(scanner): fix records with album name same as artist

and never use db.Where() with a struct

gorm was seeing a query like

    db.Where(Album{Left: left, Right: right})

but if the `left` variable was empty, gorm couldn't differentiate it with an empty field in the struct
so it generated SQL that we weren't expected

like

    SELECT * FROM albums WHERE right=?

instead of

    SELECT * FROM albums WHERE left=? AND right=?

fixes #230
This commit is contained in:
sentriz
2022-09-09 13:05:53 +01:00
parent a11d6ab92d
commit fdbb28209b
5 changed files with 56 additions and 30 deletions

View File

@@ -10,12 +10,12 @@ import (
"github.com/jinzhu/gorm"
"go.senan.xyz/gonic/db"
"go.senan.xyz/gonic/multierr"
"go.senan.xyz/gonic/scanner"
"go.senan.xyz/gonic/server/ctrlsubsonic/params"
"go.senan.xyz/gonic/server/ctrlsubsonic/spec"
"go.senan.xyz/gonic/server/ctrlsubsonic/specid"
"go.senan.xyz/gonic/db"
"go.senan.xyz/gonic/scanner"
)
func lowerUDecOrHash(in string) string {
@@ -128,7 +128,7 @@ func (c *Controller) ServeNotFound(r *http.Request) *spec.Response {
func (c *Controller) ServeGetPlayQueue(r *http.Request) *spec.Response {
user := r.Context().Value(CtxUser).(*db.User)
queue := db.PlayQueue{}
var queue db.PlayQueue
err := c.DB.
Where("user_id=?", user.ID).
Find(&queue).
@@ -170,8 +170,9 @@ func (c *Controller) ServeSavePlayQueue(r *http.Request) *spec.Response {
}
}
user := r.Context().Value(CtxUser).(*db.User)
queue := &db.PlayQueue{UserID: user.ID}
c.DB.Where(queue).First(queue)
var queue db.PlayQueue
c.DB.Where("user_id=?, user.ID").First(&queue)
queue.UserID = user.ID
queue.Current = params.GetOrID("current", specid.ID{}).Value
queue.Position = params.GetOrInt("position", 0)
queue.ChangedBy = params.GetOr("c", "") // must exist, middleware checks
@@ -186,18 +187,18 @@ func (c *Controller) ServeGetSong(r *http.Request) *spec.Response {
if err != nil {
return spec.NewError(10, "provide an `id` parameter")
}
track := &db.Track{}
var track db.Track
err = c.DB.
Where("id=?", id.Value).
Preload("Album").
Preload("Album.TagArtist").
First(track).
First(&track).
Error
if errors.Is(err, gorm.ErrRecordNotFound) {
return spec.NewError(10, "couldn't find a track with that id")
}
sub := spec.NewResponse()
sub.Track = spec.NewTrackByTags(track, track.Album)
sub.Track = spec.NewTrackByTags(&track, track.Album)
return sub
}

View File

@@ -72,22 +72,22 @@ func streamGetAudio(dbc *db.DB, podcastsPath string, user *db.User, id specid.ID
}
func streamUpdateStats(dbc *db.DB, userID, albumID int, playTime time.Time) error {
play := db.Play{
AlbumID: albumID,
UserID: userID,
}
var play db.Play
err := dbc.
Where(play).
Where("album_id=? AND user_id=?", albumID, userID).
First(&play).
Error
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return fmt.Errorf("find stat: %w", err)
}
play.AlbumID = albumID
play.UserID = userID
play.Count++ // for getAlbumList?type=frequent
if playTime.After(play.Time) {
play.Time = playTime // for getAlbumList?type=recent
}
if err := dbc.Save(&play).Error; err != nil {
return fmt.Errorf("save stat: %w", err)
}