39 lines
1.4 KiB
Ruby
39 lines
1.4 KiB
Ruby
class FetchIpapiDataJob < ApplicationJob
|
|
queue_as :default
|
|
|
|
# Fetches IPAPI enrichment data for a NetworkRange
|
|
# @param network_range_id [Integer] ID of the NetworkRange to enrich
|
|
def perform(network_range_id:)
|
|
network_range = NetworkRange.find_by(id: network_range_id)
|
|
return unless network_range
|
|
|
|
# Skip if we already have IPAPI data and it's recent (< 30 days old)
|
|
if network_range.has_network_data_from?(:ipapi) &&
|
|
network_range.last_api_fetch.present? &&
|
|
network_range.last_api_fetch > 30.days.ago
|
|
Rails.logger.info "Skipping IPAPI fetch for #{network_range.cidr} - data is recent"
|
|
return
|
|
end
|
|
|
|
# Use the network address (first IP in range) as the representative IP
|
|
sample_ip = network_range.network_address.split('/').first
|
|
|
|
Rails.logger.info "Fetching IPAPI data for #{network_range.cidr} using IP #{sample_ip}"
|
|
|
|
ipapi_data = Ipapi.lookup(sample_ip)
|
|
|
|
if ipapi_data.present? && !ipapi_data.key?('error')
|
|
network_range.set_network_data(:ipapi, ipapi_data)
|
|
network_range.last_api_fetch = Time.current
|
|
network_range.save!
|
|
|
|
Rails.logger.info "Successfully fetched IPAPI data for #{network_range.cidr}"
|
|
else
|
|
Rails.logger.warn "IPAPI returned error for #{network_range.cidr}: #{ipapi_data}"
|
|
end
|
|
rescue => e
|
|
Rails.logger.error "Failed to fetch IPAPI data for network_range #{network_range_id}: #{e.message}"
|
|
Rails.logger.error e.backtrace.join("\n")
|
|
end
|
|
end
|