Class: Facilities::AccessDataDownload

Inherits:
Object
  • Object
show all
Includes:
SentryLogging, Sidekiq::Job
Defined in:
app/sidekiq/facilities/access_data_download.rb

Constant Summary collapse

SAT_KEY_MAP =
{
  'Primary Care (Routine)' => 'primary_care_routine',
  'Primary Care (Urgent)' => 'primary_care_urgent',
  'Specialty Care (Routine)' => 'specialty_care_routine',
  'Specialty Care (Urgent)' => 'specialty_care_urgent'
}.freeze
SAT_REQUIRED_KEYS =
%w[facilityID ApptTypeName SHEPScore sliceEndDate].freeze
WT_KEY_MAP =
{
  'PRIMARY CARE' => 'primary_care',
  'MENTAL HEALTH' => 'mental_health_care',
  'COMP WOMEN\'S HLTH' => 'womens_health',
  'AUDIOLOGY' => 'audiology',
  'CARDIOLOGY' => 'cardiology',
  'DERMATOLOGY' => 'dermatology',
  'GASTROENTEROLOGY' => 'gastroenterology',
  'GYNECOLOGY' => 'gynecology',
  'OPHTHALMOLOGY' => 'ophthalmology',
  'OPTOMETRY' => 'optometry',
  'ORTHOPEDICS' => 'orthopedics',
  'UROLOGY CLINIC' => 'urology',
  'SPECIALTY CARE' => 'specialty_care'
}.freeze
WT_REQUIRED_KEYS =
%w[facilityID ApptTypeName newWaitTime estWaitTime sliceEndDate].freeze

Instance Method Summary collapse

Methods included from SentryLogging

#log_exception_to_sentry, #log_message_to_sentry, #non_nil_hash?, #normalize_level, #rails_logger

Instance Method Details

#filter(val) ⇒ Object



95
96
97
# File 'app/sidekiq/facilities/access_data_download.rb', line 95

def filter(val)
  val >= 9999 ? nil : val
end

#invalidate_removed(model, facility_keys) ⇒ Object



60
61
62
63
64
# File 'app/sidekiq/facilities/access_data_download.rb', line 60

def invalidate_removed(model, facility_keys)
  invalidate = model.keys - facility_keys
  invalidate.each { |x| model.delete(x) }
  logger.info "Removed #{invalidate.size} obsolete entries from cache"
end

#parse_satisfaction_data(records) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
# File 'app/sidekiq/facilities/access_data_download.rb', line 71

def parse_satisfaction_data(records)
  facilities = Hash.new { |h, k| h[k] = { 'metrics' => {} } }
  records.each do |rec|
    require_keys(rec, SAT_REQUIRED_KEYS)
    id = rec['facilityID']
    facility = facilities[id]
    category = SAT_KEY_MAP[rec['ApptTypeName']]
    facility['metrics'][category] = rec['SHEPScore']
    facility['source_date'] = rec['sliceEndDate']
  end
  facilities
end

#parse_wait_time_data(records) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'app/sidekiq/facilities/access_data_download.rb', line 99

def parse_wait_time_data(records)
  facilities = Hash.new { |h, k| h[k] = { 'metrics' => {}, 'ed' => [], 'uc' => [] } }
  records.each do |rec|
    require_keys(rec, WT_REQUIRED_KEYS)
    id = rec['facilityID']
    facility = facilities[id]
    category = WT_KEY_MAP[rec['ApptTypeName']]
    metric = { 'new' => filter(rec['newWaitTime']),
               'established' => filter(rec['estWaitTime']) }
    facility['metrics'][category] = metric
    facility['ed'] << rec['ED']
    facility['uc'] << rec['UC']
    facility['source_date'] = rec['sliceEndDate']
  end
  facilities
end

#performObject



136
137
138
139
140
141
142
# File 'app/sidekiq/facilities/access_data_download.rb', line 136

def perform
  sat_client = Facilities::AccessSatisfactionClient.new
  update_satisfaction_data(sat_client)

  pwt_client = Facilities::AccessWaitTimeClient.new
  update_wait_time_data(pwt_client)
end

#require_keys(record, required_keys) ⇒ Object

Raises:



66
67
68
69
# File 'app/sidekiq/facilities/access_data_download.rb', line 66

def require_keys(record, required_keys)
  diff = required_keys - record.keys
  raise AccessDataError, "Missing expected keys: #{diff}" if diff.present?
end

#update_cache(model, facilities) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'app/sidekiq/facilities/access_data_download.rb', line 43

def update_cache(model, facilities)
  facilities.each do |k, v|
    attrs = { station_number: k,
              metrics: v['metrics'],
              emergency_care: v['ed'],
              urgent_care: v['uc'],
              source_updated: v['source_date'],
              local_updated: Time.now.utc.iso8601 }
    obj = model.find(k)
    if obj
      obj.update(attrs)
    else
      model.create(attrs)
    end
  end
end

#update_satisfaction_data(client) ⇒ Object



84
85
86
87
88
89
90
91
92
93
# File 'app/sidekiq/facilities/access_data_download.rb', line 84

def update_satisfaction_data(client)
  records = client.download
  facilities = parse_satisfaction_data(records)
  update_cache(FacilitySatisfaction, facilities)
  logger.info "Updated facility satisfaction cache for #{facilities.size} facilities"
  invalidate_removed(FacilitySatisfaction, facilities.keys)
rescue Common::Exceptions::BackendServiceException, Common::Client::Errors::ClientError,
       Facilities::AccessDataError => e
  log_exception_to_sentry(e)
end

#update_wait_time_data(client) ⇒ Object



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'app/sidekiq/facilities/access_data_download.rb', line 116

def update_wait_time_data(client)
  records = client.download
  uniq_specialties = records.map { |facility| facility['ApptTypeName'] }.uniq
  unless uniq_specialties.sort == WT_KEY_MAP.keys.sort
    log_message_to_sentry(
      'Facility Locator Specialty Wait Time Inconsistency',
      :error,
      missing_specialties: uniq_specialties - WT_KEY_MAP.keys,
      unused_specialties: WT_KEY_MAP.keys - uniq_specialties
    )
  end
  facilities = parse_wait_time_data(records)
  update_cache(FacilityWaitTime, facilities)
  logger.info "Updated facility wait time cache for #{facilities.size} facilities"
  invalidate_removed(FacilityWaitTime, facilities.keys)
rescue Common::Exceptions::BackendServiceException, Common::Client::Errors::ClientError,
       Facilities::AccessDataError => e
  log_exception_to_sentry(e)
end