Files
2025-12-19 23:12:22 +04:00

79 lines
2.5 KiB
Go

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
}