From d46b79d8926254c95b897bba4246f09ef7a9f462 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Thu, 7 May 2026 00:08:21 +0300 Subject: Refactor API server dependencies for task 11 --- internal/api/handlers_podcast_test.go | 20 ++++++- internal/api/handlers_test.go | 20 ++++++- internal/api/server.go | 106 +++++++++++++++------------------- 3 files changed, 86 insertions(+), 60 deletions(-) (limited to 'internal') diff --git a/internal/api/handlers_podcast_test.go b/internal/api/handlers_podcast_test.go index 043a0f1..33a129c 100644 --- a/internal/api/handlers_podcast_test.go +++ b/internal/api/handlers_podcast_test.go @@ -49,7 +49,25 @@ func newPodcastTestServer(t *testing.T, store repository.Store, hasher auth.Hash GetUserByIDFunc: func(context.Context, int64) (*model.User, error) { return &model.User{ID: 1, IsAdmin: true}, nil }, } } - return NewServer(store, hasher, sm, cfg, browseSvc, writeSvc, shareSvc, tagSvc, favSvc, noteSvc, adminSvc, progressSvc, authSvc, podcastSvc, fs, nil) + return NewServer(ServerDeps{ + Store: store, + Hasher: hasher, + SessionManager: sm, + Config: cfg, + Services: ServerServices{ + Browse: browseSvc, + Write: writeSvc, + Share: shareSvc, + Tag: tagSvc, + Favorite: favSvc, + Note: noteSvc, + Admin: adminSvc, + Progress: progressSvc, + Auth: authSvc, + Podcast: podcastSvc, + }, + StaticFS: fs, + }) } // setupPodcastE2E creates a full server with a real SQLite store and real services. diff --git a/internal/api/handlers_test.go b/internal/api/handlers_test.go index 584ac31..f5e8afa 100644 --- a/internal/api/handlers_test.go +++ b/internal/api/handlers_test.go @@ -66,7 +66,25 @@ func newTestServer(t *testing.T, store repository.Store, hasher auth.Hasher, sm if len(remuxer) > 0 { rem = remuxer[0] } - return NewServer(store, hasher, sm, cfg, browseSvc, writeSvc, shareSvc, tagSvc, favSvc, noteSvc, adminSvc, progressSvc, authSvc, nil, fs, rem) + return NewServer(ServerDeps{ + Store: store, + Hasher: hasher, + SessionManager: sm, + Config: cfg, + Services: ServerServices{ + Browse: browseSvc, + Write: writeSvc, + Share: shareSvc, + Tag: tagSvc, + Favorite: favSvc, + Note: noteSvc, + Admin: adminSvc, + Progress: progressSvc, + Auth: authSvc, + }, + StaticFS: fs, + Remuxer: rem, + }) } func addSessionCookie(t *testing.T, store repository.Store, sm *auth.SessionManager, userID int64) *http.Cookie { diff --git a/internal/api/server.go b/internal/api/server.go index 8f8c260..ea9bddd 100644 --- a/internal/api/server.go +++ b/internal/api/server.go @@ -37,75 +37,65 @@ type Server struct { mw *Middleware } +// ServerServices groups the optional service dependencies used by route handlers. +// If any service is nil, its respective routes return 501. +type ServerServices struct { + Browse service.MediaBrowseService + Write service.MediaWriteService + Share service.MediaShareService + Tag service.MediaTagService + Favorite service.MediaFavoriteService + Note service.MediaNoteService + Admin service.AdminService + Progress service.ProgressService + Auth service.AuthService + Podcast service.PodcastEpisodeService +} + +// ServerDeps contains the dependencies needed to construct a Server. +type ServerDeps struct { + Store repository.Store + Hasher auth.Hasher + SessionManager *auth.SessionManager + Config *internal.Config + Services ServerServices + StaticFS http.FileSystem + Remuxer probe.Remuxer +} + // NewServer creates a Server with routes. -// If any service argument is nil, its respective routes return 501. -func NewServer( - store repository.Store, - hasher auth.Hasher, - sm *auth.SessionManager, - cfg *internal.Config, - browseSvc service.MediaBrowseService, - writeSvc service.MediaWriteService, - shareSvc service.MediaShareService, - tagSvc service.MediaTagService, - favSvc service.MediaFavoriteService, - noteSvc service.MediaNoteService, - adminSvc service.AdminService, - progressSvc service.ProgressService, - authSvc service.AuthService, - podcastSvc service.PodcastEpisodeService, - staticFS http.FileSystem, - remuxer probe.Remuxer, -) *Server { - return NewServerWithLogger(store, hasher, sm, cfg, browseSvc, writeSvc, shareSvc, tagSvc, favSvc, noteSvc, adminSvc, progressSvc, authSvc, podcastSvc, staticFS, remuxer, slog.Default()) +func NewServer(deps ServerDeps) *Server { + return NewServerWithLogger(deps, slog.Default()) } // NewServerWithLogger creates a Server with routes and an injected logger. -func NewServerWithLogger( - store repository.Store, - hasher auth.Hasher, - sm *auth.SessionManager, - cfg *internal.Config, - browseSvc service.MediaBrowseService, - writeSvc service.MediaWriteService, - shareSvc service.MediaShareService, - tagSvc service.MediaTagService, - favSvc service.MediaFavoriteService, - noteSvc service.MediaNoteService, - adminSvc service.AdminService, - progressSvc service.ProgressService, - authSvc service.AuthService, - podcastSvc service.PodcastEpisodeService, - staticFS http.FileSystem, - remuxer probe.Remuxer, - logger *slog.Logger, -) *Server { - if staticFS == nil { - staticFS = http.Dir("web") +func NewServerWithLogger(deps ServerDeps, logger *slog.Logger) *Server { + if deps.StaticFS == nil { + deps.StaticFS = http.Dir("web") } if logger == nil { logger = slog.Default() } s := &Server{ - store: store, - hasher: hasher, - sm: sm, - cfg: cfg, + store: deps.Store, + hasher: deps.Hasher, + sm: deps.SessionManager, + cfg: deps.Config, mux: http.NewServeMux(), - browseSvc: browseSvc, - writeSvc: writeSvc, - shareSvc: shareSvc, - tagSvc: tagSvc, - favSvc: favSvc, - noteSvc: noteSvc, - adminSvc: adminSvc, - progressSvc: progressSvc, - authSvc: authSvc, - podcastSvc: podcastSvc, - staticFS: staticFS, - remuxer: remuxer, + browseSvc: deps.Services.Browse, + writeSvc: deps.Services.Write, + shareSvc: deps.Services.Share, + tagSvc: deps.Services.Tag, + favSvc: deps.Services.Favorite, + noteSvc: deps.Services.Note, + adminSvc: deps.Services.Admin, + progressSvc: deps.Services.Progress, + authSvc: deps.Services.Auth, + podcastSvc: deps.Services.Podcast, + staticFS: deps.StaticFS, + remuxer: deps.Remuxer, logger: logger, - mw: NewMiddleware(authSvc, sm), + mw: NewMiddleware(deps.Services.Auth, deps.SessionManager), } s.routes() return s -- cgit v1.2.3