From 3e76e35326c1a64fc61b6b5f446b19b09e195294 Mon Sep 17 00:00:00 2001 From: Dionysos <75300347+ice-dionysos@users.noreply.github.com> Date: Sun, 14 Jan 2024 13:03:29 +0100 Subject: [PATCH] eskimo-hut: kyc/quiz: remove loop (#91) --- cmd/eskimo-hut/kyc.go | 58 ++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/cmd/eskimo-hut/kyc.go b/cmd/eskimo-hut/kyc.go index 849495bb..f1419fe8 100644 --- a/cmd/eskimo-hut/kyc.go +++ b/cmd/eskimo-hut/kyc.go @@ -4,7 +4,9 @@ package main import ( "context" + "fmt" "slices" + "strings" "github.com/pkg/errors" @@ -23,6 +25,25 @@ func (s *service) setupKYCRoutes(router *server.Router) { POST("kyc/tryResetKYCSteps/users/:userId", server.RootHandler(s.TryResetKYCSteps)) } +func (s *service) startQuizSession(ctx context.Context, userID users.UserID, lang string) (*kycquiz.Quiz, error) { + const defaultLanguage = "en" + + if strings.EqualFold(lang, defaultLanguage) { + return s.quizRepository.StartQuizSession(ctx, userID, defaultLanguage) //nolint:wrapcheck // . + } + + quiz, err := s.quizRepository.StartQuizSession(ctx, userID, lang) + if err != nil { + if errors.Is(err, kycquiz.ErrUnknownLanguage) { + log.Warn(fmt.Sprintf("failed to StartQuizSession for userID:%v,language:%v, trying default language:%v", userID, lang, defaultLanguage)) + + return s.quizRepository.StartQuizSession(ctx, userID, defaultLanguage) //nolint:wrapcheck // . + } + } + + return quiz, err //nolint:wrapcheck // . +} + // StartOrContinueKYCStep4Session godoc // // @Schemes @@ -47,41 +68,32 @@ func (s *service) setupKYCRoutes(router *server.Router) { // @Failure 500 {object} server.ErrorResponse // @Failure 504 {object} server.ErrorResponse "if request times out" // @Router /kyc/startOrContinueKYCStep4Session/users/{userId} [POST]. -func (s *service) StartOrContinueKYCStep4Session( //nolint:gocritic,funlen,revive,gocognit,cyclop // . +func (s *service) StartOrContinueKYCStep4Session( //nolint:gocritic,funlen // . ctx context.Context, req *server.Request[StartOrContinueKYCStep4SessionRequestBody, kycquiz.Quiz], ) (*server.Response[kycquiz.Quiz], *server.Response[server.ErrorResponse]) { const ( magicNumberQuizStart = 222 - defaultLanguage = "en" ) // Handle the session start. if *req.Data.QuestionNumber == magicNumberQuizStart && *req.Data.SelectedOption == magicNumberQuizStart { - var ( - err error - quiz *kycquiz.Quiz - ) - langLoop: - for _, lang := range []string{req.Data.Language, defaultLanguage} { - if quiz, err = s.quizRepository.StartQuizSession(ctx, req.AuthenticatedUser.UserID, lang); err != nil { - err = errors.Wrapf(err, "failed to StartQuizSession for userID:%v,language:%v", req.AuthenticatedUser.UserID, lang) - switch { - case errors.Is(err, kycquiz.ErrUnknownLanguage): - continue langLoop - - case errors.Is(err, kycquiz.ErrUnknownUser): - return nil, server.NotFound(err, userNotFoundErrorCode) + quiz, err := s.startQuizSession(ctx, req.AuthenticatedUser.UserID, req.Data.Language) + err = errors.Wrapf(err, "failed to StartQuizSession for userID:%v,language:%v", req.AuthenticatedUser.UserID, req.Data.Language) + if err != nil { + log.Error(err) + switch { + case errors.Is(err, kycquiz.ErrUnknownUser): + return nil, server.NotFound(err, userNotFoundErrorCode) - case errors.Is(err, kycquiz.ErrSessionIsAlreadyRunning): - return nil, server.ForbiddenWithCode(errors.Errorf("another quiz session is already running"), quizAlreadyRunningErrorCode) + case errors.Is(err, kycquiz.ErrSessionIsAlreadyRunning): + return nil, server.ForbiddenWithCode(errors.Errorf("another quiz session is already running"), quizAlreadyRunningErrorCode) - case errors.Is(err, kycquiz.ErrSessionFinished), errors.Is(err, kycquiz.ErrSessionFinishedWithError), errors.Is(err, kycquiz.ErrInvalidKYCState): //nolint:lll // . - return nil, server.BadRequest(err, raceConditionErrorCode) + case errors.Is(err, kycquiz.ErrSessionFinished), errors.Is(err, kycquiz.ErrSessionFinishedWithError), errors.Is(err, kycquiz.ErrInvalidKYCState): //nolint:lll // . + return nil, server.BadRequest(err, raceConditionErrorCode) - default: - return nil, server.Unexpected(err) - } + default: + return nil, server.Unexpected(err) } }