diff --git a/kyc/face/face.go b/kyc/face/face.go index a5179914..4107d48d 100644 --- a/kyc/face/face.go +++ b/kyc/face/face.go @@ -30,7 +30,7 @@ func New(ctx context.Context, usersRep UserRepository) Client { return cl } -//nolint:funlen,gocognit,revive // . +//nolint:funlen,gocognit,revive,gocyclo,cyclop // . func (c *client) CheckStatus(ctx context.Context, user *users.User, nextKYCStep users.KYCStep) (bool, error) { kycFaceAvailable := false if errs := c.unexpectedErrors.Load(); errs >= c.cfg.UnexpectedErrorsAllowed { @@ -43,24 +43,25 @@ func (c *client) CheckStatus(ctx context.Context, user *users.User, nextKYCStep return false, errors.Wrapf(err, "failed to check if user id %v was forwarded to face kyc before", user.ID) } hasResult := false - if userWasPreviouslyForwardedToFaceKYC { + now := time.Now() + if userWasPreviouslyForwardedToFaceKYC && user.LastMiningStartedAt.Before(*now.Time) { if hasResult, err = c.client.CheckAndUpdateStatus(ctx, user); err != nil { c.unexpectedErrors.Add(1) log.Error(errors.Wrapf(err, "[unexpected]failed to update face auth status for user ID %s", user.ID)) return false, nil } - if hasResult { - if dErr := c.deleteUserForwarded(ctx, user.ID); dErr != nil { - return false, errors.Wrapf(err, "failed to delete user forwarded to face kyc for user id %v", user.ID) - } + } + if hasResult || user.LastMiningStartedAt.After(*now.Time) { // User canceled and started mining when there were no slots. + if dErr := c.deleteUserForwarded(ctx, user.ID); dErr != nil { + return false, errors.Wrapf(err, "failed to delete user forwarded to face kyc for user id %v", user.ID) } } if !hasResult || nextKYCStep == users.LivenessDetectionKYCStep { availabilityErr := c.client.Available(ctx, userWasPreviouslyForwardedToFaceKYC) if availabilityErr == nil { kycFaceAvailable = true - if fErr := c.saveUserForwarded(ctx, user.ID); fErr != nil { + if fErr := c.saveUserForwarded(ctx, user.ID, now); fErr != nil { return false, errors.Wrapf(fErr, "failed ") } } else if !errors.Is(availabilityErr, internal.ErrNotAvailable) { @@ -68,6 +69,12 @@ func (c *client) CheckStatus(ctx context.Context, user *users.User, nextKYCStep log.Error(errors.Wrapf(availabilityErr, "[unexpected]face auth is unavailable for userID %v KYCStep %v", user.ID, nextKYCStep)) } } + if !kycFaceAvailable && userWasPreviouslyForwardedToFaceKYC { + // User will bypass face (no slots) and mine, will recreate forward next time not to sync state next time. + if dErr := c.deleteUserForwarded(ctx, user.ID); dErr != nil { + return false, errors.Wrapf(err, "failed to delete user forwarded to face kyc for user id %v", user.ID) + } + } return kycFaceAvailable, nil } @@ -78,8 +85,7 @@ func (c *client) deleteUserForwarded(ctx context.Context, userID string) error { return errors.Wrapf(err, "failed to delete user forwarded to face kyc for userID %v", userID) } -func (c *client) saveUserForwarded(ctx context.Context, userID string) error { - now := time.Now() +func (c *client) saveUserForwarded(ctx context.Context, userID string, now *time.Time) error { _, err := storage.Exec(ctx, c.db, "INSERT INTO users_forwarded_to_face_kyc(forwarded_at, user_id) values ($1, $2) ON CONFLICT DO NOTHING;", now.Time, userID) return errors.Wrapf(err, "failed to save user forwarded to face kyc for userID %v", userID)