From 0af2b2bc97275b5b6168cb91dabfe30d89bd5d07 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 10 May 2026 09:54:50 +0300 Subject: refactor(service,scanner): return concrete types from constructors Apply the Go best-practice convention 'accept interfaces, return concrete types' across the service and scanner packages: - NewBrowseService -> *browseService - NewWriteService -> *writeService - NewMediaStreamer -> *mediaStreamer - NewFSScanner -> *FSScanner - NewFSScannerWithLogger -> *FSScanner - NewPodcastBrowseService -> *podcastBrowseService - NewTagService -> *tagService - NewShareService -> *shareService - NewProgressService -> *progressService - NewAdminService -> *adminService - NewAdminServiceWithLogger -> *adminService - NewAuthService -> *authService - NewNoteService -> *noteService - NewFavService -> *favService - NewMediaService -> *mediaService - NewMediaServiceWithPodcastBrowser -> *mediaService Callers continue to work unchanged because Go allows assigning a concrete type to an interface variable. All tests pass with -race -cover. --- internal/scanner/scanner.go | 4 ++-- internal/service/admin.go | 4 ++-- internal/service/auth.go | 2 +- internal/service/browse.go | 4 ++-- internal/service/fav.go | 2 +- internal/service/media.go | 4 ++-- internal/service/note.go | 2 +- internal/service/progress.go | 2 +- internal/service/share.go | 2 +- internal/service/streamer.go | 2 +- internal/service/tag.go | 2 +- internal/service/write.go | 2 +- 12 files changed, 16 insertions(+), 16 deletions(-) diff --git a/internal/scanner/scanner.go b/internal/scanner/scanner.go index d1e50ba..15a4949 100644 --- a/internal/scanner/scanner.go +++ b/internal/scanner/scanner.go @@ -38,12 +38,12 @@ type FSScanner struct { } // NewFSScanner creates a filesystem scanner with injected dependencies. -func NewFSScanner(store repository.ScannerStore, prober probe.Prober, thumbGen thumb.Generator, clk clock.Clock, mediaRoot string) Scanner { +func NewFSScanner(store repository.ScannerStore, prober probe.Prober, thumbGen thumb.Generator, clk clock.Clock, mediaRoot string) *FSScanner { return NewFSScannerWithLogger(store, prober, thumbGen, clk, mediaRoot, slog.Default()) } // NewFSScannerWithLogger creates a filesystem scanner with an injected logger. -func NewFSScannerWithLogger(store repository.ScannerStore, prober probe.Prober, thumbGen thumb.Generator, clk clock.Clock, mediaRoot string, logger *slog.Logger) Scanner { +func NewFSScannerWithLogger(store repository.ScannerStore, prober probe.Prober, thumbGen thumb.Generator, clk clock.Clock, mediaRoot string, logger *slog.Logger) *FSScanner { if logger == nil { logger = slog.Default() } diff --git a/internal/service/admin.go b/internal/service/admin.go index 11406b8..1b1a352 100644 --- a/internal/service/admin.go +++ b/internal/service/admin.go @@ -21,12 +21,12 @@ type adminService struct { } // NewAdminService creates a concrete AdminService. -func NewAdminService(store repository.AdminServiceStore, clk clock.Clock, hasher auth.Hasher, sc scanner.Scanner, mediaRoot string, appCtx context.Context) AdminService { +func NewAdminService(store repository.AdminServiceStore, clk clock.Clock, hasher auth.Hasher, sc scanner.Scanner, mediaRoot string, appCtx context.Context) *adminService { return NewAdminServiceWithLogger(store, clk, hasher, sc, mediaRoot, appCtx, slog.Default()) } // NewAdminServiceWithLogger creates a concrete AdminService with an injected logger. -func NewAdminServiceWithLogger(store repository.AdminServiceStore, clk clock.Clock, hasher auth.Hasher, sc scanner.Scanner, mediaRoot string, appCtx context.Context, logger *slog.Logger) AdminService { +func NewAdminServiceWithLogger(store repository.AdminServiceStore, clk clock.Clock, hasher auth.Hasher, sc scanner.Scanner, mediaRoot string, appCtx context.Context, logger *slog.Logger) *adminService { return &adminService{ trashService: NewTrashService(store), scanService: NewScanService(appCtx, sc, mediaRoot, clk, logger), diff --git a/internal/service/auth.go b/internal/service/auth.go index b5f2720..56210b2 100644 --- a/internal/service/auth.go +++ b/internal/service/auth.go @@ -19,7 +19,7 @@ type authService struct { } // NewAuthService creates a concrete AuthService. -func NewAuthService(store repository.AuthServiceStore, clk clock.Clock, hasher auth.Hasher, sm auth.SessionManager) AuthService { +func NewAuthService(store repository.AuthServiceStore, clk clock.Clock, hasher auth.Hasher, sm auth.SessionManager) *authService { return &authService{ store: store, clock: clk, diff --git a/internal/service/browse.go b/internal/service/browse.go index 4f70717..6308e1a 100644 --- a/internal/service/browse.go +++ b/internal/service/browse.go @@ -36,7 +36,7 @@ type podcastBrowseService struct { } // NewPodcastBrowseService creates a PodcastBrowser backed by a PodcastRepo. -func NewPodcastBrowseService(store repository.PodcastRepo, mediaRoot string) PodcastBrowser { +func NewPodcastBrowseService(store repository.PodcastRepo, mediaRoot string) *podcastBrowseService { return &podcastBrowseService{store: store, mediaRoot: mediaRoot} } @@ -77,7 +77,7 @@ func (p *podcastBrowseService) AugmentBrowseSet(ctx context.Context, result *Bro } // NewBrowseService creates a BrowseService. -func NewBrowseService(store repository.BrowseServiceStore, clk clock.Clock, mediaRoot string, helper *accessHelper, browser PodcastBrowser) MediaBrowseService { +func NewBrowseService(store repository.BrowseServiceStore, clk clock.Clock, mediaRoot string, helper *accessHelper, browser PodcastBrowser) *browseService { return &browseService{ store: store, clock: clk, diff --git a/internal/service/fav.go b/internal/service/fav.go index 57dcb73..e8b8ab9 100644 --- a/internal/service/fav.go +++ b/internal/service/fav.go @@ -13,7 +13,7 @@ type favService struct { } // NewFavService creates a FavService. -func NewFavService(store repository.FavoriteServiceStore, helper *accessHelper) MediaFavoriteService { +func NewFavService(store repository.FavoriteServiceStore, helper *accessHelper) *favService { return &favService{ store: store, helper: helper, diff --git a/internal/service/media.go b/internal/service/media.go index 4fea78c..38c670f 100644 --- a/internal/service/media.go +++ b/internal/service/media.go @@ -29,12 +29,12 @@ type mediaService struct { } // NewMediaService creates a concrete MediaService by wiring role-focused sub-services. -func NewMediaService(store repository.MediaServiceStore, clk clock.Clock, mediaRoot string, thumbGen thumb.Generator, prober probe.Prober) MediaService { +func NewMediaService(store repository.MediaServiceStore, clk clock.Clock, mediaRoot string, thumbGen thumb.Generator, prober probe.Prober) *mediaService { return NewMediaServiceWithPodcastBrowser(store, clk, mediaRoot, thumbGen, prober, nil) } // NewMediaServiceWithPodcastBrowser creates a MediaService with an optional PodcastBrowser. -func NewMediaServiceWithPodcastBrowser(store repository.MediaServiceStore, clk clock.Clock, mediaRoot string, thumbGen thumb.Generator, prober probe.Prober, browser PodcastBrowser) MediaService { +func NewMediaServiceWithPodcastBrowser(store repository.MediaServiceStore, clk clock.Clock, mediaRoot string, thumbGen thumb.Generator, prober probe.Prober, browser PodcastBrowser) *mediaService { helper := &accessHelper{store: store} return &mediaService{ MediaBrowseService: NewBrowseService(store, clk, mediaRoot, helper, browser), diff --git a/internal/service/note.go b/internal/service/note.go index da7f923..56409d6 100644 --- a/internal/service/note.go +++ b/internal/service/note.go @@ -16,7 +16,7 @@ type noteService struct { } // NewNoteService creates a NoteService. -func NewNoteService(store repository.NoteServiceStore, clk clock.Clock, helper *accessHelper) MediaNoteService { +func NewNoteService(store repository.NoteServiceStore, clk clock.Clock, helper *accessHelper) *noteService { return ¬eService{ store: store, clock: clk, diff --git a/internal/service/progress.go b/internal/service/progress.go index 376ebb7..ef248cf 100644 --- a/internal/service/progress.go +++ b/internal/service/progress.go @@ -17,7 +17,7 @@ type progressService struct { } // NewProgressService creates a concrete ProgressService. -func NewProgressService(store repository.ProgressServiceStore, clk clock.Clock) ProgressService { +func NewProgressService(store repository.ProgressServiceStore, clk clock.Clock) *progressService { return &progressService{ store: store, clock: clk, diff --git a/internal/service/share.go b/internal/service/share.go index 9032f8c..9552031 100644 --- a/internal/service/share.go +++ b/internal/service/share.go @@ -22,7 +22,7 @@ type shareService struct { } // NewShareService creates a ShareService. -func NewShareService(store repository.ShareServiceStore, clk clock.Clock, helper *accessHelper) MediaShareService { +func NewShareService(store repository.ShareServiceStore, clk clock.Clock, helper *accessHelper) *shareService { return &shareService{ store: store, clock: clk, diff --git a/internal/service/streamer.go b/internal/service/streamer.go index e04293e..a0c09b0 100644 --- a/internal/service/streamer.go +++ b/internal/service/streamer.go @@ -16,7 +16,7 @@ type mediaStreamer struct { } // NewMediaStreamer creates the default service for preparing media files for HTTP streaming. -func NewMediaStreamer(remuxer probe.Remuxer) MediaStreamer { +func NewMediaStreamer(remuxer probe.Remuxer) *mediaStreamer { return &mediaStreamer{remuxer: remuxer} } diff --git a/internal/service/tag.go b/internal/service/tag.go index d08c387..88e19b6 100644 --- a/internal/service/tag.go +++ b/internal/service/tag.go @@ -16,7 +16,7 @@ type tagService struct { } // NewTagService creates a TagService. -func NewTagService(store repository.TagServiceStore, helper *accessHelper) MediaTagService { +func NewTagService(store repository.TagServiceStore, helper *accessHelper) *tagService { return &tagService{ store: store, helper: helper, diff --git a/internal/service/write.go b/internal/service/write.go index 8508951..f2f5080 100644 --- a/internal/service/write.go +++ b/internal/service/write.go @@ -29,7 +29,7 @@ type writeService struct { } // NewWriteService creates a WriteService. -func NewWriteService(store repository.WriteServiceStore, clk clock.Clock, mediaRoot string, thumbGen thumb.Generator, prober probe.Prober, helper *accessHelper) MediaWriteService { +func NewWriteService(store repository.WriteServiceStore, clk clock.Clock, mediaRoot string, thumbGen thumb.Generator, prober probe.Prober, helper *accessHelper) *writeService { return &writeService{ store: store, clock: clk, -- cgit v1.2.3