added 260907 version of worker toolkit
This commit is contained in:
168
worker-toolkit-flaredown/repo/backend/app/models/profile.rb
Normal file
168
worker-toolkit-flaredown/repo/backend/app/models/profile.rb
Normal file
@@ -0,0 +1,168 @@
|
||||
# == Schema Information
|
||||
#
|
||||
# Table name: profiles
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# user_id :integer
|
||||
# country_id :string
|
||||
# birth_date :date
|
||||
# sex_id :string
|
||||
# onboarding_step_id :string
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# ethnicity_ids_string :string
|
||||
# day_habit_id :string
|
||||
# education_level_id :string
|
||||
# day_walking_hours :integer
|
||||
# most_recent_doses :hstore
|
||||
# screen_name :string
|
||||
# most_recent_conditions_positions :hstore
|
||||
# most_recent_symptoms_positions :hstore
|
||||
# most_recent_treatments_positions :hstore
|
||||
#
|
||||
|
||||
class Profile < ActiveRecord::Base
|
||||
enum pressure_units: %i[mb in]
|
||||
enum temperature_units: %i[f c]
|
||||
|
||||
#
|
||||
# Associations
|
||||
#
|
||||
belongs_to :user
|
||||
|
||||
delegate :email, to: :user
|
||||
|
||||
MIN_AGE = 16
|
||||
|
||||
#
|
||||
# Validations
|
||||
#
|
||||
|
||||
validates :country_id, inclusion: {
|
||||
in: Country.codes
|
||||
}, if: -> { country_id.present? }
|
||||
|
||||
validates :sex_id, inclusion: {
|
||||
in: Sex.all_ids
|
||||
}, if: -> { sex_id.present? }
|
||||
|
||||
validates :day_habit_id, inclusion: {
|
||||
in: DayHabit.all_ids,
|
||||
message: "%{value} is not a valid day_habit_id"
|
||||
}, if: -> { day_habit_id.present? }
|
||||
|
||||
validates :education_level_id, inclusion: {
|
||||
in: EducationLevel.all_ids,
|
||||
message: "%{value} is not a valid education_level_id"
|
||||
}, if: -> { education_level_id.present? }
|
||||
|
||||
validate :ethnicity_ids_are_valid, if: -> { ethnicity_ids_string.present? }
|
||||
validate :age_of_birth, if: -> { birth_date.present? }
|
||||
|
||||
def ethnicity_ids_are_valid
|
||||
ethnicity_ids.each do |id|
|
||||
unless Ethnicity.all_ids.include?(id)
|
||||
errors.add(:ethnicity_ids, "#{id} is not a valid ethnicity_id")
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
#
|
||||
# Callbacks
|
||||
#
|
||||
before_create :generate_notify_token
|
||||
before_save :ensure_slug_name, if: :screen_name_changed?
|
||||
|
||||
TIMEZONE_PARAMS = {
|
||||
time: [20, 0],
|
||||
time_zone_name: "America/New_York"
|
||||
}.freeze
|
||||
|
||||
NOTIFICATION_ATTRS = %w[checkin_reminder notify_top_posts notify].freeze
|
||||
|
||||
#
|
||||
# Instance Methods
|
||||
#
|
||||
|
||||
def country
|
||||
@country ||= Country.find_country_by_alpha2(country_id) if country_id.present?
|
||||
end
|
||||
|
||||
def locale
|
||||
country.languages.first if country.present?
|
||||
end
|
||||
|
||||
def age
|
||||
return if birth_date.nil?
|
||||
|
||||
today = Time.zone.today
|
||||
age = today.year - birth_date.year
|
||||
|
||||
(today < birth_date + age.years) ? age - 1 : age
|
||||
end
|
||||
|
||||
def ethnicity_ids
|
||||
ethnicity_ids_string&.split(",") || []
|
||||
end
|
||||
|
||||
def ethnicity_ids=(ids)
|
||||
self.ethnicity_ids_string = ids.join(",")
|
||||
end
|
||||
|
||||
def set_most_recent_dose(treatment_id, dose)
|
||||
most_recent_doses[treatment_id.to_s] = dose
|
||||
end
|
||||
|
||||
def most_recent_dose_for(treatment_id)
|
||||
most_recent_doses[treatment_id.to_s]
|
||||
end
|
||||
|
||||
def set_most_recent_trackable_position(trackable, position)
|
||||
trackable_type = trackable.class.name.underscore
|
||||
send("set_most_recent_#{trackable_type}_position", trackable, position)
|
||||
end
|
||||
|
||||
def most_recent_trackable_position_for(trackable)
|
||||
trackable_type = trackable.class.name.underscore
|
||||
send("most_recent_#{trackable_type}_position_for", trackable)
|
||||
end
|
||||
|
||||
%w[condition symptom treatment].each do |trackable_type|
|
||||
define_method "set_most_recent_#{trackable_type}_position" do |trackable, position|
|
||||
send(
|
||||
"most_recent_#{trackable_type.pluralize}_positions"
|
||||
)[trackable.id.to_s] = position.to_s
|
||||
end
|
||||
|
||||
define_method "most_recent_#{trackable_type}_position_for" do |trackable|
|
||||
trackables_positions = send("most_recent_#{trackable_type.pluralize}_positions")
|
||||
|
||||
return nil if trackables_positions.blank?
|
||||
|
||||
trackables_positions[trackable.id.to_s].to_i
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def generate_notify_token
|
||||
self.notify_token =
|
||||
loop do
|
||||
random_token = SecureRandom.hex
|
||||
break random_token unless Profile.exists?(notify_token: random_token)
|
||||
end
|
||||
end
|
||||
|
||||
def ensure_slug_name
|
||||
slug_name = screen_name && screen_name.split(/\s/).map(&:capitalize).join("")
|
||||
assign_attributes(slug_name: slug_name)
|
||||
end
|
||||
|
||||
def age_of_birth
|
||||
if age < MIN_AGE
|
||||
errors.add(:birth_date, "You must be #{MIN_AGE} years or older to use this app according
|
||||
to international privacy regulations. Sorry :(")
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user