generated from VLADIMIR/template
fix
This commit is contained in:
@@ -36,7 +36,7 @@ func mapGameReviews(reviews []*game_review_service.Review) []*proto.GameReview {
|
||||
func (s *server) CreateGameReview(ctx context.Context, req *proto.CreateGameReviewReq) (*proto.CreateGameReviewRsp, error) {
|
||||
review, err := s.reviewService.Create(ctx, int(req.GameID), int(req.TeamID), req.Password, req.Rating, req.Text)
|
||||
if err != nil {
|
||||
return &proto.CreateGameReviewRsp{Error: err.Error()}, nil
|
||||
return nil, reviewErrorStatus(err, "не удалось создать отзыв")
|
||||
}
|
||||
return &proto.CreateGameReviewRsp{Review: mapGameReview(review)}, nil
|
||||
}
|
||||
@@ -44,7 +44,7 @@ func (s *server) CreateGameReview(ctx context.Context, req *proto.CreateGameRevi
|
||||
func (s *server) GetGameReviews(ctx context.Context, req *proto.GetGameReviewsReq) (*proto.GetGameReviewsRsp, error) {
|
||||
reviews, average, count, err := s.reviewService.List(ctx, int(req.GameID), false)
|
||||
if err != nil {
|
||||
return &proto.GetGameReviewsRsp{Error: err.Error()}, nil
|
||||
return nil, reviewErrorStatus(err, "не удалось получить отзывы игры")
|
||||
}
|
||||
return &proto.GetGameReviewsRsp{AverageRating: average, ReviewsCount: count, Reviews: mapGameReviews(reviews)}, nil
|
||||
}
|
||||
@@ -52,7 +52,7 @@ func (s *server) GetGameReviews(ctx context.Context, req *proto.GetGameReviewsRe
|
||||
func (s *server) GetScenarioReviews(ctx context.Context, req *proto.GetScenarioReviewsReq) (*proto.GetGameReviewsRsp, error) {
|
||||
reviews, average, count, err := s.reviewService.ListByScenario(ctx, int(req.ScenarioID))
|
||||
if err != nil {
|
||||
return &proto.GetGameReviewsRsp{Error: err.Error()}, nil
|
||||
return nil, reviewErrorStatus(err, "не удалось получить отзывы сценария")
|
||||
}
|
||||
return &proto.GetGameReviewsRsp{AverageRating: average, ReviewsCount: count, Reviews: mapGameReviews(reviews)}, nil
|
||||
}
|
||||
@@ -67,7 +67,7 @@ func (s *server) GetGameReviewsForModeration(ctx context.Context, req *proto.Get
|
||||
}
|
||||
reviews, average, count, err := s.reviewService.List(ctx, int(req.GameID), true)
|
||||
if err != nil {
|
||||
return &proto.GetGameReviewsRsp{Error: err.Error()}, nil
|
||||
return nil, reviewErrorStatus(err, "не удалось получить отзывы для модерации")
|
||||
}
|
||||
return &proto.GetGameReviewsRsp{AverageRating: average, ReviewsCount: count, Reviews: mapGameReviews(reviews)}, nil
|
||||
}
|
||||
@@ -82,7 +82,7 @@ func (s *server) GetReviewsForModeration(ctx context.Context, req *proto.GetRevi
|
||||
}
|
||||
reviews, err := s.reviewService.ListForModeration(ctx)
|
||||
if err != nil {
|
||||
return &proto.GetGameReviewsRsp{Error: err.Error()}, nil
|
||||
return nil, reviewErrorStatus(err, "не удалось получить отзывы для модерации")
|
||||
}
|
||||
return &proto.GetGameReviewsRsp{Reviews: mapGameReviews(reviews)}, nil
|
||||
}
|
||||
@@ -97,7 +97,7 @@ func (s *server) ModerateGameReview(ctx context.Context, req *proto.ModerateGame
|
||||
}
|
||||
review, err := s.reviewService.Moderate(ctx, int(req.ID), req.Status)
|
||||
if err != nil {
|
||||
return &proto.ModerateGameReviewRsp{Error: err.Error()}, nil
|
||||
return nil, reviewErrorStatus(err, "не удалось изменить статус отзыва")
|
||||
}
|
||||
return &proto.ModerateGameReviewRsp{Review: mapGameReview(review)}, nil
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"evening_detective_server/internal/services/game_review_service"
|
||||
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
func reviewErrorStatus(err error, internalMessage string) error {
|
||||
switch {
|
||||
case errors.Is(err, game_review_service.ErrTeamNotFound), errors.Is(err, game_review_service.ErrGameNotFound), errors.Is(err, game_review_service.ErrReviewNotFound):
|
||||
return status.Error(codes.NotFound, err.Error())
|
||||
case errors.Is(err, game_review_service.ErrInvalidReview), errors.Is(err, game_review_service.ErrInvalidStatus):
|
||||
return status.Error(codes.InvalidArgument, err.Error())
|
||||
case errors.Is(err, game_review_service.ErrGameNotFinished), errors.Is(err, game_review_service.ErrReviewExists):
|
||||
return status.Error(codes.FailedPrecondition, err.Error())
|
||||
default:
|
||||
return status.Error(codes.Internal, internalMessage)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"evening_detective_server/internal/services/game_review_service"
|
||||
"evening_detective_server/internal/services/ticket_service"
|
||||
"evening_detective_server/internal/services/users_service"
|
||||
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
func TestReviewErrorStatus(t *testing.T) {
|
||||
err := reviewErrorStatus(game_review_service.ErrInvalidReview, "review failed")
|
||||
if status.Code(err) != codes.InvalidArgument || status.Convert(err).Message() != game_review_service.ErrInvalidReview.Error() {
|
||||
t.Fatalf("status=%v", err)
|
||||
}
|
||||
err = reviewErrorStatus(errors.New("private database detail"), "review failed")
|
||||
if status.Code(err) != codes.Internal || status.Convert(err).Message() != "review failed" {
|
||||
t.Fatalf("internal status=%v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestTicketErrorStatus(t *testing.T) {
|
||||
err := ticketErrorStatus(ticket_service.ErrTicketUsed, "ticket failed")
|
||||
if status.Code(err) != codes.FailedPrecondition || status.Convert(err).Message() != ticket_service.ErrTicketUsed.Error() {
|
||||
t.Fatalf("status=%v", err)
|
||||
}
|
||||
err = ticketErrorStatus(errors.New("private database detail"), "ticket failed")
|
||||
if status.Code(err) != codes.Internal || status.Convert(err).Message() != "ticket failed" {
|
||||
t.Fatalf("internal status=%v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUserErrorStatusDoesNotExposeCredentials(t *testing.T) {
|
||||
err := userErrorStatus(users_service.ErrInvalidCredentials, "login failed")
|
||||
if status.Code(err) != codes.Unauthenticated || status.Convert(err).Message() != users_service.ErrInvalidCredentials.Error() {
|
||||
t.Fatalf("status=%v", err)
|
||||
}
|
||||
for _, secret := range []string{"password", "token", "private database detail"} {
|
||||
if strings.Contains(status.Convert(err).Message(), secret) {
|
||||
t.Fatalf("secret %q exposed", secret)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"evening_detective_server/internal/services/ticket_service"
|
||||
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
func ticketErrorStatus(err error, internalMessage string) error {
|
||||
switch {
|
||||
case errors.Is(err, ticket_service.ErrTicketNotFound):
|
||||
return status.Error(codes.NotFound, err.Error())
|
||||
case errors.Is(err, ticket_service.ErrInvalidTicketCount):
|
||||
return status.Error(codes.InvalidArgument, err.Error())
|
||||
case errors.Is(err, ticket_service.ErrTicketUsed), errors.Is(err, ticket_service.ErrGameFinished):
|
||||
return status.Error(codes.FailedPrecondition, err.Error())
|
||||
case errors.Is(err, ticket_service.ErrInvalidBaseURL):
|
||||
return status.Error(codes.FailedPrecondition, err.Error())
|
||||
default:
|
||||
return status.Error(codes.Internal, internalMessage)
|
||||
}
|
||||
}
|
||||
@@ -53,7 +53,7 @@ func (s *server) AcceptTicket(ctx context.Context, req *proto.AcceptTicketReq) (
|
||||
}
|
||||
page, err := s.ticketService.Accept(ctx, req.Token, claims.UserID)
|
||||
if err != nil {
|
||||
return &proto.AcceptTicketRsp{Error: err.Error()}, nil
|
||||
return nil, ticketErrorStatus(err, "не удалось принять билет")
|
||||
}
|
||||
result := &proto.TicketPage{ID: int32(page.ID), GameName: page.GameName, StartAt: timestamppb.New(page.StartAt), Status: page.Status, GameStatus: page.GameStatus}
|
||||
if page.Location != nil {
|
||||
@@ -82,7 +82,7 @@ func (s *server) IssueGameTickets(ctx context.Context, req *proto.IssueGameTicke
|
||||
|
||||
tickets, err := s.ticketService.Issue(ctx, int(req.GameID), int(req.Count))
|
||||
if err != nil {
|
||||
return &proto.IssueGameTicketsRsp{Error: err.Error()}, nil
|
||||
return nil, ticketErrorStatus(err, "не удалось выпустить билеты")
|
||||
}
|
||||
|
||||
result := make([]*proto.Ticket, 0, len(tickets))
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"evening_detective_server/internal/repos/users_repo"
|
||||
"evening_detective_server/internal/services/users_service"
|
||||
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
func userErrorStatus(err error, internalMessage string) error {
|
||||
switch {
|
||||
case errors.Is(err, users_service.ErrUserNotFound):
|
||||
return status.Error(codes.NotFound, err.Error())
|
||||
case errors.Is(err, users_service.ErrTermsNotAccepted), errors.Is(err, users_service.ErrInvalidEmail), errors.Is(err, users_service.ErrInvalidRole), errors.Is(err, users_service.ErrInvalidPasswordChange):
|
||||
return status.Error(codes.InvalidArgument, err.Error())
|
||||
case errors.Is(err, users_service.ErrInvalidCredentials), errors.Is(err, users_repo.ErrUserNotFound):
|
||||
return status.Error(codes.Unauthenticated, users_service.ErrInvalidCredentials.Error())
|
||||
case errors.Is(err, users_service.ErrInvalidAccountPassword):
|
||||
return status.Error(codes.PermissionDenied, err.Error())
|
||||
default:
|
||||
return status.Error(codes.Internal, internalMessage)
|
||||
}
|
||||
}
|
||||
+13
-30
@@ -28,9 +28,7 @@ func (s *server) Signup(ctx context.Context, req *proto.SignupReq) (*proto.Signu
|
||||
userAgent,
|
||||
)
|
||||
if err != nil {
|
||||
return &proto.SignupRsp{
|
||||
Error: err.Error(),
|
||||
}, nil
|
||||
return nil, userErrorStatus(err, "не удалось зарегистрировать пользователя")
|
||||
}
|
||||
return &proto.SignupRsp{}, nil
|
||||
}
|
||||
@@ -51,9 +49,7 @@ func (s *server) DeleteAccount(ctx context.Context, req *proto.DeleteAccountReq)
|
||||
}
|
||||
err := s.usersService.DeleteAccount(ctx, claims.UserID, password)
|
||||
if err != nil {
|
||||
return &proto.DeleteAccountRsp{
|
||||
Error: err.Error(),
|
||||
}, nil
|
||||
return nil, userErrorStatus(err, "не удалось удалить аккаунт")
|
||||
}
|
||||
return &proto.DeleteAccountRsp{}, nil
|
||||
}
|
||||
@@ -117,9 +113,7 @@ func clientInfoFromContext(ctx context.Context) (ip string, userAgent string) {
|
||||
func (s *server) RefreshPassword(ctx context.Context, req *proto.RefreshPasswordReq) (*proto.RefreshPasswordRsp, error) {
|
||||
err := s.usersService.RefreshPassword(ctx, req.Email)
|
||||
if err != nil {
|
||||
return &proto.RefreshPasswordRsp{
|
||||
Error: err.Error(),
|
||||
}, nil
|
||||
return nil, userErrorStatus(err, "не удалось обновить пароль")
|
||||
}
|
||||
return &proto.RefreshPasswordRsp{}, nil
|
||||
}
|
||||
@@ -127,9 +121,7 @@ func (s *server) RefreshPassword(ctx context.Context, req *proto.RefreshPassword
|
||||
func (s *server) Login(ctx context.Context, req *proto.LoginReq) (*proto.LoginRsp, error) {
|
||||
accessToken, refreshToken, err := s.usersService.Login(ctx, req.Email, req.Password)
|
||||
if err != nil {
|
||||
return &proto.LoginRsp{
|
||||
Error: err.Error(),
|
||||
}, nil
|
||||
return nil, userErrorStatus(err, "не удалось выполнить вход")
|
||||
}
|
||||
return &proto.LoginRsp{
|
||||
AccessToken: accessToken,
|
||||
@@ -140,9 +132,10 @@ func (s *server) Login(ctx context.Context, req *proto.LoginReq) (*proto.LoginRs
|
||||
func (s *server) Refresh(ctx context.Context, req *proto.RefreshReq) (*proto.RefreshRsp, error) {
|
||||
accessToken, refreshToken, err := s.usersService.Refresh(ctx, req.RefreshToken)
|
||||
if err != nil {
|
||||
return &proto.RefreshRsp{
|
||||
Error: err.Error(),
|
||||
}, nil
|
||||
if errors.Is(err, users_service.ErrInvalidRefreshToken) {
|
||||
return nil, status.Error(codes.Unauthenticated, err.Error())
|
||||
}
|
||||
return nil, userErrorStatus(err, "не удалось обновить сессию")
|
||||
}
|
||||
return &proto.RefreshRsp{
|
||||
AccessToken: accessToken,
|
||||
@@ -160,9 +153,7 @@ func (s *server) GetUsers(ctx context.Context, req *proto.GetUsersReq) (*proto.G
|
||||
}
|
||||
users, err := s.usersService.GetUsers(ctx)
|
||||
if err != nil {
|
||||
return &proto.GetUsersRsp{
|
||||
Error: err.Error(),
|
||||
}, nil
|
||||
return nil, userErrorStatus(err, "не удалось получить пользователей")
|
||||
}
|
||||
|
||||
resUsers := make([]*proto.User, 0, len(users))
|
||||
@@ -177,9 +168,7 @@ func (s *server) GetUsers(ctx context.Context, req *proto.GetUsersReq) (*proto.G
|
||||
func (s *server) GetUserByID(ctx context.Context, req *proto.GetUserByIDReq) (*proto.GetUserByIDRsp, error) {
|
||||
user, err := s.usersService.GetUserByID(ctx, int(req.ID))
|
||||
if err != nil {
|
||||
return &proto.GetUserByIDRsp{
|
||||
Error: err.Error(),
|
||||
}, nil
|
||||
return nil, userErrorStatus(err, "не удалось получить пользователя")
|
||||
}
|
||||
|
||||
return &proto.GetUserByIDRsp{
|
||||
@@ -194,9 +183,7 @@ func (s *server) GetMe(ctx context.Context, req *proto.GetMeReq) (*proto.GetMeRs
|
||||
}
|
||||
user, err := s.usersService.GetUserByID(ctx, claims.UserID)
|
||||
if err != nil {
|
||||
return &proto.GetMeRsp{
|
||||
Error: err.Error(),
|
||||
}, nil
|
||||
return nil, userErrorStatus(err, "не удалось получить профиль")
|
||||
}
|
||||
|
||||
return &proto.GetMeRsp{
|
||||
@@ -213,9 +200,7 @@ func (s *server) AddUserRole(ctx context.Context, req *proto.AddUserRoleReq) (*p
|
||||
return nil, status.Errorf(codes.PermissionDenied, "permission denied")
|
||||
}
|
||||
if err := s.usersService.AddUserRole(ctx, int(req.ID), req.Role); err != nil {
|
||||
return &proto.AddUserRoleRsp{
|
||||
Error: err.Error(),
|
||||
}, nil
|
||||
return nil, userErrorStatus(err, "не удалось добавить роль")
|
||||
}
|
||||
return &proto.AddUserRoleRsp{}, nil
|
||||
}
|
||||
@@ -229,9 +214,7 @@ func (s *server) DeleteUserRole(ctx context.Context, req *proto.DeleteUserRoleRe
|
||||
return nil, status.Errorf(codes.PermissionDenied, "permission denied")
|
||||
}
|
||||
if err := s.usersService.DeleteUserRole(ctx, int(req.ID), req.Role); err != nil {
|
||||
return &proto.DeleteUserRoleRsp{
|
||||
Error: err.Error(),
|
||||
}, nil
|
||||
return nil, userErrorStatus(err, "не удалось удалить роль")
|
||||
}
|
||||
return &proto.DeleteUserRoleRsp{}, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user