feat: implement achievements
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user