MCPcopy Index your code
hub / github.com/coder/coder / CheckInactiveUsersWithOptions

Function CheckInactiveUsersWithOptions

enterprise/coderd/dormancy/dormantusersjob.go:33–73  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

31// CheckInactiveUsersWithOptions function updates status of inactive users from active to dormant
32// using provided parameters.
33func 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}

Callers 2

TestCheckInactiveUsersFunction · 0.92
CheckInactiveUsersFunction · 0.85

Calls 10

TimeFunction · 0.92
BackgroundAuditFunction · 0.92
NamedMethod · 0.80
AddMethod · 0.65
WaitMethod · 0.65
IsMethod · 0.45
ErrorMethod · 0.45
InfoMethod · 0.45

Tested by 1

TestCheckInactiveUsersFunction · 0.74