package grpc_client import ( "context" "fmt" "google.golang.org/grpc" pb "datarush/pkg/api/achievements" ) type AchievementsClient struct { client pb.AchievementsServiceClient conn *grpc.ClientConn } func NewAchievementsClient(ctx context.Context, address string, factory *ClientFactory) (*AchievementsClient, error) { conn, err := factory.GetConnection(ctx, address) if err != nil { return nil, fmt.Errorf("failed to create achievements client: %w", err) } return &AchievementsClient{client: pb.NewAchievementsServiceClient(conn), conn: conn}, nil } func (c *AchievementsClient) GetAchievement(ctx context.Context, achievementID string) (*pb.Achievement, error) { req := &pb.GetAchievementRequest{Id: achievementID} resp, err := c.client.GetAchievement(ctx, req) if err != nil { return nil, fmt.Errorf("get achievement failed: %w", err) } return resp, nil } func (c *AchievementsClient) ListAchievements(ctx context.Context) ([]*pb.Achievement, error) { resp, err := c.client.ListAchievements(ctx, nil) if err != nil { return nil, fmt.Errorf("list achievements failed: %w", err) } return resp.Achievements, nil } func (c *AchievementsClient) GetUserAchievements(ctx context.Context, userID string) ([]*pb.AchievementUser, error) { req := &pb.GetUserAchievementsRequest{UserId: userID} resp, err := c.client.GetUserAchievements(ctx, req) if err != nil { return nil, fmt.Errorf("get user achievements failed: %w", err) } return resp.UserAchievements, nil }