| 39 | } |
| 40 | |
| 41 | func (s *cachedScanner) ScanUsers(ctx context.Context) ([]string, []string, []string, error) { |
| 42 | s.requests.Inc() |
| 43 | s.mtx.Lock() |
| 44 | defer s.mtx.Unlock() |
| 45 | // Check if we have a valid cached result |
| 46 | if !s.lastUpdatedAt.Before(time.Now().Add(-s.ttl)) { |
| 47 | active := s.active |
| 48 | deleting := s.deleting |
| 49 | deleted := s.deleted |
| 50 | s.hits.Inc() |
| 51 | return active, deleting, deleted, nil |
| 52 | } |
| 53 | |
| 54 | // TODO: move to promise based. |
| 55 | active, deleting, deleted, err := s.scanner.ScanUsers(ctx) |
| 56 | if err != nil { |
| 57 | return nil, nil, nil, err |
| 58 | } |
| 59 | |
| 60 | s.active = active |
| 61 | s.deleting = deleting |
| 62 | s.deleted = deleted |
| 63 | s.lastUpdatedAt = time.Now() |
| 64 | |
| 65 | return active, deleting, deleted, nil |
| 66 | } |