package server import ( "context" "fmt" "github.com/google/uuid" pb "gitlab.michelsen.id/phillmichelsen/tessera/pkg/pb/data_service" "gitlab.michelsen.id/phillmichelsen/tessera/services/data_service/internal/domain" "gitlab.michelsen.id/phillmichelsen/tessera/services/data_service/internal/manager" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) type GRPCControlServer struct { pb.UnimplementedDataServiceControlServer manager *manager.Manager } func NewGRPCControlServer(m *manager.Manager) *GRPCControlServer { return &GRPCControlServer{manager: m} } func (s *GRPCControlServer) StartStream(_ context.Context, _ *pb.StartStreamRequest) (*pb.StartStreamResponse, error) { streamID, err := s.manager.StartStream() if err != nil { return nil, fmt.Errorf("failed to start stream: %w", err) } return &pb.StartStreamResponse{StreamUuid: streamID.String()}, nil } func (s *GRPCControlServer) ConfigureStream(_ context.Context, req *pb.ConfigureStreamRequest) (*pb.ConfigureStreamResponse, error) { streamID, err := uuid.Parse(req.StreamUuid) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "invalid stream_uuid %q: %v", req.StreamUuid, err) } var ids []domain.Identifier for _, in := range req.Identifiers { id, e := domain.ParseIdentifier(in.Key) if e != nil { return nil, status.Errorf(codes.InvalidArgument, "invalid identifier %q: %v", in.Key, e) } ids = append(ids, id) } if err := s.manager.ConfigureStream(streamID, ids); err != nil { return nil, status.Errorf(codes.InvalidArgument, "configure failed: %v", err) } return &pb.ConfigureStreamResponse{}, nil } func (s *GRPCControlServer) StopStream(_ context.Context, req *pb.StopStreamRequest) (*pb.StopStreamResponse, error) { streamID, err := uuid.Parse(req.StreamUuid) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "invalid stream_uuid %q: %v", req.StreamUuid, err) } if err := s.manager.StopStream(streamID); err != nil { return nil, status.Errorf(codes.Internal, "failed to stop stream: %v", err) } return &pb.StopStreamResponse{}, nil }