From ef75b9bfba64c314281dca6db5c26de90fec318c Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 9 May 2026 21:42:53 +0200 Subject: [PATCH] Share single torrent client across all services, eliminate triple qBittorrent login on startup --- cmd/music-agregator/main.go | 19 +++++++++++-------- internal/server.go | 5 +++-- internal/service.go | 8 +------- internal/torrent/server.go | 11 ++--------- internal/torrent/service.go | 22 ++-------------------- 5 files changed, 19 insertions(+), 46 deletions(-) diff --git a/cmd/music-agregator/main.go b/cmd/music-agregator/main.go index 76ed4b5..e6b8ce7 100644 --- a/cmd/music-agregator/main.go +++ b/cmd/music-agregator/main.go @@ -82,12 +82,12 @@ type riverSetup struct { cacheRefreshWorker *indexer.CacheRefreshWorker } -func setupRiver(ctx context.Context, cfg config.Config, db *database.DB) *riverSetup { +func setupRiver(ctx context.Context, cfg config.Config, db *database.DB, torrentClient torrent.TorrentClient) *riverSetup { cacheWorker := &indexer.CacheRefreshWorker{} pollWorker := &workers.PollDownloadWorker{ Downloads: database.NewDownloadRepository(db.Pool), DownloadFiles: database.NewDownloadFileRepository(db.Pool), - TorrentClient: torrent.MustNewTorrentClient(cfg), + TorrentClient: torrentClient, } riverWorkers := river.NewWorkers() @@ -155,9 +155,15 @@ func serveGrpc(config config.Config) { ctx := context.Background() db := setupDatabase(ctx, config) defer db.Close() - rs := setupRiver(ctx, config, db) - musiscAgregatorSeerver, err := internal.NewMusicAgregatorServer(config, rs.client, db) + torrentClient, err := torrent.NewTorrentClient(config) + if err != nil { + log.Fatal().Err(err).Msg("failed to create torrent client") + } + + rs := setupRiver(ctx, config, db, torrentClient) + + musiscAgregatorSeerver, err := internal.NewMusicAgregatorServer(config, rs.client, torrentClient, db) if err != nil { log.Fatal().Err(err).Msg("failed to create MusicAgregatorServer") } @@ -165,10 +171,7 @@ func serveGrpc(config config.Config) { if err != nil { log.Fatal().Err(err).Msg("failed to create IndexerServer") } - torrentServer, err := torrent.NewTorrentServer(config) - if err != nil { - log.Fatal().Err(err).Msg("failed to create TorrentServer") - } + torrentServer := torrent.NewTorrentServer(torrentClient) metadataServer, err := metadata.NewMetadataServer(config) if err != nil { log.Fatal().Err(err).Msg("failed to create MetadataServer") diff --git a/internal/server.go b/internal/server.go index 06debb1..b6065a4 100644 --- a/internal/server.go +++ b/internal/server.go @@ -11,6 +11,7 @@ import ( pb "homelab.lan/music-agregator/gen/music_agregator/v1" "homelab.lan/music-agregator/internal/config" "homelab.lan/music-agregator/internal/database" + "homelab.lan/music-agregator/internal/torrent" ) type MusicAgregatorServer struct { @@ -18,8 +19,8 @@ type MusicAgregatorServer struct { pb.UnimplementedMusicAgregatorServiceServer } -func NewMusicAgregatorServer(cfg config.Config, riverClient *river.Client[pgx.Tx], db *database.DB) (*MusicAgregatorServer, error) { - service, err := NewMusicAgregatorService(cfg, riverClient, db) +func NewMusicAgregatorServer(cfg config.Config, riverClient *river.Client[pgx.Tx], torrentClient torrent.TorrentClient, db *database.DB) (*MusicAgregatorServer, error) { + service, err := NewMusicAgregatorService(cfg, riverClient, torrentClient, db) if err != nil { log.Err(err).Msg("failed to create MusicAgregatorService") return nil, err diff --git a/internal/service.go b/internal/service.go index 3fb4c9a..6f229b7 100644 --- a/internal/service.go +++ b/internal/service.go @@ -44,7 +44,7 @@ type MusicAgregatorService struct { downloadFiles *database.DownloadFileRepository } -func NewMusicAgregatorService(cfg config.Config, riverClient *river.Client[pgx.Tx], db *database.DB) (*MusicAgregatorService, error) { +func NewMusicAgregatorService(cfg config.Config, riverClient *river.Client[pgx.Tx], torrentClient torrent.TorrentClient, db *database.DB) (*MusicAgregatorService, error) { idx, err := indexer.NewIndexerService(cfg, riverClient, nil) if err != nil { log.Err(err).Msg("failed to create IndexerService") @@ -63,12 +63,6 @@ func NewMusicAgregatorService(cfg config.Config, riverClient *river.Client[pgx.T return nil, err } - torrentClient, err := torrent.NewTorrentClient(cfg) - if err != nil { - log.Err(err).Msg("failed to create torrent client") - return nil, err - } - return &MusicAgregatorService{ config: cfg, metadata: metadata.NewMetadataService(metadataClient, db), diff --git a/internal/torrent/server.go b/internal/torrent/server.go index f424b7d..0170b6c 100644 --- a/internal/torrent/server.go +++ b/internal/torrent/server.go @@ -7,7 +7,6 @@ import ( "google.golang.org/grpc" pb "homelab.lan/music-agregator/gen/music_agregator/torrent/v1" - "homelab.lan/music-agregator/internal/config" ) type TorrentServer struct { @@ -15,14 +14,8 @@ type TorrentServer struct { pb.UnimplementedTorrentServiceServer } -func NewTorrentServer(cfg config.Config) (*TorrentServer, error) { - service, err := NewTorrentService(cfg) - if err != nil { - log.Err(err).Msg("failed to initialize TorrentService") - return nil, err - } - - return &TorrentServer{service: service}, nil +func NewTorrentServer(client TorrentClient) *TorrentServer { + return &TorrentServer{service: NewTorrentService(client)} } func (server *TorrentServer) List(ctx context.Context, req *pb.ListRequest) (*pb.ListResponse, error) { diff --git a/internal/torrent/service.go b/internal/torrent/service.go index bfdabdd..6d87266 100644 --- a/internal/torrent/service.go +++ b/internal/torrent/service.go @@ -11,7 +11,6 @@ import ( "github.com/rs/zerolog/log" pb "homelab.lan/music-agregator/gen/music_agregator/torrent/v1" - "homelab.lan/music-agregator/internal/config" ) type TorrentService struct { @@ -19,27 +18,10 @@ type TorrentService struct { token string } -func NewTorrentService(cfg config.Config) (*TorrentService, error) { - var client TorrentClient - - switch cfg.Torrent.ClientType { - case config.TorrentClientQbittorrent: - client = NewQbittorrentClient(cfg.Torrent.Url) - default: - return nil, fmt.Errorf("unknown torrent client type: %s", cfg.Torrent.ClientType) - } - - token, err := client.Login(cfg.Torrent.Username, cfg.Torrent.Password) - if err != nil { - return nil, fmt.Errorf("torrent client login failed: %w", err) - } - - log.Info().Str("client", string(cfg.Torrent.ClientType)).Msg("torrent client connected") - +func NewTorrentService(client TorrentClient) *TorrentService { return &TorrentService{ client: client, - token: token, - }, nil + } } func (service *TorrentService) List(req *pb.ListRequest) (*pb.ListResponse, error) {