package internal import ( "context" "github.com/jackc/pgx/v5" "github.com/riverqueue/river" "github.com/rs/zerolog/log" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" 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 { service *MusicAgregatorService pb.UnimplementedMusicAgregatorServiceServer } func NewMusicAgregatorServer(cfg config.Config, riverClient *river.Client[pgx.Tx], torrentClient torrent.TorrentClient, pathMapper *torrent.PathMapper, db *database.DB) (*MusicAgregatorServer, error) { service, err := NewMusicAgregatorService(cfg, riverClient, torrentClient, pathMapper, db) if err != nil { log.Err(err).Msg("failed to create MusicAgregatorService") return nil, err } return &MusicAgregatorServer{ service: service, }, nil } func NewMusicAgregatorServerWithService(service *MusicAgregatorService) *MusicAgregatorServer { return &MusicAgregatorServer{service: service} } func (s *MusicAgregatorServer) GetArtists(ctx context.Context, req *pb.GetArtistsRequest) (*pb.GetArtistsResponse, error) { return s.service.GetArtists(ctx, req) } func (s *MusicAgregatorServer) GetAlbum(ctx context.Context, req *pb.GetAlbumRequest) (*pb.GetAlbumResponse, error) { return s.service.GetAlbum(ctx, req) } func (s *MusicAgregatorServer) MonitorAlbum(ctx context.Context, req *pb.MonitorAlbumRequest) (*pb.MonitorAlbumResponse, error) { return s.service.MonitorAlbum(ctx, req) } func (s *MusicAgregatorServer) MonitorAlbumStream(stream pb.MusicAgregatorService_MonitorAlbumStreamServer) error { msg, err := stream.Recv() if err != nil { return err } startReq := msg.GetStart() if startReq == nil { return status.Error(codes.InvalidArgument, "first message must be StartMonitorRequest") } ctx, cancel := context.WithCancel(stream.Context()) defer cancel() workflow := newMonitorWorkflow(stream, startReq, s.service, cancel) if startReq.Mode == pb.InteractionMode_INTERACTION_MODE_MANUAL { go workflow.receiveDecisions(ctx) } return workflow.run(ctx) } func (s *MusicAgregatorServer) AnalyzeAlbumRelease(ctx context.Context, req *pb.AnalyzeAlbumReleaseRequest) (*pb.AnalyzeAlbumReleaseResponse, error) { return s.service.AnalyzeAlbumRelease(ctx, req) } func (s *MusicAgregatorServer) SearchArtists(ctx context.Context, req *pb.SearchArtistsRequest) (*pb.SearchArtistsResponse, error) { return s.service.SearchArtists(ctx, req) } func (s *MusicAgregatorServer) GetArtistAlbums(ctx context.Context, req *pb.GetArtistAlbumsRequest) (*pb.GetArtistAlbumsResponse, error) { return s.service.GetArtistAlbums(ctx, req) } func (s *MusicAgregatorServer) Register(server *grpc.Server) { pb.RegisterMusicAgregatorServiceServer(server, s) }