GordonDiggs/rayons

View on GitHub
app/models/discogs_wrapper.rb

Summary

Maintainability
A
0 mins
Test Coverage
require "net/https"
require "hashie"

class DiscogsWrapper
  class ReleaseNotFoundError < StandardError; end

  BASE_URL = "api.discogs.com".freeze

  def get_release(id)
    get("/releases/#{id}")
  end

  def search_releases(title, artist)
    get("/database/search", release_title: title, artist: artist, type: "release")
  end

  private

  def get(path, params = {})
    request =
      Net::HTTP::Get.new(
        "#{path}?#{params.to_query}",
        "Authorization" => authorization,
        "User-Agent" => user_agent,
      )

    response = http.request(request)

    if response.code == "200"
      hash = JSON.parse(response.body)
      Hashie::Mash.new(hash)
    elsif response.code == "404"
      raise ReleaseNotFoundError
    else
      raise "Discogs API request failed: #{response.code} #{response.body}"
    end
  end

  def http
    @http ||=
      Net::HTTP.new(BASE_URL, 443).tap do |h|
        h.use_ssl = true
        h.verify_mode = OpenSSL::SSL::VERIFY_PEER
      end
  end

  def authorization
    "Discogs key=#{ENV["DISCOGS_APP_KEY"]}, secret=#{ENV["DISCOGS_APP_SECRET"]}"
  end

  def user_agent
    "Rayons #{Rails.env}"
  end
end