Implements NowPlayingRepository as an in-memory only struct

This commit is contained in:
Deluan 2020-01-10 21:45:17 -05:00 committed by Deluan Quintão
parent c9be5f7201
commit cead8906d6
10 changed files with 156 additions and 7 deletions

View File

@ -38,7 +38,7 @@ func initBrowsingController() *BrowsingController {
func initAlbumListController() *AlbumListController {
albumRepository := db_storm.NewAlbumRepository()
mediaFileRepository := db_storm.NewMediaFileRepository()
nowPlayingRepository := db_ledis.NewNowPlayingRepository()
nowPlayingRepository := persistence.NewNowPlayingRepository()
listGenerator := engine.NewListGenerator(albumRepository, mediaFileRepository, nowPlayingRepository)
albumListController := NewAlbumListController(listGenerator)
return albumListController
@ -47,7 +47,7 @@ func initAlbumListController() *AlbumListController {
func initMediaAnnotationController() *MediaAnnotationController {
itunesControl := itunesbridge.NewItunesControl()
mediaFileRepository := db_storm.NewMediaFileRepository()
nowPlayingRepository := db_ledis.NewNowPlayingRepository()
nowPlayingRepository := persistence.NewNowPlayingRepository()
scrobbler := engine.NewScrobbler(itunesControl, mediaFileRepository, nowPlayingRepository)
albumRepository := db_storm.NewAlbumRepository()
artistRepository := db_storm.NewArtistRepository()
@ -96,7 +96,7 @@ func initStreamController() *StreamController {
// wire_injectors.go:
var allProviders = wire.NewSet(itunesbridge.NewItunesControl, db_ledis.Set, db_storm.Set, engine.Set, NewSystemController,
var allProviders = wire.NewSet(itunesbridge.NewItunesControl, db_storm.Set, engine.Set, NewSystemController,
NewBrowsingController,
NewAlbumListController,
NewMediaAnnotationController,

View File

@ -14,7 +14,7 @@ import (
var allProviders = wire.NewSet(
itunesbridge.NewItunesControl,
db_ledis.Set,
//db_ledis.Set,
db_storm.Set,
engine.Set,
NewSystemController,

View File

@ -29,6 +29,6 @@ type NowPlayingRepository interface {
// Size of the queue for the playerId
Count(playerId int) (int64, error)
// Returns all tails from all playerIds
// Returns all heads from all playerIds
GetAll() ([]*NowPlayingInfo, error)
}

View File

@ -1,9 +1,18 @@
package db_ledis
import (
"github.com/cloudsonic/sonic-server/persistence"
"github.com/google/wire"
)
var Set = wire.NewSet(
NewPropertyRepository,
NewArtistRepository,
NewAlbumRepository,
NewMediaFileRepository,
NewArtistIndexRepository,
NewPlaylistRepository,
NewCheckSumRepository,
NewNowPlayingRepository,
persistence.NewMediaFolderRepository,
)

View File

@ -13,5 +13,6 @@ var Set = wire.NewSet(
NewArtistIndexRepository,
NewPlaylistRepository,
NewCheckSumRepository,
persistence.NewNowPlayingRepository,
persistence.NewMediaFolderRepository,
)

View File

@ -0,0 +1,75 @@
package persistence
import (
"container/list"
"sync"
"github.com/cloudsonic/sonic-server/domain"
)
var playerMap = sync.Map{}
type nowPlayingRepository struct{}
// TODO Make it persistent
func NewNowPlayingRepository() domain.NowPlayingRepository {
r := &nowPlayingRepository{}
return r
}
func (r *nowPlayingRepository) getList(id int) *list.List {
l, _ := playerMap.LoadOrStore(id, list.New())
return l.(*list.List)
}
func (r *nowPlayingRepository) Enqueue(info *domain.NowPlayingInfo) error {
l := r.getList(info.PlayerId)
l.PushFront(info)
return nil
}
func (r *nowPlayingRepository) Dequeue(playerId int) (*domain.NowPlayingInfo, error) {
l := r.getList(playerId)
e := l.Back()
if e == nil {
return nil, nil
}
l.Remove(e)
return e.Value.(*domain.NowPlayingInfo), nil
}
func (r *nowPlayingRepository) Head(playerId int) (*domain.NowPlayingInfo, error) {
l := r.getList(playerId)
e := l.Front()
if e == nil {
return nil, nil
}
return e.Value.(*domain.NowPlayingInfo), nil
}
func (r *nowPlayingRepository) Tail(playerId int) (*domain.NowPlayingInfo, error) {
l := r.getList(playerId)
e := l.Back()
if e == nil {
return nil, nil
}
return e.Value.(*domain.NowPlayingInfo), nil
}
func (r *nowPlayingRepository) Count(playerId int) (int64, error) {
l := r.getList(playerId)
return int64(l.Len()), nil
}
func (r *nowPlayingRepository) GetAll() ([]*domain.NowPlayingInfo, error) {
var all []*domain.NowPlayingInfo
playerMap.Range(func(playerId, l interface{}) bool {
ll := l.(*list.List)
e := ll.Front()
all = append(all, e.Value.(*domain.NowPlayingInfo))
return true
})
return all, nil
}
var _ domain.NowPlayingRepository = (*nowPlayingRepository)(nil)

View File

@ -0,0 +1,50 @@
package persistence
import (
"sync"
"github.com/cloudsonic/sonic-server/domain"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("NowPlayingRepository", func() {
var repo domain.NowPlayingRepository
BeforeEach(func() {
playerMap = sync.Map{}
repo = NewNowPlayingRepository()
})
It("enqueues and dequeues records", func() {
Expect(repo.Enqueue(&domain.NowPlayingInfo{PlayerId: 1, TrackID: "AAA"})).To(BeNil())
Expect(repo.Enqueue(&domain.NowPlayingInfo{PlayerId: 1, TrackID: "BBB"})).To(BeNil())
Expect(repo.Tail(1)).To(Equal(&domain.NowPlayingInfo{PlayerId: 1, TrackID: "AAA"}))
Expect(repo.Head(1)).To(Equal(&domain.NowPlayingInfo{PlayerId: 1, TrackID: "BBB"}))
Expect(repo.Count(1)).To(Equal(int64(2)))
Expect(repo.Dequeue(1)).To(Equal(&domain.NowPlayingInfo{PlayerId: 1, TrackID: "AAA"}))
Expect(repo.Count(1)).To(Equal(int64(1)))
})
It("handles multiple players", func() {
Expect(repo.Enqueue(&domain.NowPlayingInfo{PlayerId: 1, TrackID: "AAA"})).To(BeNil())
Expect(repo.Enqueue(&domain.NowPlayingInfo{PlayerId: 1, TrackID: "BBB"})).To(BeNil())
Expect(repo.Enqueue(&domain.NowPlayingInfo{PlayerId: 2, TrackID: "CCC"})).To(BeNil())
Expect(repo.Enqueue(&domain.NowPlayingInfo{PlayerId: 2, TrackID: "DDD"})).To(BeNil())
Expect(repo.GetAll()).To(Equal([]*domain.NowPlayingInfo{
{PlayerId: 1, TrackID: "BBB"},
{PlayerId: 2, TrackID: "DDD"},
}))
Expect(repo.Count(2)).To(Equal(int64(2)))
Expect(repo.Count(2)).To(Equal(int64(2)))
Expect(repo.Tail(1)).To(Equal(&domain.NowPlayingInfo{PlayerId: 1, TrackID: "AAA"}))
Expect(repo.Head(2)).To(Equal(&domain.NowPlayingInfo{PlayerId: 2, TrackID: "DDD"}))
})
})

View File

@ -0,0 +1,14 @@
package persistence
import (
"testing"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
func TestPersistence(t *testing.T) {
//log.SetLevel(log.LevelCritical)
RegisterFailHandler(Fail)
RunSpecs(t, "Common Persistence Suite")
}

View File

@ -35,7 +35,7 @@ func initImporter(musicFolder string) *scanner.Importer {
// wire_injectors.go:
var allProviders = wire.NewSet(itunesbridge.NewItunesControl, db_ledis.Set, db_storm.Set, engine.Set, scanner.Set, newDB)
var allProviders = wire.NewSet(itunesbridge.NewItunesControl, db_storm.Set, engine.Set, scanner.Set, newDB)
func newDB() gomate.DB {
return ledis.NewEmbeddedDB(db_ledis.Db())

View File

@ -15,7 +15,7 @@ import (
var allProviders = wire.NewSet(
itunesbridge.NewItunesControl,
db_ledis.Set,
//db_ledis.Set,
db_storm.Set,
engine.Set,
scanner.Set,