diff --git a/conf/configuration.go b/conf/configuration.go index e54ff3399..4a4197a08 100644 --- a/conf/configuration.go +++ b/conf/configuration.go @@ -24,8 +24,9 @@ type sonic struct { PlsIgnoredPatterns string `default:"^iCloud;\\~"` // DevFlags - DevDisableAuthentication bool `default:"false"` - DevDisableFileCheck bool `default:"false"` + DevDisableAuthentication bool `default:"false"` + DevDisableFileCheck bool `default:"false"` + DevPersistenceProvider string `default:"ledisdb"` } var Sonic *sonic diff --git a/main.go b/main.go index c1a981627..d4772f148 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/cloudsonic/sonic-server/conf" + "github.com/cloudsonic/sonic-server/persistence" ) func main() { @@ -11,7 +12,9 @@ func main() { fmt.Printf("\nCloudSonic Server v%s\n\n", "0.2") - a := createApp(conf.Sonic.MusicFolder) - a.MountRouter("/rest/", initRouter()) + provider := persistence.ProviderIdentifier(conf.Sonic.DevPersistenceProvider) + + a := CreateApp(conf.Sonic.MusicFolder, provider) + a.MountRouter("/rest/", CreateSubsonicAPIRouter(provider)) a.Run(":" + conf.Sonic.Port) } diff --git a/persistence/db_ledis/wire_providers.go b/persistence/db_ledis/wire_providers.go index 4353dfd66..574683886 100644 --- a/persistence/db_ledis/wire_providers.go +++ b/persistence/db_ledis/wire_providers.go @@ -15,4 +15,5 @@ var Set = wire.NewSet( NewCheckSumRepository, NewNowPlayingRepository, persistence.NewMediaFolderRepository, + wire.Value(persistence.ProviderIdentifier("levisdb")), ) diff --git a/persistence/db_storm/wire_providers.go b/persistence/db_storm/wire_providers.go index 09ae7de3b..de2d1649c 100644 --- a/persistence/db_storm/wire_providers.go +++ b/persistence/db_storm/wire_providers.go @@ -15,4 +15,5 @@ var Set = wire.NewSet( NewCheckSumRepository, persistence.NewNowPlayingRepository, persistence.NewMediaFolderRepository, + wire.Value(persistence.ProviderIdentifier("storm")), ) diff --git a/persistence/persistence.go b/persistence/persistence.go new file mode 100644 index 000000000..75caf0259 --- /dev/null +++ b/persistence/persistence.go @@ -0,0 +1,3 @@ +package persistence + +type ProviderIdentifier string diff --git a/wire_gen.go b/wire_gen.go index 06e846b95..8397107e9 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -7,6 +7,7 @@ package main import ( "github.com/cloudsonic/sonic-server/api" + "github.com/cloudsonic/sonic-server/domain" "github.com/cloudsonic/sonic-server/engine" "github.com/cloudsonic/sonic-server/itunesbridge" "github.com/cloudsonic/sonic-server/persistence" @@ -20,15 +21,16 @@ import ( // Injectors from wire_injectors.go: -func createApp(musicFolder string) *App { - checkSumRepository := db_storm.NewCheckSumRepository() +func CreateApp(musicFolder string, p persistence.ProviderIdentifier) *App { + provider := createPersistenceProvider(p) + checkSumRepository := provider.CheckSumRepository itunesScanner := scanner.NewItunesScanner(checkSumRepository) - mediaFileRepository := db_storm.NewMediaFileRepository() - albumRepository := db_storm.NewAlbumRepository() - artistRepository := db_storm.NewArtistRepository() - artistIndexRepository := db_storm.NewArtistIndexRepository() - playlistRepository := db_storm.NewPlaylistRepository() - propertyRepository := db_storm.NewPropertyRepository() + mediaFileRepository := provider.MediaFileRepository + albumRepository := provider.AlbumRepository + artistRepository := provider.ArtistRepository + artistIndexRepository := provider.ArtistIndexRepository + playlistRepository := provider.PlaylistRepository + propertyRepository := provider.PropertyRepository db := newDB() search := engine.NewSearch(artistRepository, albumRepository, mediaFileRepository, db) importer := scanner.NewImporter(musicFolder, itunesScanner, mediaFileRepository, albumRepository, artistRepository, artistIndexRepository, playlistRepository, propertyRepository, search) @@ -36,19 +38,20 @@ func createApp(musicFolder string) *App { return app } -func initRouter() *api.Router { - propertyRepository := db_storm.NewPropertyRepository() - mediaFolderRepository := persistence.NewMediaFolderRepository() - artistIndexRepository := db_storm.NewArtistIndexRepository() - artistRepository := db_storm.NewArtistRepository() - albumRepository := db_storm.NewAlbumRepository() - mediaFileRepository := db_storm.NewMediaFileRepository() +func CreateSubsonicAPIRouter(p persistence.ProviderIdentifier) *api.Router { + provider := createPersistenceProvider(p) + propertyRepository := provider.PropertyRepository + mediaFolderRepository := provider.MediaFolderRepository + artistIndexRepository := provider.ArtistIndexRepository + artistRepository := provider.ArtistRepository + albumRepository := provider.AlbumRepository + mediaFileRepository := provider.MediaFileRepository browser := engine.NewBrowser(propertyRepository, mediaFolderRepository, artistIndexRepository, artistRepository, albumRepository, mediaFileRepository) cover := engine.NewCover(mediaFileRepository, albumRepository) - nowPlayingRepository := persistence.NewNowPlayingRepository() + nowPlayingRepository := provider.NowPlayingRepository listGenerator := engine.NewListGenerator(albumRepository, mediaFileRepository, nowPlayingRepository) itunesControl := itunesbridge.NewItunesControl() - playlistRepository := db_storm.NewPlaylistRepository() + playlistRepository := provider.PlaylistRepository playlists := engine.NewPlaylists(itunesControl, playlistRepository, mediaFileRepository) ratings := engine.NewRatings(itunesControl, mediaFileRepository, albumRepository, artistRepository) scrobbler := engine.NewScrobbler(itunesControl, mediaFileRepository, nowPlayingRepository) @@ -58,9 +61,81 @@ func initRouter() *api.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: -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 { return ledis.NewEmbeddedDB(db_ledis.Db()) diff --git a/wire_injectors.go b/wire_injectors.go index d06cf7af5..36ec47152 100644 --- a/wire_injectors.go +++ b/wire_injectors.go @@ -4,8 +4,10 @@ package main import ( "github.com/cloudsonic/sonic-server/api" + "github.com/cloudsonic/sonic-server/domain" "github.com/cloudsonic/sonic-server/engine" "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_storm" "github.com/cloudsonic/sonic-server/scanner" @@ -14,27 +16,64 @@ import ( "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( itunesbridge.NewItunesControl, - //db_ledis.Set, - db_storm.Set, engine.Set, scanner.Set, newDB, 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( NewApp, allProviders, )) } -func initRouter() *api.Router { +func CreateSubsonicAPIRouter(p persistence.ProviderIdentifier) *api.Router { 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 { return ledis.NewEmbeddedDB(db_ledis.Db()) }