package service import ( "context" "database/sql" "errors" pb "datarush/pkg/api/achievements" "google.golang.org/protobuf/types/known/emptypb" ) type AchievementRepository interface { CreateAchievement(ctx context.Context, achievement *pb.Achievement) (*pb.Achievement, error) GetAchievement(ctx context.Context, id string) (*pb.Achievement, error) EditAchievement(ctx context.Context, achievement *pb.Achievement) (*pb.Achievement, error) DeleteAchievement(ctx context.Context, id string) error ListAchievements(ctx context.Context) ([]*pb.Achievement, error) GetUserAchievements(ctx context.Context, userID string) ([]*pb.AchievementUser, error) } type AchievementService struct { repo AchievementRepository } func NewAchievementService(repo AchievementRepository) *AchievementService { return &AchievementService{repo: repo} } func (s *AchievementService) CreateAchievement(ctx context.Context, req *pb.Achievement) (*pb.Achievement, error) { return s.repo.CreateAchievement(ctx, req) } func (s *AchievementService) GetAchievement(ctx context.Context, req *pb.GetAchievementRequest) (*pb.Achievement, error) { achievement, err := s.repo.GetAchievement(ctx, req.Id) if err != nil { if err == sql.ErrNoRows { return nil, errors.New("achievement not found") } return nil, err } return achievement, nil } func (s *AchievementService) EditAchievement(ctx context.Context, req *pb.Achievement) (*pb.Achievement, error) { _, err := s.repo.GetAchievement(ctx, req.Id) if err != nil { if err == sql.ErrNoRows { return nil, errors.New("achievement not found") } return nil, err } return s.repo.EditAchievement(ctx, req) } func (s *AchievementService) DeleteAchievement(ctx context.Context, req *pb.DeleteAchievementRequest) (*emptypb.Empty, error) { err := s.repo.DeleteAchievement(ctx, req.AchievementId) if err != nil { return nil, err } return &emptypb.Empty{}, nil } func (s *AchievementService) ListAchievements(ctx context.Context, req *emptypb.Empty) (*pb.ListAchievementsResponse, error) { achievements, err := s.repo.ListAchievements(ctx) if err != nil { return nil, err } return &pb.ListAchievementsResponse{Achievements: achievements}, nil } func (s *AchievementService) GetUserAchievements(ctx context.Context, req *pb.GetUserAchievementsRequest) (*pb.GetUserAchievementsResponse, error) { userAchievements, err := s.repo.GetUserAchievements(ctx, req.UserId) if err != nil { return nil, err } return &pb.GetUserAchievementsResponse{UserAchievements: userAchievements}, nil }