Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

do not sync face status if user bypassed face cuz of no queue slots #170

Merged
merged 1 commit into from
Jun 27, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 15 additions & 9 deletions kyc/face/face.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -43,31 +43,38 @@ 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) {
c.unexpectedErrors.Add(1)
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
}
Expand All @@ -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)
Expand Down
Loading