88 lines
2.3 KiB
Ruby
88 lines
2.3 KiB
Ruby
# A human
|
|
class User < ApplicationRecord
|
|
class AlreadyVerified < StandardError; end
|
|
|
|
ENFORCE_TOS = ENV.fetch("TOS_URL") { false }
|
|
SKIP_EMAIL_VALIDATION = ENV.fetch("NO_EMAILS") { false }
|
|
validates :email, uniqueness: true
|
|
|
|
belongs_to :device, dependent: :destroy
|
|
|
|
devise :database_authenticatable
|
|
devise :trackable
|
|
|
|
# http://stackoverflow.com/a/5127684/1064917
|
|
before_validation :set_defaults
|
|
|
|
def self.try_auth(email, password)
|
|
user = User.where(email: email).first
|
|
(user && user.valid_password?(password)) ? yield(user) : yield(nil)
|
|
end
|
|
|
|
def set_defaults
|
|
self.confirmation_token || self.reset_confirmation_token
|
|
end
|
|
|
|
def reset_confirmation_token
|
|
self.confirmation_token = SecureRandom.uuid
|
|
end
|
|
|
|
def must_consent?
|
|
ENFORCE_TOS && !agreed_to_terms_at
|
|
end
|
|
|
|
def require_consent!
|
|
raise Errors::LegalConsent if must_consent?
|
|
self
|
|
end
|
|
|
|
def verified?
|
|
SKIP_EMAIL_VALIDATION ? true : !!confirmed_at
|
|
end
|
|
|
|
def update_tracked_fields!(request)
|
|
super(request) unless FbosDetector.is_fbos_ua?(request)
|
|
end
|
|
|
|
def self.refresh_everyones_ui
|
|
msg = {
|
|
"type" => "reload",
|
|
"commit" => (ENV["HEROKU_SLUG_COMMIT"] || "NONE").first(8),
|
|
}
|
|
|
|
Transport
|
|
.current
|
|
.raw_amqp_send(msg.to_json, Api::RmqUtilsController::PUBLIC_BROADCAST)
|
|
end
|
|
|
|
# The web app deletes account that go inactive for long periods.
|
|
# It is called when the user logs in to the app.
|
|
def reset_inactivity_tracking!
|
|
update!(inactivity_warning_sent_at: nil)
|
|
end
|
|
|
|
def send_inactivity_warning
|
|
User.transaction do
|
|
update!(inactivity_warning_sent_at: Time.now)
|
|
InactivityMailer.send_warning(self).deliver_later
|
|
puts "INACTIVITY WARNING FOR #{email}" unless Rails.env.test?
|
|
end
|
|
end
|
|
|
|
def deactivate_account
|
|
User.transaction do
|
|
email = self.email
|
|
if reload.last_sign_in_at > 3.months.ago
|
|
puts "CANCEL DEACTIVATION FOR #{email}" unless Rails.env.test?
|
|
update!(inactivity_warning_sent_at: nil)
|
|
return # <== DON'T DELETE THIS LINE!!!
|
|
else
|
|
# Prevent double deletion / race conditions.
|
|
update!(last_sign_in_at: Time.now, inactivity_warning_sent_at: nil)
|
|
delay.destroy!
|
|
puts "INACTIVITY DELETION FOR #{email}" unless Rails.env.test?
|
|
end
|
|
end
|
|
end
|
|
end
|