Class: Veri::Session

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
lib/veri/models/session.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.establish(user, request, resolved_tenant) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/veri/models/session.rb', line 103

def establish(user, request, resolved_tenant)
  token = SecureRandom.hex(32)
  expires_at = Time.current + Veri::Configuration.total_session_lifetime

  new(
    hashed_token: digest_token(token),
    expires_at:,
    authenticatable: user,
    **resolved_tenant
  ).update_info(request)

  token
end

.find_active(token, resolved_tenant) ⇒ Object



129
130
131
132
133
134
135
# File 'lib/veri/models/session.rb', line 129

def find_active(token, resolved_tenant)
  return nil if token.blank?

  session = find_by(hashed_token: digest_token(token), **resolved_tenant)

  session&.active? ? session : nil
end

.pruneObject



117
118
119
120
121
122
123
124
125
# File 'lib/veri/models/session.rb', line 117

def prune
  orphaned_tenant_sessions = where.not(tenant_id: nil).includes(:tenant).filter_map do |session|
    !session.tenant
  rescue ActiveRecord::RecordNotFound
    session.id
  end

  where(id: orphaned_tenant_sessions).delete_all if orphaned_tenant_sessions.any?
end

Instance Method Details

#active?Boolean

Returns:

  • (Boolean)


19
# File 'lib/veri/models/session.rb', line 19

def active? = !expired? && !inactive?

#expired?Boolean

Returns:

  • (Boolean)


21
22
23
# File 'lib/veri/models/session.rb', line 21

def expired?
  expires_at < Time.current
end

#identityObject



55
# File 'lib/veri/models/session.rb', line 55

def identity = authenticatable

#inactive?Boolean

Returns:

  • (Boolean)


25
26
27
28
29
30
31
# File 'lib/veri/models/session.rb', line 25

def inactive?
  inactive_session_lifetime = Veri::Configuration.inactive_session_lifetime

  return false unless inactive_session_lifetime

  last_seen_at < Time.current - inactive_session_lifetime
end

#infoObject



43
44
45
46
47
48
49
50
51
52
53
# File 'lib/veri/models/session.rb', line 43

def info
  agent = UserAgentParser.parse(user_agent)

  {
    device: agent.device.to_s,
    os: agent.os.to_s,
    browser: agent.to_s,
    ip_address:,
    last_seen_at:
  }
end

#original_tenantObject



98
99
100
# File 'lib/veri/models/session.rb', line 98

def original_tenant
  resolve_tenant(original_tenant_type, original_tenant_id) { super }
end

#shapeshift(user, tenant: nil) ⇒ Object

Raises:



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/veri/models/session.rb', line 60

def shapeshift(user, tenant: nil)
  raise Veri::Error, "Cannot shapeshift from a shapeshifted session" if shapeshifted?

  resolved_tenant = Veri::Inputs::Tenant.new(
    tenant,
    error: Veri::InvalidTenantError,
    message: "Expected a string, an ActiveRecord model instance, or nil, got `#{tenant.inspect}`"
  ).resolve

  update!(
    shapeshifted_at: Time.current,
    original_authenticatable: authenticatable,
    original_tenant_type: tenant_type,
    original_tenant_id: tenant_id,
    **resolved_tenant,
    authenticatable: Veri::Inputs::Authenticatable.new(
      user,
      message: "Expected an instance of #{Veri::Configuration.user_model_name}, got `#{user.inspect}`"
    ).process
  )
end

#shapeshifted?Boolean

Returns:

  • (Boolean)


56
# File 'lib/veri/models/session.rb', line 56

def shapeshifted? = original_authenticatable.present?

#tenantObject



94
95
96
# File 'lib/veri/models/session.rb', line 94

def tenant
  resolve_tenant(tenant_type, tenant_id) { super }
end

#to_true_identityObject



82
83
84
85
86
87
88
89
90
91
92
# File 'lib/veri/models/session.rb', line 82

def to_true_identity
  update!(
    shapeshifted_at: nil,
    authenticatable: original_authenticatable,
    tenant_type: original_tenant_type,
    tenant_id: original_tenant_id,
    original_tenant_type: nil,
    original_tenant_id: nil,
    original_authenticatable: nil
  )
end

#true_identityObject



57
# File 'lib/veri/models/session.rb', line 57

def true_identity = original_authenticatable || authenticatable

#true_tenantObject



58
# File 'lib/veri/models/session.rb', line 58

def true_tenant = original_tenant || tenant

#update_info(request) ⇒ Object



35
36
37
38
39
40
41
# File 'lib/veri/models/session.rb', line 35

def update_info(request)
  update!(
    last_seen_at: Time.current,
    ip_address: request.remote_ip,
    user_agent: request.user_agent
  )
end