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