Move API dependency injection to main package, opening the possibility to switch persistence without code changes

This commit is contained in:
Deluan 2020-01-11 12:37:05 -05:00 committed by Deluan Quintão
parent 52f682debf
commit 30ebbc1fa1
6 changed files with 92 additions and 72 deletions

View File

@ -8,6 +8,8 @@ import (
"github.com/cloudsonic/sonic-server/api/responses" "github.com/cloudsonic/sonic-server/api/responses"
"github.com/cloudsonic/sonic-server/conf" "github.com/cloudsonic/sonic-server/conf"
"github.com/cloudsonic/sonic-server/domain"
"github.com/cloudsonic/sonic-server/engine"
"github.com/go-chi/chi" "github.com/go-chi/chi"
) )
@ -15,7 +17,26 @@ const ApiVersion = "1.8.0"
type SubsonicHandler = func(http.ResponseWriter, *http.Request) (*responses.Subsonic, error) 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 := chi.NewRouter()
r.Use(checkRequiredParameters) r.Use(checkRequiredParameters)
@ -27,12 +48,12 @@ func Router() http.Handler {
} }
r.Group(func(r chi.Router) { r.Group(func(r chi.Router) {
c := initSystemController() c := initSystemController(api)
addEndpoint(r, "ping", c.Ping) addEndpoint(r, "ping", c.Ping)
addEndpoint(r, "getLicense", c.GetLicense) addEndpoint(r, "getLicense", c.GetLicense)
}) })
r.Group(func(r chi.Router) { r.Group(func(r chi.Router) {
c := initBrowsingController() c := initBrowsingController(api)
addEndpoint(r, "getMusicFolders", c.GetMusicFolders) addEndpoint(r, "getMusicFolders", c.GetMusicFolders)
addEndpoint(r, "getMusicFolders", c.GetMusicFolders) addEndpoint(r, "getMusicFolders", c.GetMusicFolders)
addEndpoint(r, "getIndexes", c.GetIndexes) addEndpoint(r, "getIndexes", c.GetIndexes)
@ -44,7 +65,7 @@ func Router() http.Handler {
addEndpoint(reqParams, "getSong", c.GetSong) addEndpoint(reqParams, "getSong", c.GetSong)
}) })
r.Group(func(r chi.Router) { r.Group(func(r chi.Router) {
c := initAlbumListController() c := initAlbumListController(api)
addEndpoint(r, "getAlbumList", c.GetAlbumList) addEndpoint(r, "getAlbumList", c.GetAlbumList)
addEndpoint(r, "getAlbumList2", c.GetAlbumList2) addEndpoint(r, "getAlbumList2", c.GetAlbumList2)
addEndpoint(r, "getStarred", c.GetStarred) addEndpoint(r, "getStarred", c.GetStarred)
@ -53,14 +74,14 @@ func Router() http.Handler {
addEndpoint(r, "getRandomSongs", c.GetRandomSongs) addEndpoint(r, "getRandomSongs", c.GetRandomSongs)
}) })
r.Group(func(r chi.Router) { r.Group(func(r chi.Router) {
c := initMediaAnnotationController() c := initMediaAnnotationController(api)
addEndpoint(r, "setRating", c.SetRating) addEndpoint(r, "setRating", c.SetRating)
addEndpoint(r, "star", c.Star) addEndpoint(r, "star", c.Star)
addEndpoint(r, "unstar", c.Unstar) addEndpoint(r, "unstar", c.Unstar)
addEndpoint(r, "scrobble", c.Scrobble) addEndpoint(r, "scrobble", c.Scrobble)
}) })
r.Group(func(r chi.Router) { r.Group(func(r chi.Router) {
c := initPlaylistsController() c := initPlaylistsController(api)
addEndpoint(r, "getPlaylists", c.GetPlaylists) addEndpoint(r, "getPlaylists", c.GetPlaylists)
addEndpoint(r, "getPlaylist", c.GetPlaylist) addEndpoint(r, "getPlaylist", c.GetPlaylist)
addEndpoint(r, "createPlaylist", c.CreatePlaylist) addEndpoint(r, "createPlaylist", c.CreatePlaylist)
@ -68,21 +89,21 @@ func Router() http.Handler {
addEndpoint(r, "updatePlaylist", c.UpdatePlaylist) addEndpoint(r, "updatePlaylist", c.UpdatePlaylist)
}) })
r.Group(func(r chi.Router) { r.Group(func(r chi.Router) {
c := initSearchingController() c := initSearchingController(api)
addEndpoint(r, "search2", c.Search2) addEndpoint(r, "search2", c.Search2)
addEndpoint(r, "search3", c.Search3) addEndpoint(r, "search3", c.Search3)
}) })
r.Group(func(r chi.Router) { r.Group(func(r chi.Router) {
c := initUsersController() c := initUsersController(api)
addEndpoint(r, "getUser", c.GetUser) addEndpoint(r, "getUser", c.GetUser)
}) })
r.Group(func(r chi.Router) { r.Group(func(r chi.Router) {
c := initMediaRetrievalController() c := initMediaRetrievalController(api)
addEndpoint(r, "getAvatar", c.GetAvatar) addEndpoint(r, "getAvatar", c.GetAvatar)
addEndpoint(r, "getCoverArt", c.GetCoverArt) addEndpoint(r, "getCoverArt", c.GetCoverArt)
}) })
r.Group(func(r chi.Router) { r.Group(func(r chi.Router) {
c := initStreamController() c := initStreamController(api)
addEndpoint(r, "stream", c.Stream) addEndpoint(r, "stream", c.Stream)
addEndpoint(r, "download", c.Download) addEndpoint(r, "download", c.Download)
}) })

View File

@ -6,11 +6,8 @@
package api package api
import ( import (
"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/deluan/gomate" "github.com/deluan/gomate"
"github.com/deluan/gomate/ledis" "github.com/deluan/gomate/ledis"
"github.com/google/wire" "github.com/google/wire"
@ -18,85 +15,62 @@ import (
// Injectors from wire_injectors.go: // Injectors from wire_injectors.go:
func initSystemController() *SystemController { func initSystemController(router *Router) *SystemController {
systemController := NewSystemController() systemController := NewSystemController()
return systemController return systemController
} }
func initBrowsingController() *BrowsingController { func initBrowsingController(router *Router) *BrowsingController {
propertyRepository := db_storm.NewPropertyRepository() browser := router.Browser
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)
browsingController := NewBrowsingController(browser) browsingController := NewBrowsingController(browser)
return browsingController return browsingController
} }
func initAlbumListController() *AlbumListController { func initAlbumListController(router *Router) *AlbumListController {
albumRepository := db_storm.NewAlbumRepository() listGenerator := router.ListGenerator
mediaFileRepository := db_storm.NewMediaFileRepository()
nowPlayingRepository := persistence.NewNowPlayingRepository()
listGenerator := engine.NewListGenerator(albumRepository, mediaFileRepository, nowPlayingRepository)
albumListController := NewAlbumListController(listGenerator) albumListController := NewAlbumListController(listGenerator)
return albumListController return albumListController
} }
func initMediaAnnotationController() *MediaAnnotationController { func initMediaAnnotationController(router *Router) *MediaAnnotationController {
itunesControl := itunesbridge.NewItunesControl() scrobbler := router.Scrobbler
mediaFileRepository := db_storm.NewMediaFileRepository() ratings := router.Ratings
nowPlayingRepository := persistence.NewNowPlayingRepository()
scrobbler := engine.NewScrobbler(itunesControl, mediaFileRepository, nowPlayingRepository)
albumRepository := db_storm.NewAlbumRepository()
artistRepository := db_storm.NewArtistRepository()
ratings := engine.NewRatings(itunesControl, mediaFileRepository, albumRepository, artistRepository)
mediaAnnotationController := NewMediaAnnotationController(scrobbler, ratings) mediaAnnotationController := NewMediaAnnotationController(scrobbler, ratings)
return mediaAnnotationController return mediaAnnotationController
} }
func initPlaylistsController() *PlaylistsController { func initPlaylistsController(router *Router) *PlaylistsController {
itunesControl := itunesbridge.NewItunesControl() playlists := router.Playlists
playlistRepository := db_storm.NewPlaylistRepository()
mediaFileRepository := db_storm.NewMediaFileRepository()
playlists := engine.NewPlaylists(itunesControl, playlistRepository, mediaFileRepository)
playlistsController := NewPlaylistsController(playlists) playlistsController := NewPlaylistsController(playlists)
return playlistsController return playlistsController
} }
func initSearchingController() *SearchingController { func initSearchingController(router *Router) *SearchingController {
artistRepository := db_storm.NewArtistRepository() search := router.Search
albumRepository := db_storm.NewAlbumRepository()
mediaFileRepository := db_storm.NewMediaFileRepository()
db := newDB()
search := engine.NewSearch(artistRepository, albumRepository, mediaFileRepository, db)
searchingController := NewSearchingController(search) searchingController := NewSearchingController(search)
return searchingController return searchingController
} }
func initUsersController() *UsersController { func initUsersController(router *Router) *UsersController {
usersController := NewUsersController() usersController := NewUsersController()
return usersController return usersController
} }
func initMediaRetrievalController() *MediaRetrievalController { func initMediaRetrievalController(router *Router) *MediaRetrievalController {
mediaFileRepository := db_storm.NewMediaFileRepository() cover := router.Cover
albumRepository := db_storm.NewAlbumRepository()
cover := engine.NewCover(mediaFileRepository, albumRepository)
mediaRetrievalController := NewMediaRetrievalController(cover) mediaRetrievalController := NewMediaRetrievalController(cover)
return mediaRetrievalController return mediaRetrievalController
} }
func initStreamController() *StreamController { func initStreamController(router *Router) *StreamController {
mediaFileRepository := db_storm.NewMediaFileRepository() mediaFileRepository := router.MediaFileRepository
streamController := NewStreamController(mediaFileRepository) streamController := NewStreamController(mediaFileRepository)
return streamController return streamController
} }
// wire_injectors.go: // wire_injectors.go:
var allProviders = wire.NewSet(itunesbridge.NewItunesControl, db_storm.Set, engine.Set, NewSystemController, var allProviders = wire.NewSet(itunesbridge.NewItunesControl, NewSystemController,
NewBrowsingController, NewBrowsingController,
NewAlbumListController, NewAlbumListController,
NewMediaAnnotationController, NewMediaAnnotationController,
@ -105,7 +79,7 @@ var allProviders = wire.NewSet(itunesbridge.NewItunesControl, db_storm.Set, engi
NewUsersController, NewUsersController,
NewMediaRetrievalController, NewMediaRetrievalController,
NewStreamController, NewStreamController,
newDB, newDB, wire.FieldsOf(new(*Router), "Browser", "Cover", "ListGenerator", "Playlists", "Ratings", "Scrobbler", "Search", "MediaFileRepository"),
) )
func newDB() gomate.DB { func newDB() gomate.DB {

View File

@ -3,10 +3,8 @@
package api package api
import ( import (
"github.com/cloudsonic/sonic-server/engine"
"github.com/cloudsonic/sonic-server/itunesbridge" "github.com/cloudsonic/sonic-server/itunesbridge"
"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/deluan/gomate" "github.com/deluan/gomate"
"github.com/deluan/gomate/ledis" "github.com/deluan/gomate/ledis"
"github.com/google/wire" "github.com/google/wire"
@ -14,9 +12,6 @@ import (
var allProviders = wire.NewSet( var allProviders = wire.NewSet(
itunesbridge.NewItunesControl, itunesbridge.NewItunesControl,
//db_ledis.Set,
db_storm.Set,
engine.Set,
NewSystemController, NewSystemController,
NewBrowsingController, NewBrowsingController,
NewAlbumListController, NewAlbumListController,
@ -27,41 +22,42 @@ var allProviders = wire.NewSet(
NewMediaRetrievalController, NewMediaRetrievalController,
NewStreamController, NewStreamController,
newDB, 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)) panic(wire.Build(allProviders))
} }
func initBrowsingController() *BrowsingController { func initBrowsingController(router *Router) *BrowsingController {
panic(wire.Build(allProviders)) panic(wire.Build(allProviders))
} }
func initAlbumListController() *AlbumListController { func initAlbumListController(router *Router) *AlbumListController {
panic(wire.Build(allProviders)) panic(wire.Build(allProviders))
} }
func initMediaAnnotationController() *MediaAnnotationController { func initMediaAnnotationController(router *Router) *MediaAnnotationController {
panic(wire.Build(allProviders)) panic(wire.Build(allProviders))
} }
func initPlaylistsController() *PlaylistsController { func initPlaylistsController(router *Router) *PlaylistsController {
panic(wire.Build(allProviders)) panic(wire.Build(allProviders))
} }
func initSearchingController() *SearchingController { func initSearchingController(router *Router) *SearchingController {
panic(wire.Build(allProviders)) panic(wire.Build(allProviders))
} }
func initUsersController() *UsersController { func initUsersController(router *Router) *UsersController {
panic(wire.Build(allProviders)) panic(wire.Build(allProviders))
} }
func initMediaRetrievalController() *MediaRetrievalController { func initMediaRetrievalController(router *Router) *MediaRetrievalController {
panic(wire.Build(allProviders)) panic(wire.Build(allProviders))
} }
func initStreamController() *StreamController { func initStreamController(router *Router) *StreamController {
panic(wire.Build(allProviders)) panic(wire.Build(allProviders))
} }

View File

@ -3,7 +3,6 @@ package main
import ( import (
"fmt" "fmt"
"github.com/cloudsonic/sonic-server/api"
"github.com/cloudsonic/sonic-server/conf" "github.com/cloudsonic/sonic-server/conf"
) )
@ -14,6 +13,6 @@ func main() {
a := App{} a := App{}
a.Initialize() a.Initialize()
a.MountRouter("/rest/", api.Router()) a.MountRouter("/rest/", initRouter().Routes())
a.Run(":" + conf.Sonic.Port) a.Run(":" + conf.Sonic.Port)
} }

View File

@ -6,8 +6,10 @@
package main package main
import ( import (
"github.com/cloudsonic/sonic-server/api"
"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"
@ -18,6 +20,28 @@ import (
// Injectors from wire_injectors.go: // 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 { func initImporter(musicFolder string) *scanner.Importer {
checkSumRepository := db_storm.NewCheckSumRepository() checkSumRepository := db_storm.NewCheckSumRepository()
itunesScanner := scanner.NewItunesScanner(checkSumRepository) itunesScanner := scanner.NewItunesScanner(checkSumRepository)
@ -35,7 +59,7 @@ func initImporter(musicFolder string) *scanner.Importer {
// wire_injectors.go: // 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 { func newDB() gomate.DB {
return ledis.NewEmbeddedDB(db_ledis.Db()) return ledis.NewEmbeddedDB(db_ledis.Db())

View File

@ -3,6 +3,7 @@
package main package main
import ( import (
"github.com/cloudsonic/sonic-server/api"
"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/db_ledis" "github.com/cloudsonic/sonic-server/persistence/db_ledis"
@ -20,8 +21,13 @@ var allProviders = wire.NewSet(
engine.Set, engine.Set,
scanner.Set, scanner.Set,
newDB, newDB,
api.NewRouter,
) )
func initRouter() *api.Router {
panic(wire.Build(allProviders))
}
func initImporter(musicFolder string) *scanner.Importer { func initImporter(musicFolder string) *scanner.Importer {
panic(wire.Build(allProviders)) panic(wire.Build(allProviders))
} }