79 lines
2.5 KiB
Go
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
|
|
}
|