From 397dede4ec6c6bb57e8091d0d1c65a7f01c01f3e Mon Sep 17 00:00:00 2001 From: Dionysos <75300347+ice-dionysos@users.noreply.github.com> Date: Mon, 15 Jan 2024 14:48:11 +0100 Subject: [PATCH 1/2] kyc/quiz: remove ErrSessionIsAlreadyRunning --- cmd/eskimo-hut/contract.go | 1 - cmd/eskimo-hut/kyc.go | 3 --- kyc/quiz/contract.go | 1 - kyc/quiz/quiz.go | 18 ++++++------------ kyc/quiz/quiz_test.go | 2 +- 5 files changed, 7 insertions(+), 18 deletions(-) diff --git a/cmd/eskimo-hut/contract.go b/cmd/eskimo-hut/contract.go index 95d5b200..5dee52cb 100644 --- a/cmd/eskimo-hut/contract.go +++ b/cmd/eskimo-hut/contract.go @@ -189,7 +189,6 @@ const ( noPendingLoginSessionErrorCode = "NO_PENDING_LOGIN_SESSION" - quizAlreadyRunningErrorCode = "QUIZ_ALREADY_RUNNING" quizUnknownQuestionNumErrorCode = "QUIZ_UNKNOWN_QUESTION_NUM" socialKYCStepAlreadyCompletedSuccessfullyErrorCode = "SOCIAL_KYC_STEP_ALREADY_COMPLETED_SUCCESSFULLY" diff --git a/cmd/eskimo-hut/kyc.go b/cmd/eskimo-hut/kyc.go index 85e5cdae..ddfbdb87 100644 --- a/cmd/eskimo-hut/kyc.go +++ b/cmd/eskimo-hut/kyc.go @@ -86,9 +86,6 @@ func (s *service) StartOrContinueKYCStep4Session( //nolint:gocritic,funlen // . 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.ErrSessionFinished), errors.Is(err, kycquiz.ErrSessionFinishedWithError), errors.Is(err, kycquiz.ErrInvalidKYCState): //nolint:lll // . return nil, server.BadRequest(err, raceConditionErrorCode) diff --git a/kyc/quiz/contract.go b/kyc/quiz/contract.go index f72207cf..aa941f3a 100644 --- a/kyc/quiz/contract.go +++ b/kyc/quiz/contract.go @@ -66,7 +66,6 @@ var ( ErrUnknownLanguage = newError("unknown language") ErrInvalidKYCState = newError("invalid KYC state") ErrUnknownUser = newError("unknown user") - ErrSessionIsAlreadyRunning = newError("another session is already running") ErrSessionFinished = newError("session closed") ErrSessionFinishedWithError = newError("session closed with error") ErrUnknownQuestionNumber = newError("unknown question number") diff --git a/kyc/quiz/quiz.go b/kyc/quiz/quiz.go index 35710802..6cb0c171 100644 --- a/kyc/quiz/quiz.go +++ b/kyc/quiz/quiz.go @@ -190,15 +190,14 @@ func wrapErrorInTx(err error) error { return err } -func (r *repositoryImpl) finishExpiredSession( //nolint:funlen //. +func (r *repositoryImpl) finishUnfinishedSession( //nolint:funlen //. ctx context.Context, userID UserID, now *time.Time, tx storage.QueryExecer, ) (*time.Time, error) { // $1: user_id. - // $2: max session duration (seconds). - // $3: session cool down (seconds). + // $2: session cool down (seconds). const stmt = ` with result as ( update quiz_sessions @@ -207,8 +206,7 @@ func (r *repositoryImpl) finishExpiredSession( //nolint:funlen //. ended_successfully = false where user_id = $1 and - ended_at is null and - started_at + make_interval(secs => $2) < now() + ended_at is null returning * ) insert into failed_quiz_sessions (started_at, ended_at, questions, answers, language, user_id, skipped) @@ -223,11 +221,11 @@ func (r *repositoryImpl) finishExpiredSession( //nolint:funlen //. from result returning - ended_at + make_interval(secs => $3) as cooldown_at + ended_at + make_interval(secs => $2) as cooldown_at ` data, err := storage.ExecOne[struct { CooldownAt *time.Time `db:"cooldown_at"` - }](ctx, tx, stmt, userID, r.config.MaxSessionDurationSeconds, r.config.SessionCoolDownSeconds) + }](ctx, tx, stmt, userID, r.config.SessionCoolDownSeconds) if err != nil { if errors.Is(err, storage.ErrNotFound) { err = nil @@ -354,10 +352,6 @@ func (r *repositoryImpl) startNewSession( //nolint:funlen,revive //. return nil, ErrSessionFinishedWithError } - if data.ActiveDeadline.After(*now.Time) { - return nil, errors.Wrapf(ErrSessionIsAlreadyRunning, "wait %s before next session", data.ActiveDeadline.Sub(*now.Time)) - } - case data.UpsertStartedAt != nil: // New session is started. return &Quiz{ Progress: &Progress{ @@ -379,7 +373,7 @@ func (r *repositoryImpl) StartQuizSession(ctx context.Context, userID UserID, la err = storage.DoInTransaction(ctx, r.DB, func(tx storage.QueryExecer) error { now := time.Now() - cooldown, fErr := r.finishExpiredSession(ctx, userID, now, tx) + cooldown, fErr := r.finishUnfinishedSession(ctx, userID, now, tx) if fErr != nil { return wrapErrorInTx(fErr) } else if cooldown != nil { diff --git a/kyc/quiz/quiz_test.go b/kyc/quiz/quiz_test.go index 9d4ba96e..f6e0ef1e 100644 --- a/kyc/quiz/quiz_test.go +++ b/kyc/quiz/quiz_test.go @@ -140,7 +140,7 @@ func testManagerSessionStart(ctx context.Context, t *testing.T, r *repositoryImp }) t.Run("AlreadyExists", func(t *testing.T) { _, err := r.StartQuizSession(ctx, "bogus", "en") - require.ErrorIs(t, err, ErrSessionIsAlreadyRunning) + require.ErrorIs(t, err, ErrSessionFinishedWithError) }) t.Run("Finished", func(t *testing.T) { t.Run("Success", func(t *testing.T) { From 761c85d0f7489d1fbacc17432a1c498e29859986 Mon Sep 17 00:00:00 2001 From: Dionysos <75300347+ice-dionysos@users.noreply.github.com> Date: Mon, 15 Jan 2024 14:54:30 +0100 Subject: [PATCH 2/2] linter --- kyc/quiz/quiz.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/kyc/quiz/quiz.go b/kyc/quiz/quiz.go index 6cb0c171..5aec9faf 100644 --- a/kyc/quiz/quiz.go +++ b/kyc/quiz/quiz.go @@ -237,10 +237,9 @@ func (r *repositoryImpl) finishUnfinishedSession( //nolint:funlen //. return data.CooldownAt, errors.Wrapf(r.modifyUser(ctx, false, now, userID), "failed to modifyUser") } -func (r *repositoryImpl) startNewSession( //nolint:funlen,revive //. +func (r *repositoryImpl) startNewSession( //nolint:funlen //. ctx context.Context, userID UserID, - now *time.Time, tx storage.QueryExecer, lang string, questions []*Question, @@ -385,7 +384,7 @@ func (r *repositoryImpl) StartQuizSession(ctx context.Context, userID UserID, la return wrapErrorInTx(err) } - quiz, err = r.startNewSession(ctx, userID, now, tx, lang, questions) + quiz, err = r.startNewSession(ctx, userID, tx, lang, questions) return wrapErrorInTx(err) })