CheckInactiveUsersWithOptions function updates status of inactive users from active to dormant using provided parameters.
(ctx context.Context, logger slog.Logger, clk quartz.Clock, db database.Store, auditor audit.Auditor, checkInterval, dormancyPeriod time.Duration)
| 31 | // CheckInactiveUsersWithOptions function updates status of inactive users from active to dormant |
| 32 | // using provided parameters. |
| 33 | func CheckInactiveUsersWithOptions(ctx context.Context, logger slog.Logger, clk quartz.Clock, db database.Store, auditor audit.Auditor, checkInterval, dormancyPeriod time.Duration) func() { |
| 34 | logger = logger.Named("dormancy") |
| 35 | |
| 36 | ctx, cancelFunc := context.WithCancel(ctx) |
| 37 | tf := clk.TickerFunc(ctx, checkInterval, func() error { |
| 38 | startTime := time.Now() |
| 39 | now := dbtime.Time(clk.Now()).UTC() |
| 40 | lastSeenAfter := now.Add(-dormancyPeriod) |
| 41 | logger.Debug(ctx, "check inactive user accounts", slog.F("dormancy_period", dormancyPeriod), slog.F("last_seen_after", lastSeenAfter)) |
| 42 | |
| 43 | updatedUsers, err := db.UpdateInactiveUsersToDormant(ctx, database.UpdateInactiveUsersToDormantParams{ |
| 44 | LastSeenAfter: lastSeenAfter, |
| 45 | UpdatedAt: now, |
| 46 | }) |
| 47 | if err != nil && !xerrors.Is(err, sql.ErrNoRows) { |
| 48 | logger.Error(ctx, "can't mark inactive users as dormant", slog.Error(err)) |
| 49 | return nil |
| 50 | } |
| 51 | |
| 52 | for _, u := range updatedUsers { |
| 53 | logger.Info(ctx, "account has been marked as dormant", slog.F("email", u.Email), slog.F("last_seen_at", u.LastSeenAt)) |
| 54 | audit.BackgroundAudit(ctx, &audit.BackgroundAuditParams[database.User]{ |
| 55 | Audit: auditor, |
| 56 | Log: logger, |
| 57 | UserID: u.ID, |
| 58 | Action: database.AuditActionWrite, |
| 59 | Old: database.User{ID: u.ID, Username: u.Username, Status: database.UserStatusActive}, |
| 60 | New: database.User{ID: u.ID, Username: u.Username, Status: database.UserStatusDormant}, |
| 61 | Status: http.StatusOK, |
| 62 | AdditionalFields: audit.BackgroundTaskFieldsBytes(ctx, logger, audit.BackgroundSubsystemDormancy), |
| 63 | }) |
| 64 | } |
| 65 | logger.Debug(ctx, "checking user accounts is done", slog.F("num_dormant_accounts", len(updatedUsers)), slog.F("execution_time", time.Since(startTime))) |
| 66 | return nil |
| 67 | }) |
| 68 | |
| 69 | return func() { |
| 70 | cancelFunc() |
| 71 | _ = tf.Wait() |
| 72 | } |
| 73 | } |