master
 1class UserSession < ApplicationRecord
 2  include Queryable
 3  belongs_to :user
 4  has_one :location, as: :locatable
 5  before_create :set_unique_key
 6  attr_readonly :key
 7  scope :active, -> do
 8    where("accessed_at >= ?", 20.minutes.ago)
 9      .where("created_at >= ?", 1.day.ago)
10      .where(revoked_at: nil)
11      .includes(:user)
12  end
13
14  def revoke!
15    self.revoked_at = Time.current
16    save!
17  end
18
19  def access(request)
20    self.accessed_at = Time.current
21    self.ip = request.ip
22    self.user_agent = request.user_agent
23    self.location = Location.build_from_ip(request.ip)
24    save ? key : nil
25  end
26
27  def browser
28    @browser ||= BrowserSniffer.new(user_agent)
29  end
30
31  class << self
32    def authenticate(key)
33      return nil if key.blank?
34      self.active.find_by(key: key)
35    end
36
37    def sweep(time = 1.day)
38      delete_all("accessed_at < ?", time.ago)
39    end
40  end
41
42  private
43
44  def set_unique_key
45    self.key = SecureRandom.urlsafe_base64(32)
46  end
47end