This commit is contained in:
2026-10-03 01:09:06 +07:00
parent fc2586f72a
commit 3f7731411b
7 changed files with 169 additions and 64 deletions
+23
View File
@@ -0,0 +1,23 @@
package app
import (
"errors"
"evening_detective_server/internal/services/answer_service"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
func answerErrorStatus(err error, internalMessage string) error {
switch {
case errors.Is(err, answer_service.ErrTeamNotFound), errors.Is(err, answer_service.ErrGameNotFound):
return status.Error(codes.NotFound, err.Error())
case errors.Is(err, answer_service.ErrQuestionNotFound), errors.Is(err, answer_service.ErrOfflineAnswers):
return status.Error(codes.InvalidArgument, err.Error())
case errors.Is(err, answer_service.ErrGameFinished), errors.Is(err, answer_service.ErrGameNotStarted), errors.Is(err, answer_service.ErrGameNotFinished):
return status.Error(codes.FailedPrecondition, err.Error())
default:
return status.Error(codes.Internal, internalMessage)
}
}
+3 -9
View File
@@ -17,9 +17,7 @@ func (s *server) GetTeamAnswers(ctx context.Context, req *proto.GetTeamAnswersRe
req.Password,
)
if err != nil {
return &proto.GetTeamAnswersRsp{
Error: err.Error(),
}, nil
return nil, answerErrorStatus(err, "не удалось получить ответы команды")
}
return &proto.GetTeamAnswersRsp{
@@ -35,9 +33,7 @@ func (s *server) SubmitTeamAnswers(ctx context.Context, req *proto.SubmitTeamAns
convertAnswers(req.Answers),
)
if err != nil {
return &proto.SubmitTeamAnswersRsp{
Error: err.Error(),
}, nil
return nil, answerErrorStatus(err, "не удалось сохранить ответы команды")
}
return &proto.SubmitTeamAnswersRsp{}, nil
@@ -65,9 +61,7 @@ func (s *server) SetTeamAnswerScore(ctx context.Context, req *proto.SetTeamAnswe
score,
)
if err != nil {
return &proto.SetTeamAnswerScoreRsp{
Error: err.Error(),
}, nil
return nil, answerErrorStatus(err, "не удалось сохранить оценку ответа")
}
return &proto.SetTeamAnswerScoreRsp{}, nil
+51
View File
@@ -0,0 +1,51 @@
package app
import (
"errors"
"testing"
"evening_detective_server/internal/services/answer_service"
"evening_detective_server/internal/services/game_service"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
func TestGameErrorStatus(t *testing.T) {
for _, tc := range []struct {
name, message string
err error
code codes.Code
}{
{"not found", "Игра не найдена", game_service.ErrGameNotFound, codes.NotFound},
{"invalid format", "Формат игры должен быть online или offline", game_service.ErrInvalidGameFormat, codes.InvalidArgument},
{"internal", "не удалось получить игру", errors.New("private database detail"), codes.Internal},
} {
t.Run(tc.name, func(t *testing.T) {
err := gameErrorStatus(tc.err, "не удалось получить игру")
if status.Code(err) != tc.code || status.Convert(err).Message() != tc.message {
t.Fatalf("status=%v, want %v %q", err, tc.code, tc.message)
}
})
}
}
func TestAnswerErrorStatus(t *testing.T) {
for _, tc := range []struct {
name, message string
err error
code codes.Code
}{
{"team not found", "Команда не найдена", answer_service.ErrTeamNotFound, codes.NotFound},
{"question not found", "Вопрос не найден", answer_service.ErrQuestionNotFound, codes.InvalidArgument},
{"game not started", "Игра не начата, отвечать на вопросы нельзя", answer_service.ErrGameNotStarted, codes.FailedPrecondition},
{"internal", "не удалось получить ответы игры", errors.New("private database detail"), codes.Internal},
} {
t.Run(tc.name, func(t *testing.T) {
err := answerErrorStatus(tc.err, "не удалось получить ответы игры")
if status.Code(err) != tc.code || status.Convert(err).Message() != tc.message {
t.Fatalf("status=%v, want %v %q", err, tc.code, tc.message)
}
})
}
}
+22
View File
@@ -0,0 +1,22 @@
package app
import (
"errors"
"evening_detective_server/internal/services/game_service"
"evening_detective_server/internal/services/scenarios_service"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
func gameErrorStatus(err error, internalMessage string) error {
switch {
case errors.Is(err, game_service.ErrGameNotFound), errors.Is(err, scenarios_service.ErrScenarioNotFound):
return status.Error(codes.NotFound, err.Error())
case errors.Is(err, game_service.ErrInvalidGameFormat):
return status.Error(codes.InvalidArgument, err.Error())
default:
return status.Error(codes.Internal, internalMessage)
}
}
+12 -36
View File
@@ -40,9 +40,7 @@ func (s *server) AddGame(ctx context.Context, req *proto.AddGameReq) (*proto.Add
req.Format,
)
if err != nil {
return &proto.AddGameRsp{
Error: err.Error(),
}, nil
return nil, gameErrorStatus(err, "не удалось создать игру")
}
return &proto.AddGameRsp{
@@ -64,9 +62,7 @@ func (s *server) DeleteGame(ctx context.Context, req *proto.DeleteGameReq) (*pro
int(req.ID),
)
if err != nil {
return &proto.DeleteGameRsp{
Error: err.Error(),
}, nil
return nil, gameErrorStatus(err, "не удалось удалить игру")
}
return &proto.DeleteGameRsp{}, nil
@@ -83,9 +79,7 @@ func (s *server) GetGame(ctx context.Context, req *proto.GetGameReq) (*proto.Get
game, err := s.gameService.GetFullGame(ctx, int(req.ID))
if err != nil {
return &proto.GetGameRsp{
Error: err.Error(),
}, nil
return nil, gameErrorStatus(err, "не удалось получить игру")
}
return &proto.GetGameRsp{
@@ -104,9 +98,7 @@ func (s *server) GetGameAnswers(ctx context.Context, req *proto.GetGameAnswersRe
gameAnswers, err := s.answerService.GetGameAnswers(ctx, int(req.GameID))
if err != nil {
return &proto.GetGameAnswersRsp{
Error: err.Error(),
}, nil
return nil, answerErrorStatus(err, "не удалось получить ответы игры")
}
return &proto.GetGameAnswersRsp{
@@ -126,9 +118,7 @@ func (s *server) GetGameResults(ctx context.Context, req *proto.GetGameResultsRe
results, err := s.answerService.GetGameResults(ctx, int(req.GameID))
if err != nil {
return &proto.GetGameResultsRsp{
Error: err.Error(),
}, nil
return nil, answerErrorStatus(err, "не удалось получить результаты игры")
}
return &proto.GetGameResultsRsp{
@@ -148,9 +138,7 @@ func (s *server) GetGames(ctx context.Context, req *proto.GetGamesReq) (*proto.G
games, err := s.gameService.GetGames(ctx)
if err != nil {
return &proto.GetGamesRsp{
Error: err.Error(),
}, nil
return nil, gameErrorStatus(err, "не удалось получить игры")
}
return &proto.GetGamesRsp{
@@ -182,9 +170,7 @@ func (s *server) UpdateGame(ctx context.Context, req *proto.UpdateGameReq) (*pro
req.Format,
)
if err != nil {
return &proto.UpdateGameRsp{
Error: err.Error(),
}, nil
return nil, gameErrorStatus(err, "не удалось изменить игру")
}
return &proto.UpdateGameRsp{}, nil
@@ -201,9 +187,7 @@ func (s *server) StartGame(ctx context.Context, req *proto.StartGameReq) (*proto
err := s.gameService.StartGame(ctx, int(req.ID))
if err != nil {
return &proto.StartGameRsp{
Error: err.Error(),
}, nil
return nil, gameErrorStatus(err, "не удалось запустить игру")
}
return &proto.StartGameRsp{}, nil
@@ -220,9 +204,7 @@ func (s *server) PauseGame(ctx context.Context, req *proto.PauseGameReq) (*proto
err := s.gameService.PauseGame(ctx, int(req.ID))
if err != nil {
return &proto.PauseGameRsp{
Error: err.Error(),
}, nil
return nil, gameErrorStatus(err, "не удалось приостановить игру")
}
return &proto.PauseGameRsp{}, nil
@@ -239,9 +221,7 @@ func (s *server) PlayGame(ctx context.Context, req *proto.PlayGameReq) (*proto.P
err := s.gameService.PlayGame(ctx, int(req.ID))
if err != nil {
return &proto.PlayGameRsp{
Error: err.Error(),
}, nil
return nil, gameErrorStatus(err, "не удалось продолжить игру")
}
return &proto.PlayGameRsp{}, nil
@@ -258,9 +238,7 @@ func (s *server) FinishGame(ctx context.Context, req *proto.FinishGameReq) (*pro
err := s.gameService.FinishGame(ctx, int(req.ID))
if err != nil {
return &proto.FinishGameRsp{
Error: err.Error(),
}, nil
return nil, gameErrorStatus(err, "не удалось завершить игру")
}
return &proto.FinishGameRsp{}, nil
@@ -277,9 +255,7 @@ func (s *server) ResetGame(ctx context.Context, req *proto.ResetGameReq) (*proto
err := s.gameService.ResetGame(ctx, int(req.ID))
if err != nil {
return &proto.ResetGameRsp{
Error: err.Error(),
}, nil
return nil, gameErrorStatus(err, "не удалось сбросить игру")
}
return &proto.ResetGameRsp{}, nil