Add discs to album
This commit is contained in:
@@ -2,6 +2,7 @@ package persistence
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
@@ -18,6 +19,32 @@ type albumRepository struct {
|
||||
sqlRestful
|
||||
}
|
||||
|
||||
type dbAlbum struct {
|
||||
*model.Album `structs:",flatten"`
|
||||
Discs string `structs:"-" json:"discs"`
|
||||
}
|
||||
|
||||
func (a *dbAlbum) PostScan() error {
|
||||
if a.Discs == "" {
|
||||
a.Album.Discs = model.Discs{}
|
||||
return nil
|
||||
}
|
||||
return json.Unmarshal([]byte(a.Discs), &a.Album.Discs)
|
||||
}
|
||||
|
||||
func (a *dbAlbum) PostMapArgs(m map[string]any) error {
|
||||
if len(a.Album.Discs) == 0 {
|
||||
m["discs"] = "{}"
|
||||
return nil
|
||||
}
|
||||
b, err := json.Marshal(a.Album.Discs)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
m["discs"] = string(b)
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewAlbumRepository(ctx context.Context, db dbx.Builder) model.AlbumRepository {
|
||||
r := &albumRepository{}
|
||||
r.ctx = ctx
|
||||
@@ -102,19 +129,20 @@ func (r *albumRepository) selectAlbum(options ...model.QueryOptions) SelectBuild
|
||||
|
||||
func (r *albumRepository) Get(id string) (*model.Album, error) {
|
||||
sq := r.selectAlbum().Where(Eq{"album.id": id})
|
||||
var res model.Albums
|
||||
if err := r.queryAll(sq, &res); err != nil {
|
||||
var dba []dbAlbum
|
||||
if err := r.queryAll(sq, &dba); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(res) == 0 {
|
||||
if len(dba) == 0 {
|
||||
return nil, model.ErrNotFound
|
||||
}
|
||||
res := r.toModels(dba)
|
||||
err := r.loadAlbumGenres(&res)
|
||||
return &res[0], err
|
||||
}
|
||||
|
||||
func (r *albumRepository) Put(m *model.Album) error {
|
||||
_, err := r.put(m.ID, m)
|
||||
_, err := r.put(m.ID, &dbAlbum{Album: m})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -130,14 +158,22 @@ func (r *albumRepository) GetAll(options ...model.QueryOptions) (model.Albums, e
|
||||
return res, err
|
||||
}
|
||||
|
||||
func (r *albumRepository) toModels(dba []dbAlbum) model.Albums {
|
||||
res := model.Albums{}
|
||||
for i := range dba {
|
||||
res = append(res, *dba[i].Album)
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func (r *albumRepository) GetAllWithoutGenres(options ...model.QueryOptions) (model.Albums, error) {
|
||||
sq := r.selectAlbum(options...)
|
||||
res := model.Albums{}
|
||||
err := r.queryAll(sq, &res)
|
||||
var dba []dbAlbum
|
||||
err := r.queryAll(sq, &dba)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return res, err
|
||||
return r.toModels(dba), err
|
||||
}
|
||||
|
||||
func (r *albumRepository) purgeEmpty() error {
|
||||
@@ -152,13 +188,14 @@ func (r *albumRepository) purgeEmpty() error {
|
||||
}
|
||||
|
||||
func (r *albumRepository) Search(q string, offset int, size int) (model.Albums, error) {
|
||||
results := model.Albums{}
|
||||
err := r.doSearch(q, offset, size, &results, "name")
|
||||
var dba []dbAlbum
|
||||
err := r.doSearch(q, offset, size, &dba, "name")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = r.loadAlbumGenres(&results)
|
||||
return results, err
|
||||
res := r.toModels(dba)
|
||||
err = r.loadAlbumGenres(&res)
|
||||
return res, err
|
||||
}
|
||||
|
||||
func (r *albumRepository) Count(options ...rest.QueryOptions) (int64, error) {
|
||||
|
||||
@@ -3,6 +3,7 @@ package persistence
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/fatih/structs"
|
||||
"github.com/navidrome/navidrome/log"
|
||||
"github.com/navidrome/navidrome/model"
|
||||
"github.com/navidrome/navidrome/model/request"
|
||||
@@ -55,4 +56,37 @@ var _ = Describe("AlbumRepository", func() {
|
||||
}))
|
||||
})
|
||||
})
|
||||
|
||||
Describe("dbAlbum mapping", func() {
|
||||
var a *model.Album
|
||||
BeforeEach(func() {
|
||||
a = &model.Album{ID: "1", Name: "name", ArtistID: "2"}
|
||||
})
|
||||
It("maps empty discs field", func() {
|
||||
a.Discs = model.Discs{}
|
||||
dba := dbAlbum{Album: a}
|
||||
|
||||
m := structs.Map(dba)
|
||||
Expect(dba.PostMapArgs(m)).To(Succeed())
|
||||
Expect(m).To(HaveKeyWithValue("discs", `{}`))
|
||||
|
||||
other := dbAlbum{Album: &model.Album{ID: "1", Name: "name"}, Discs: "{}"}
|
||||
Expect(other.PostScan()).To(Succeed())
|
||||
|
||||
Expect(other.Album.Discs).To(Equal(a.Discs))
|
||||
})
|
||||
It("maps the discs field", func() {
|
||||
a.Discs = model.Discs{"1": "disc1", "2": "disc2"}
|
||||
dba := dbAlbum{Album: a}
|
||||
|
||||
m := structs.Map(dba)
|
||||
Expect(dba.PostMapArgs(m)).To(Succeed())
|
||||
Expect(m).To(HaveKeyWithValue("discs", `{"1":"disc1","2":"disc2"}`))
|
||||
|
||||
other := dbAlbum{Album: &model.Album{ID: "1", Name: "name"}, Discs: m["discs"].(string)}
|
||||
Expect(other.PostScan()).To(Succeed())
|
||||
|
||||
Expect(other.Album.Discs).To(Equal(a.Discs))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -49,9 +49,9 @@ var (
|
||||
)
|
||||
|
||||
var (
|
||||
albumSgtPeppers = model.Album{ID: "101", Name: "Sgt Peppers", Artist: "The Beatles", OrderAlbumName: "sgt peppers", AlbumArtistID: "3", Genre: "Rock", Genres: model.Genres{genreRock}, EmbedArtPath: P("/beatles/1/sgt/a day.mp3"), SongCount: 1, MaxYear: 1967, FullText: " beatles peppers sgt the"}
|
||||
albumAbbeyRoad = model.Album{ID: "102", Name: "Abbey Road", Artist: "The Beatles", OrderAlbumName: "abbey road", AlbumArtistID: "3", Genre: "Rock", Genres: model.Genres{genreRock}, EmbedArtPath: P("/beatles/1/come together.mp3"), SongCount: 1, MaxYear: 1969, FullText: " abbey beatles road the"}
|
||||
albumRadioactivity = model.Album{ID: "103", Name: "Radioactivity", Artist: "Kraftwerk", OrderAlbumName: "radioactivity", AlbumArtistID: "2", Genre: "Electronic", Genres: model.Genres{genreElectronic, genreRock}, EmbedArtPath: P("/kraft/radio/radio.mp3"), SongCount: 2, FullText: " kraftwerk radioactivity"}
|
||||
albumSgtPeppers = model.Album{ID: "101", Name: "Sgt Peppers", Artist: "The Beatles", OrderAlbumName: "sgt peppers", AlbumArtistID: "3", Genre: "Rock", Genres: model.Genres{genreRock}, EmbedArtPath: P("/beatles/1/sgt/a day.mp3"), SongCount: 1, MaxYear: 1967, FullText: " beatles peppers sgt the", Discs: model.Discs{}}
|
||||
albumAbbeyRoad = model.Album{ID: "102", Name: "Abbey Road", Artist: "The Beatles", OrderAlbumName: "abbey road", AlbumArtistID: "3", Genre: "Rock", Genres: model.Genres{genreRock}, EmbedArtPath: P("/beatles/1/come together.mp3"), SongCount: 1, MaxYear: 1969, FullText: " abbey beatles road the", Discs: model.Discs{}}
|
||||
albumRadioactivity = model.Album{ID: "103", Name: "Radioactivity", Artist: "Kraftwerk", OrderAlbumName: "radioactivity", AlbumArtistID: "2", Genre: "Electronic", Genres: model.Genres{genreElectronic, genreRock}, EmbedArtPath: P("/kraft/radio/radio.mp3"), SongCount: 2, FullText: " kraftwerk radioactivity", Discs: model.Discs{}}
|
||||
testAlbums = model.Albums{
|
||||
albumSgtPeppers,
|
||||
albumAbbeyRoad,
|
||||
|
||||
Reference in New Issue
Block a user