Use ParksByState to query alerts more efficiently

This commit is contained in:
2025-10-08 08:48:33 -07:00
parent b4f45bf5c8
commit fcbc513676
2 changed files with 8 additions and 5 deletions

View File

@@ -7,8 +7,8 @@ class NpsClient
conn.get('parks', { start: offset }) conn.get('parks', { start: offset })
end end
def alerts(park_code:, offset: 0) def alerts(state:, offset: 0)
conn.get('alerts', { parkCode: park_code, start: offset }) conn.get('alerts', { stateCode: state, start: offset })
end end
private private

View File

@@ -4,10 +4,12 @@ class Seed::Alerts
end end
def call def call
Park.find_each do |park| ParksByState.distinct.pluck(:state).each do |state|
relevant_park_codes = ParksByState.where(state: state).pluck(:park_code)
offset, total = 0, 1 offset, total = 0, 1
while offset < total do while offset < total do
response_body = NpsClient.current.alerts(park_code: park.code, offset: offset).body response_body = NpsClient.current.alerts(state: state, offset: offset).body
offset = response_body['start'].to_i + response_body['limit'].to_i offset = response_body['start'].to_i + response_body['limit'].to_i
total = response_body['total'].to_i total = response_body['total'].to_i
alerts = response_body['data'] alerts = response_body['data']
@@ -15,8 +17,9 @@ class Seed::Alerts
.map do |identifier, category, description, indexed_date, park_code, title, url| .map do |identifier, category, description, indexed_date, park_code, title, url|
{ identifier:, category:, description:, indexed_date:, park_code:, title:, url: } { identifier:, category:, description:, indexed_date:, park_code:, title:, url: }
end end
.select { relevant_park_codes.include?(it[:park_code]) }
Alert.upsert_all(alerts, unique_by: :identifier) Alert.upsert_all(alerts, unique_by: :identifier)
Rails.logger.info("Upserted #{alerts.count} alerts for #{park.name}") Rails.logger.info("Upserted #{alerts.count} alerts for #{state}")
end end
end end
end end