Skip to content

Instantly share code, notes, and snippets.

@dwilkie
Created February 21, 2020 01:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dwilkie/3b3a1877f37e536c020bb148700b2b8d to your computer and use it in GitHub Desktop.
Save dwilkie/3b3a1877f37e536c020bb148700b2b8d to your computer and use it in GitHub Desktop.
SCFM Paginate Contacts Example
require "net/http"
require "uri"
require "pry"
require "link-header-parser" # https://github.com/jgarber623/link-header-parser-ruby
require "time"
SOURCE_HOST = "https://dashboard.ews1294.info"
SOURCE_API_KEY = "[your API key]"
DESTINATION_HOST = "https://scfm.somleng.org"
DESTINATION_API_KEY = "[your API key]"
page = 1
source_uri = URI.parse("#{SOURCE_HOST}/api/contacts")
destination_uri = URI.parse("#{DESTINATION_HOST}/api/contacts")
source_http = Net::HTTP.new(source_uri.host, source_uri.port)
source_http.use_ssl = true
destination_http = Net::HTTP.new(destination_uri.host, destination_uri.port)
destination_http.use_ssl = true
next_source_link = "#{SOURCE_HOST}/api/contacts?page=55"
while !next_source_link.nil?
puts "Fetching: #{next_source_link}"
source_request = Net::HTTP::Get.new(next_source_link)
source_request["Authorization"] = "Bearer #{SOURCE_API_KEY}"
source_response = source_http.request(source_request)
link_headers = LinkHeaderParser.parse(source_response["Link"], base: SOURCE_HOST)
next_source_link = link_headers.find { |link_header| link_header.relations == "next" }&.target
source_response_payload = JSON.parse(source_response.body)
source_response_payload.each do |source_contact_data|
destination_request_data = source_contact_data.slice("msisdn", "metadata")
destination_request_data["metadata"]["imported_at"] = Time.now.utc.iso8601
destination_request_data["metadata"]["originally_created_at"] = source_contact_data.fetch("created_at")
destination_request_data["metadata"]["originally_updated_at"] = source_contact_data.fetch("updated_at")
destination_request = Net::HTTP::Post.new(destination_uri.request_uri)
destination_request["Content-Type"] = "application/json"
destination_request["Authorization"] = "Bearer #{DESTINATION_API_KEY}"
destination_request.body = destination_request_data.to_json
destination_response = destination_http.request(destination_request)
unless destination_response.kind_of?(Net::HTTPSuccess)
error = {
"message" => destination_response.body,
"code" => destination_response.code
}.reject { |_k, v| v.empty? }
puts "Failed to create contact: #{destination_request_data}. Error: #{error}"
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment