From b7f813650296d2c426b84a7a9f46b63e6b8abf47 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Thu, 30 Apr 2026 20:23:07 -0400 Subject: [PATCH] fix(server): wire real Lidarr clientFn for requests + quarantine services Both lidarrrequests.Approve and lidarrquarantine.DeleteViaLidarr need a working client factory; the previous nil clientFn made them always return ErrLidarrDisabled even when /admin/integrations had a valid Lidarr config saved. Per-call factory re-reads config so admin saves take effect without restart, matching the Service contract. --- internal/server/server.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/internal/server/server.go b/internal/server/server.go index f491cbe7..a55eba19 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -17,6 +17,7 @@ import ( "git.fabledsword.com/bvandeusen/minstrel/internal/auth" "git.fabledsword.com/bvandeusen/minstrel/internal/config" "git.fabledsword.com/bvandeusen/minstrel/internal/library" + "git.fabledsword.com/bvandeusen/minstrel/internal/lidarr" "git.fabledsword.com/bvandeusen/minstrel/internal/lidarrconfig" "git.fabledsword.com/bvandeusen/minstrel/internal/lidarrquarantine" "git.fabledsword.com/bvandeusen/minstrel/internal/lidarrrequests" @@ -59,8 +60,19 @@ func (s *Server) Router() http.Handler { s.EventsCfg.SkipMaxDurationPlayedMs, ) lidarrCfg := lidarrconfig.New(s.Pool) - lidarrReqs := lidarrrequests.NewService(s.Pool, lidarrCfg, nil, nil) - lidarrQuar := lidarrquarantine.NewService(s.Pool, lidarrCfg, nil) + // Per-call client factory: re-reads config so an admin save in + // /admin/integrations takes effect immediately without restart. + // Returns nil when Lidarr is disabled, which the Service-layer + // methods translate to ErrLidarrDisabled. + lidarrClientFn := func() *lidarr.Client { + cfg, err := lidarrCfg.Get(context.Background()) + if err != nil || !cfg.Enabled || cfg.BaseURL == "" || cfg.APIKey == "" { + return nil + } + return lidarr.NewClient(cfg.BaseURL, cfg.APIKey) + } + lidarrReqs := lidarrrequests.NewService(s.Pool, lidarrCfg, lidarrClientFn, nil) + lidarrQuar := lidarrquarantine.NewService(s.Pool, lidarrCfg, lidarrClientFn) api.Mount(r, s.Pool, s.Logger, writer, s.RecommendationCfg, lidarrCfg, lidarrReqs, lidarrQuar) r.Route("/api/admin", func(admin chi.Router) { admin.Use(auth.RequireUser(s.Pool))