From 30ebbc1fa1dda65a2e1f371d10e7f8939fef0c46 Mon Sep 17 00:00:00 2001 From: Deluan Date: Sat, 11 Jan 2020 12:37:05 -0500 Subject: [PATCH] Move API dependency injection to main package, opening the possibility to switch persistence without code changes --- api/api.go | 41 ++++++++++++++++++++------- api/wire_gen.go | 64 +++++++++++++------------------------------ api/wire_injectors.go | 24 +++++++--------- main.go | 3 +- wire_gen.go | 26 +++++++++++++++++- wire_injectors.go | 6 ++++ 6 files changed, 92 insertions(+), 72 deletions(-) diff --git a/api/api.go b/api/api.go index c7122f77..05d03b90 100644 --- a/api/api.go +++ b/api/api.go @@ -8,6 +8,8 @@ import ( "github.com/cloudsonic/sonic-server/api/responses" "github.com/cloudsonic/sonic-server/conf" + "github.com/cloudsonic/sonic-server/domain" + "github.com/cloudsonic/sonic-server/engine" "github.com/go-chi/chi" ) @@ -15,7 +17,26 @@ const ApiVersion = "1.8.0" type SubsonicHandler = func(http.ResponseWriter, *http.Request) (*responses.Subsonic, error) -func Router() http.Handler { +type Router struct { + Browser engine.Browser + Cover engine.Cover + ListGenerator engine.ListGenerator + Playlists engine.Playlists + Ratings engine.Ratings + Scrobbler engine.Scrobbler + Search engine.Search + MediaFileRepository domain.MediaFileRepository +} + +func NewRouter(browser engine.Browser, cover engine.Cover, listGenerator engine.ListGenerator, + playlists engine.Playlists, ratings engine.Ratings, scrobbler engine.Scrobbler, search engine.Search, + mediaFileRepository domain.MediaFileRepository) *Router { + + return &Router{Browser: browser, Cover: cover, ListGenerator: listGenerator, Playlists: playlists, + Ratings: ratings, Scrobbler: scrobbler, Search: search, MediaFileRepository: mediaFileRepository} +} + +func (api *Router) Routes() http.Handler { r := chi.NewRouter() r.Use(checkRequiredParameters) @@ -27,12 +48,12 @@ func Router() http.Handler { } r.Group(func(r chi.Router) { - c := initSystemController() + c := initSystemController(api) addEndpoint(r, "ping", c.Ping) addEndpoint(r, "getLicense", c.GetLicense) }) r.Group(func(r chi.Router) { - c := initBrowsingController() + c := initBrowsingController(api) addEndpoint(r, "getMusicFolders", c.GetMusicFolders) addEndpoint(r, "getMusicFolders", c.GetMusicFolders) addEndpoint(r, "getIndexes", c.GetIndexes) @@ -44,7 +65,7 @@ func Router() http.Handler { addEndpoint(reqParams, "getSong", c.GetSong) }) r.Group(func(r chi.Router) { - c := initAlbumListController() + c := initAlbumListController(api) addEndpoint(r, "getAlbumList", c.GetAlbumList) addEndpoint(r, "getAlbumList2", c.GetAlbumList2) addEndpoint(r, "getStarred", c.GetStarred) @@ -53,14 +74,14 @@ func Router() http.Handler { addEndpoint(r, "getRandomSongs", c.GetRandomSongs) }) r.Group(func(r chi.Router) { - c := initMediaAnnotationController() + c := initMediaAnnotationController(api) addEndpoint(r, "setRating", c.SetRating) addEndpoint(r, "star", c.Star) addEndpoint(r, "unstar", c.Unstar) addEndpoint(r, "scrobble", c.Scrobble) }) r.Group(func(r chi.Router) { - c := initPlaylistsController() + c := initPlaylistsController(api) addEndpoint(r, "getPlaylists", c.GetPlaylists) addEndpoint(r, "getPlaylist", c.GetPlaylist) addEndpoint(r, "createPlaylist", c.CreatePlaylist) @@ -68,21 +89,21 @@ func Router() http.Handler { addEndpoint(r, "updatePlaylist", c.UpdatePlaylist) }) r.Group(func(r chi.Router) { - c := initSearchingController() + c := initSearchingController(api) addEndpoint(r, "search2", c.Search2) addEndpoint(r, "search3", c.Search3) }) r.Group(func(r chi.Router) { - c := initUsersController() + c := initUsersController(api) addEndpoint(r, "getUser", c.GetUser) }) r.Group(func(r chi.Router) { - c := initMediaRetrievalController() + c := initMediaRetrievalController(api) addEndpoint(r, "getAvatar", c.GetAvatar) addEndpoint(r, "getCoverArt", c.GetCoverArt) }) r.Group(func(r chi.Router) { - c := initStreamController() + c := initStreamController(api) addEndpoint(r, "stream", c.Stream) addEndpoint(r, "download", c.Download) }) diff --git a/api/wire_gen.go b/api/wire_gen.go index 0da14e25..dd100b84 100644 --- a/api/wire_gen.go +++ b/api/wire_gen.go @@ -6,11 +6,8 @@ package api import ( - "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/deluan/gomate" "github.com/deluan/gomate/ledis" "github.com/google/wire" @@ -18,85 +15,62 @@ import ( // Injectors from wire_injectors.go: -func initSystemController() *SystemController { +func initSystemController(router *Router) *SystemController { systemController := NewSystemController() return systemController } -func initBrowsingController() *BrowsingController { - propertyRepository := db_storm.NewPropertyRepository() - mediaFolderRepository := persistence.NewMediaFolderRepository() - artistIndexRepository := db_storm.NewArtistIndexRepository() - artistRepository := db_storm.NewArtistRepository() - albumRepository := db_storm.NewAlbumRepository() - mediaFileRepository := db_storm.NewMediaFileRepository() - browser := engine.NewBrowser(propertyRepository, mediaFolderRepository, artistIndexRepository, artistRepository, albumRepository, mediaFileRepository) +func initBrowsingController(router *Router) *BrowsingController { + browser := router.Browser browsingController := NewBrowsingController(browser) return browsingController } -func initAlbumListController() *AlbumListController { - albumRepository := db_storm.NewAlbumRepository() - mediaFileRepository := db_storm.NewMediaFileRepository() - nowPlayingRepository := persistence.NewNowPlayingRepository() - listGenerator := engine.NewListGenerator(albumRepository, mediaFileRepository, nowPlayingRepository) +func initAlbumListController(router *Router) *AlbumListController { + listGenerator := router.ListGenerator albumListController := NewAlbumListController(listGenerator) return albumListController } -func initMediaAnnotationController() *MediaAnnotationController { - itunesControl := itunesbridge.NewItunesControl() - mediaFileRepository := db_storm.NewMediaFileRepository() - nowPlayingRepository := persistence.NewNowPlayingRepository() - scrobbler := engine.NewScrobbler(itunesControl, mediaFileRepository, nowPlayingRepository) - albumRepository := db_storm.NewAlbumRepository() - artistRepository := db_storm.NewArtistRepository() - ratings := engine.NewRatings(itunesControl, mediaFileRepository, albumRepository, artistRepository) +func initMediaAnnotationController(router *Router) *MediaAnnotationController { + scrobbler := router.Scrobbler + ratings := router.Ratings mediaAnnotationController := NewMediaAnnotationController(scrobbler, ratings) return mediaAnnotationController } -func initPlaylistsController() *PlaylistsController { - itunesControl := itunesbridge.NewItunesControl() - playlistRepository := db_storm.NewPlaylistRepository() - mediaFileRepository := db_storm.NewMediaFileRepository() - playlists := engine.NewPlaylists(itunesControl, playlistRepository, mediaFileRepository) +func initPlaylistsController(router *Router) *PlaylistsController { + playlists := router.Playlists playlistsController := NewPlaylistsController(playlists) return playlistsController } -func initSearchingController() *SearchingController { - artistRepository := db_storm.NewArtistRepository() - albumRepository := db_storm.NewAlbumRepository() - mediaFileRepository := db_storm.NewMediaFileRepository() - db := newDB() - search := engine.NewSearch(artistRepository, albumRepository, mediaFileRepository, db) +func initSearchingController(router *Router) *SearchingController { + search := router.Search searchingController := NewSearchingController(search) return searchingController } -func initUsersController() *UsersController { +func initUsersController(router *Router) *UsersController { usersController := NewUsersController() return usersController } -func initMediaRetrievalController() *MediaRetrievalController { - mediaFileRepository := db_storm.NewMediaFileRepository() - albumRepository := db_storm.NewAlbumRepository() - cover := engine.NewCover(mediaFileRepository, albumRepository) +func initMediaRetrievalController(router *Router) *MediaRetrievalController { + cover := router.Cover mediaRetrievalController := NewMediaRetrievalController(cover) return mediaRetrievalController } -func initStreamController() *StreamController { - mediaFileRepository := db_storm.NewMediaFileRepository() +func initStreamController(router *Router) *StreamController { + mediaFileRepository := router.MediaFileRepository streamController := NewStreamController(mediaFileRepository) return streamController } // wire_injectors.go: -var allProviders = wire.NewSet(itunesbridge.NewItunesControl, db_storm.Set, engine.Set, NewSystemController, +var allProviders = wire.NewSet(itunesbridge.NewItunesControl, NewSystemController, NewBrowsingController, NewAlbumListController, NewMediaAnnotationController, @@ -105,7 +79,7 @@ var allProviders = wire.NewSet(itunesbridge.NewItunesControl, db_storm.Set, engi NewUsersController, NewMediaRetrievalController, NewStreamController, - newDB, + newDB, wire.FieldsOf(new(*Router), "Browser", "Cover", "ListGenerator", "Playlists", "Ratings", "Scrobbler", "Search", "MediaFileRepository"), ) func newDB() gomate.DB { diff --git a/api/wire_injectors.go b/api/wire_injectors.go index 9a7d00ec..3eca5459 100644 --- a/api/wire_injectors.go +++ b/api/wire_injectors.go @@ -3,10 +3,8 @@ package api import ( - "github.com/cloudsonic/sonic-server/engine" "github.com/cloudsonic/sonic-server/itunesbridge" "github.com/cloudsonic/sonic-server/persistence/db_ledis" - "github.com/cloudsonic/sonic-server/persistence/db_storm" "github.com/deluan/gomate" "github.com/deluan/gomate/ledis" "github.com/google/wire" @@ -14,9 +12,6 @@ import ( var allProviders = wire.NewSet( itunesbridge.NewItunesControl, - //db_ledis.Set, - db_storm.Set, - engine.Set, NewSystemController, NewBrowsingController, NewAlbumListController, @@ -27,41 +22,42 @@ var allProviders = wire.NewSet( NewMediaRetrievalController, NewStreamController, newDB, + wire.FieldsOf(new(*Router), "Browser", "Cover", "ListGenerator", "Playlists", "Ratings", "Scrobbler", "Search", "MediaFileRepository"), ) -func initSystemController() *SystemController { +func initSystemController(router *Router) *SystemController { panic(wire.Build(allProviders)) } -func initBrowsingController() *BrowsingController { +func initBrowsingController(router *Router) *BrowsingController { panic(wire.Build(allProviders)) } -func initAlbumListController() *AlbumListController { +func initAlbumListController(router *Router) *AlbumListController { panic(wire.Build(allProviders)) } -func initMediaAnnotationController() *MediaAnnotationController { +func initMediaAnnotationController(router *Router) *MediaAnnotationController { panic(wire.Build(allProviders)) } -func initPlaylistsController() *PlaylistsController { +func initPlaylistsController(router *Router) *PlaylistsController { panic(wire.Build(allProviders)) } -func initSearchingController() *SearchingController { +func initSearchingController(router *Router) *SearchingController { panic(wire.Build(allProviders)) } -func initUsersController() *UsersController { +func initUsersController(router *Router) *UsersController { panic(wire.Build(allProviders)) } -func initMediaRetrievalController() *MediaRetrievalController { +func initMediaRetrievalController(router *Router) *MediaRetrievalController { panic(wire.Build(allProviders)) } -func initStreamController() *StreamController { +func initStreamController(router *Router) *StreamController { panic(wire.Build(allProviders)) } diff --git a/main.go b/main.go index f346f5a0..78f0894e 100644 --- a/main.go +++ b/main.go @@ -3,7 +3,6 @@ package main import ( "fmt" - "github.com/cloudsonic/sonic-server/api" "github.com/cloudsonic/sonic-server/conf" ) @@ -14,6 +13,6 @@ func main() { a := App{} a.Initialize() - a.MountRouter("/rest/", api.Router()) + a.MountRouter("/rest/", initRouter().Routes()) a.Run(":" + conf.Sonic.Port) } diff --git a/wire_gen.go b/wire_gen.go index 13d7b968..5a19e325 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -6,8 +6,10 @@ package main import ( + "github.com/cloudsonic/sonic-server/api" "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" @@ -18,6 +20,28 @@ import ( // Injectors from wire_injectors.go: +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() + browser := engine.NewBrowser(propertyRepository, mediaFolderRepository, artistIndexRepository, artistRepository, albumRepository, mediaFileRepository) + cover := engine.NewCover(mediaFileRepository, albumRepository) + nowPlayingRepository := persistence.NewNowPlayingRepository() + listGenerator := engine.NewListGenerator(albumRepository, mediaFileRepository, nowPlayingRepository) + itunesControl := itunesbridge.NewItunesControl() + playlistRepository := db_storm.NewPlaylistRepository() + playlists := engine.NewPlaylists(itunesControl, playlistRepository, mediaFileRepository) + ratings := engine.NewRatings(itunesControl, mediaFileRepository, albumRepository, artistRepository) + scrobbler := engine.NewScrobbler(itunesControl, mediaFileRepository, nowPlayingRepository) + db := newDB() + search := engine.NewSearch(artistRepository, albumRepository, mediaFileRepository, db) + router := api.NewRouter(browser, cover, listGenerator, playlists, ratings, scrobbler, search, mediaFileRepository) + return router +} + func initImporter(musicFolder string) *scanner.Importer { checkSumRepository := db_storm.NewCheckSumRepository() itunesScanner := scanner.NewItunesScanner(checkSumRepository) @@ -35,7 +59,7 @@ func initImporter(musicFolder string) *scanner.Importer { // wire_injectors.go: -var allProviders = wire.NewSet(itunesbridge.NewItunesControl, db_storm.Set, engine.Set, scanner.Set, newDB) +var allProviders = wire.NewSet(itunesbridge.NewItunesControl, db_storm.Set, engine.Set, scanner.Set, newDB, api.NewRouter) func newDB() gomate.DB { return ledis.NewEmbeddedDB(db_ledis.Db()) diff --git a/wire_injectors.go b/wire_injectors.go index 771c6629..5d95ba8b 100644 --- a/wire_injectors.go +++ b/wire_injectors.go @@ -3,6 +3,7 @@ package main import ( + "github.com/cloudsonic/sonic-server/api" "github.com/cloudsonic/sonic-server/engine" "github.com/cloudsonic/sonic-server/itunesbridge" "github.com/cloudsonic/sonic-server/persistence/db_ledis" @@ -20,8 +21,13 @@ var allProviders = wire.NewSet( engine.Set, scanner.Set, newDB, + api.NewRouter, ) +func initRouter() *api.Router { + panic(wire.Build(allProviders)) +} + func initImporter(musicFolder string) *scanner.Importer { panic(wire.Build(allProviders)) }