Make persistence provider pluggable at runtime

This commit is contained in:
Deluan
2020-01-11 14:58:46 -05:00
committed by Deluan Quintão
parent 93ab4132fe
commit 4b1c909a4d
7 changed files with 149 additions and 26 deletions
+1
View File
@@ -26,6 +26,7 @@ type sonic struct {
// DevFlags // DevFlags
DevDisableAuthentication bool `default:"false"` DevDisableAuthentication bool `default:"false"`
DevDisableFileCheck bool `default:"false"` DevDisableFileCheck bool `default:"false"`
DevPersistenceProvider string `default:"ledisdb"`
} }
var Sonic *sonic var Sonic *sonic
+5 -2
View File
@@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"github.com/cloudsonic/sonic-server/conf" "github.com/cloudsonic/sonic-server/conf"
"github.com/cloudsonic/sonic-server/persistence"
) )
func main() { func main() {
@@ -11,7 +12,9 @@ func main() {
fmt.Printf("\nCloudSonic Server v%s\n\n", "0.2") fmt.Printf("\nCloudSonic Server v%s\n\n", "0.2")
a := createApp(conf.Sonic.MusicFolder) provider := persistence.ProviderIdentifier(conf.Sonic.DevPersistenceProvider)
a.MountRouter("/rest/", initRouter())
a := CreateApp(conf.Sonic.MusicFolder, provider)
a.MountRouter("/rest/", CreateSubsonicAPIRouter(provider))
a.Run(":" + conf.Sonic.Port) a.Run(":" + conf.Sonic.Port)
} }
+1
View File
@@ -15,4 +15,5 @@ var Set = wire.NewSet(
NewCheckSumRepository, NewCheckSumRepository,
NewNowPlayingRepository, NewNowPlayingRepository,
persistence.NewMediaFolderRepository, persistence.NewMediaFolderRepository,
wire.Value(persistence.ProviderIdentifier("levisdb")),
) )
+1
View File
@@ -15,4 +15,5 @@ var Set = wire.NewSet(
NewCheckSumRepository, NewCheckSumRepository,
persistence.NewNowPlayingRepository, persistence.NewNowPlayingRepository,
persistence.NewMediaFolderRepository, persistence.NewMediaFolderRepository,
wire.Value(persistence.ProviderIdentifier("storm")),
) )
+3
View File
@@ -0,0 +1,3 @@
package persistence
type ProviderIdentifier string
+93 -18
View File
@@ -7,6 +7,7 @@ package main
import ( import (
"github.com/cloudsonic/sonic-server/api" "github.com/cloudsonic/sonic-server/api"
"github.com/cloudsonic/sonic-server/domain"
"github.com/cloudsonic/sonic-server/engine" "github.com/cloudsonic/sonic-server/engine"
"github.com/cloudsonic/sonic-server/itunesbridge" "github.com/cloudsonic/sonic-server/itunesbridge"
"github.com/cloudsonic/sonic-server/persistence" "github.com/cloudsonic/sonic-server/persistence"
@@ -20,15 +21,16 @@ import (
// Injectors from wire_injectors.go: // Injectors from wire_injectors.go:
func createApp(musicFolder string) *App { func CreateApp(musicFolder string, p persistence.ProviderIdentifier) *App {
checkSumRepository := db_storm.NewCheckSumRepository() provider := createPersistenceProvider(p)
checkSumRepository := provider.CheckSumRepository
itunesScanner := scanner.NewItunesScanner(checkSumRepository) itunesScanner := scanner.NewItunesScanner(checkSumRepository)
mediaFileRepository := db_storm.NewMediaFileRepository() mediaFileRepository := provider.MediaFileRepository
albumRepository := db_storm.NewAlbumRepository() albumRepository := provider.AlbumRepository
artistRepository := db_storm.NewArtistRepository() artistRepository := provider.ArtistRepository
artistIndexRepository := db_storm.NewArtistIndexRepository() artistIndexRepository := provider.ArtistIndexRepository
playlistRepository := db_storm.NewPlaylistRepository() playlistRepository := provider.PlaylistRepository
propertyRepository := db_storm.NewPropertyRepository() propertyRepository := provider.PropertyRepository
db := newDB() db := newDB()
search := engine.NewSearch(artistRepository, albumRepository, mediaFileRepository, db) search := engine.NewSearch(artistRepository, albumRepository, mediaFileRepository, db)
importer := scanner.NewImporter(musicFolder, itunesScanner, mediaFileRepository, albumRepository, artistRepository, artistIndexRepository, playlistRepository, propertyRepository, search) importer := scanner.NewImporter(musicFolder, itunesScanner, mediaFileRepository, albumRepository, artistRepository, artistIndexRepository, playlistRepository, propertyRepository, search)
@@ -36,19 +38,20 @@ func createApp(musicFolder string) *App {
return app return app
} }
func initRouter() *api.Router { func CreateSubsonicAPIRouter(p persistence.ProviderIdentifier) *api.Router {
propertyRepository := db_storm.NewPropertyRepository() provider := createPersistenceProvider(p)
mediaFolderRepository := persistence.NewMediaFolderRepository() propertyRepository := provider.PropertyRepository
artistIndexRepository := db_storm.NewArtistIndexRepository() mediaFolderRepository := provider.MediaFolderRepository
artistRepository := db_storm.NewArtistRepository() artistIndexRepository := provider.ArtistIndexRepository
albumRepository := db_storm.NewAlbumRepository() artistRepository := provider.ArtistRepository
mediaFileRepository := db_storm.NewMediaFileRepository() albumRepository := provider.AlbumRepository
mediaFileRepository := provider.MediaFileRepository
browser := engine.NewBrowser(propertyRepository, mediaFolderRepository, artistIndexRepository, artistRepository, albumRepository, mediaFileRepository) browser := engine.NewBrowser(propertyRepository, mediaFolderRepository, artistIndexRepository, artistRepository, albumRepository, mediaFileRepository)
cover := engine.NewCover(mediaFileRepository, albumRepository) cover := engine.NewCover(mediaFileRepository, albumRepository)
nowPlayingRepository := persistence.NewNowPlayingRepository() nowPlayingRepository := provider.NowPlayingRepository
listGenerator := engine.NewListGenerator(albumRepository, mediaFileRepository, nowPlayingRepository) listGenerator := engine.NewListGenerator(albumRepository, mediaFileRepository, nowPlayingRepository)
itunesControl := itunesbridge.NewItunesControl() itunesControl := itunesbridge.NewItunesControl()
playlistRepository := db_storm.NewPlaylistRepository() playlistRepository := provider.PlaylistRepository
playlists := engine.NewPlaylists(itunesControl, playlistRepository, mediaFileRepository) playlists := engine.NewPlaylists(itunesControl, playlistRepository, mediaFileRepository)
ratings := engine.NewRatings(itunesControl, mediaFileRepository, albumRepository, artistRepository) ratings := engine.NewRatings(itunesControl, mediaFileRepository, albumRepository, artistRepository)
scrobbler := engine.NewScrobbler(itunesControl, mediaFileRepository, nowPlayingRepository) scrobbler := engine.NewScrobbler(itunesControl, mediaFileRepository, nowPlayingRepository)
@@ -58,9 +61,81 @@ func initRouter() *api.Router {
return router return router
} }
func createLedisDBProvider() *Provider {
albumRepository := db_ledis.NewAlbumRepository()
artistRepository := db_ledis.NewArtistRepository()
checkSumRepository := db_ledis.NewCheckSumRepository()
artistIndexRepository := db_ledis.NewArtistIndexRepository()
mediaFileRepository := db_ledis.NewMediaFileRepository()
mediaFolderRepository := persistence.NewMediaFolderRepository()
nowPlayingRepository := db_ledis.NewNowPlayingRepository()
playlistRepository := db_ledis.NewPlaylistRepository()
propertyRepository := db_ledis.NewPropertyRepository()
provider := &Provider{
AlbumRepository: albumRepository,
ArtistRepository: artistRepository,
CheckSumRepository: checkSumRepository,
ArtistIndexRepository: artistIndexRepository,
MediaFileRepository: mediaFileRepository,
MediaFolderRepository: mediaFolderRepository,
NowPlayingRepository: nowPlayingRepository,
PlaylistRepository: playlistRepository,
PropertyRepository: propertyRepository,
}
return provider
}
func createStormProvider() *Provider {
albumRepository := db_storm.NewAlbumRepository()
artistRepository := db_storm.NewArtistRepository()
checkSumRepository := db_storm.NewCheckSumRepository()
artistIndexRepository := db_storm.NewArtistIndexRepository()
mediaFileRepository := db_storm.NewMediaFileRepository()
mediaFolderRepository := persistence.NewMediaFolderRepository()
nowPlayingRepository := persistence.NewNowPlayingRepository()
playlistRepository := db_storm.NewPlaylistRepository()
propertyRepository := db_storm.NewPropertyRepository()
provider := &Provider{
AlbumRepository: albumRepository,
ArtistRepository: artistRepository,
CheckSumRepository: checkSumRepository,
ArtistIndexRepository: artistIndexRepository,
MediaFileRepository: mediaFileRepository,
MediaFolderRepository: mediaFolderRepository,
NowPlayingRepository: nowPlayingRepository,
PlaylistRepository: playlistRepository,
PropertyRepository: propertyRepository,
}
return provider
}
// wire_injectors.go: // wire_injectors.go:
var allProviders = wire.NewSet(itunesbridge.NewItunesControl, db_storm.Set, engine.Set, scanner.Set, newDB, api.NewRouter) type Provider struct {
AlbumRepository domain.AlbumRepository
ArtistRepository domain.ArtistRepository
CheckSumRepository scanner.CheckSumRepository
ArtistIndexRepository domain.ArtistIndexRepository
MediaFileRepository domain.MediaFileRepository
MediaFolderRepository domain.MediaFolderRepository
NowPlayingRepository domain.NowPlayingRepository
PlaylistRepository domain.PlaylistRepository
PropertyRepository domain.PropertyRepository
}
var allProviders = wire.NewSet(itunesbridge.NewItunesControl, engine.Set, scanner.Set, newDB, api.NewRouter, wire.FieldsOf(new(*Provider), "AlbumRepository", "ArtistRepository", "CheckSumRepository",
"ArtistIndexRepository", "MediaFileRepository", "MediaFolderRepository", "NowPlayingRepository",
"PlaylistRepository", "PropertyRepository"), createPersistenceProvider,
)
func createPersistenceProvider(provider persistence.ProviderIdentifier) *Provider {
switch provider {
case "storm":
return createStormProvider()
default:
return createLedisDBProvider()
}
}
func newDB() gomate.DB { func newDB() gomate.DB {
return ledis.NewEmbeddedDB(db_ledis.Db()) return ledis.NewEmbeddedDB(db_ledis.Db())
+43 -4
View File
@@ -4,8 +4,10 @@ package main
import ( import (
"github.com/cloudsonic/sonic-server/api" "github.com/cloudsonic/sonic-server/api"
"github.com/cloudsonic/sonic-server/domain"
"github.com/cloudsonic/sonic-server/engine" "github.com/cloudsonic/sonic-server/engine"
"github.com/cloudsonic/sonic-server/itunesbridge" "github.com/cloudsonic/sonic-server/itunesbridge"
"github.com/cloudsonic/sonic-server/persistence"
"github.com/cloudsonic/sonic-server/persistence/db_ledis" "github.com/cloudsonic/sonic-server/persistence/db_ledis"
"github.com/cloudsonic/sonic-server/persistence/db_storm" "github.com/cloudsonic/sonic-server/persistence/db_storm"
"github.com/cloudsonic/sonic-server/scanner" "github.com/cloudsonic/sonic-server/scanner"
@@ -14,27 +16,64 @@ import (
"github.com/google/wire" "github.com/google/wire"
) )
type Provider struct {
AlbumRepository domain.AlbumRepository
ArtistRepository domain.ArtistRepository
CheckSumRepository scanner.CheckSumRepository
ArtistIndexRepository domain.ArtistIndexRepository
MediaFileRepository domain.MediaFileRepository
MediaFolderRepository domain.MediaFolderRepository
NowPlayingRepository domain.NowPlayingRepository
PlaylistRepository domain.PlaylistRepository
PropertyRepository domain.PropertyRepository
}
var allProviders = wire.NewSet( var allProviders = wire.NewSet(
itunesbridge.NewItunesControl, itunesbridge.NewItunesControl,
//db_ledis.Set,
db_storm.Set,
engine.Set, engine.Set,
scanner.Set, scanner.Set,
newDB, newDB,
api.NewRouter, api.NewRouter,
wire.FieldsOf(new(*Provider), "AlbumRepository", "ArtistRepository", "CheckSumRepository",
"ArtistIndexRepository", "MediaFileRepository", "MediaFolderRepository", "NowPlayingRepository",
"PlaylistRepository", "PropertyRepository"),
createPersistenceProvider,
) )
func createApp(musicFolder string) *App { func CreateApp(musicFolder string, p persistence.ProviderIdentifier) *App {
panic(wire.Build( panic(wire.Build(
NewApp, NewApp,
allProviders, allProviders,
)) ))
} }
func initRouter() *api.Router { func CreateSubsonicAPIRouter(p persistence.ProviderIdentifier) *api.Router {
panic(wire.Build(allProviders)) panic(wire.Build(allProviders))
} }
func createPersistenceProvider(provider persistence.ProviderIdentifier) *Provider {
switch provider {
case "storm":
return createStormProvider()
default:
return createLedisDBProvider()
}
}
func createLedisDBProvider() *Provider {
panic(wire.Build(
db_ledis.Set,
wire.Struct(new(Provider), "*"),
))
}
func createStormProvider() *Provider {
panic(wire.Build(
db_storm.Set,
wire.Struct(new(Provider), "*"),
))
}
func newDB() gomate.DB { func newDB() gomate.DB {
return ledis.NewEmbeddedDB(db_ledis.Db()) return ledis.NewEmbeddedDB(db_ledis.Db())
} }