class NintendoEshop::Game

Attributes

art[RW]
categories[RW]
description[RW]
esrb[RW]
id[RW]
msrp[RW]
object_id[RW]
platform[RW]
release_date[RW]
sale_price[RW]
title[RW]
url[RW]

Public Class Methods

new(id: nil, object_id: nil) click to toggle source
# File lib/nintendo_eshop/game.rb, line 16
def initialize(id: nil, object_id: nil)
  self.id = id
  self.object_id = object_id
end
retrieve_by(id_type = {}) click to toggle source
# File lib/nintendo_eshop/game.rb, line 48
def retrieve_by(id_type = {})
  validate_argument(id_type)
  instance = new(id_type)
  instance.refresh
end

Private Class Methods

validate_argument(argument) click to toggle source
# File lib/nintendo_eshop/game.rb, line 56
def validate_argument(argument)
  valid_args = argument.keys == [:id] || argument.keys == [:object_id]
  raise InvalidArgumentError, "Only id: and object_id: have been implemented" unless valid_args
end

Public Instance Methods

current_price() click to toggle source
# File lib/nintendo_eshop/game.rb, line 35
def current_price
  sale_price || msrp
end
refresh() click to toggle source
# File lib/nintendo_eshop/game.rb, line 21
def refresh
  response = request(:post, to_json: body)
  result = if response.dig(:hits)&.any?
             response.dig(:hits, 0)
           elsif response.dig(:results)&.any?
             response.dig(:results, 0)
           else
             raise InvalidRequestError, "ID not found"
           end

  refresh_object(result)
  self
end
release_date_pretty() click to toggle source
# File lib/nintendo_eshop/game.rb, line 39
def release_date_pretty
  release_date.strftime("%b %d, %Y")
end
sale_percent() click to toggle source
# File lib/nintendo_eshop/game.rb, line 43
def sale_percent
  ((1 - (sale_price / msrp)).round(2) * 100).to_i.to_s + "%" if sale_price
end

Private Instance Methods

body() click to toggle source
# File lib/nintendo_eshop/game.rb, line 64
def body
  if id
    query_body
  elsif object_id
    object_body
  end
end
object_body() click to toggle source
# File lib/nintendo_eshop/game.rb, line 81
def object_body
  {
    "requests": [
      {
        "indexName": "noa_aem_game_en_us",
        "objectID": object_id.to_s,
        "attributesToRetrieve": "boxArt,categories,description,esrb,msrp,nsuid,objectID,platform,releaseDateMask,salePrice,title,url" # rubocop:disable Metrics/LineLength
      }
    ]
  }
end
query_body() click to toggle source
# File lib/nintendo_eshop/game.rb, line 72
def query_body
  {
    "query": id.to_s,
    "restrictSearchableAttributes": [
      "nsuid"
    ]
  }
end
refresh_object(result) click to toggle source
# File lib/nintendo_eshop/game.rb, line 101
def refresh_object(result) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
  self.art = "https://www.nintendo.com#{result.dig(:boxArt)}"
  self.categories = result.dig(:categories)
  self.description = result.dig(:description).tr("\n", " ").squeeze
  self.esrb = result.dig(:esrb)
  self.id = result.dig(:nsuid)
  self.msrp = result.dig(:msrp)
  self.object_id = result.dig(:objectID)
  self.platform = result.dig(:platform)
  self.release_date = Date.parse(result.dig(:releaseDateMask))
  self.sale_price = result.dig(:salePrice)
  self.title = result.dig(:title)
  self.url = "https://www.nintendo.com#{result.dig(:url)}"
end
resource_path() click to toggle source
# File lib/nintendo_eshop/game.rb, line 93
def resource_path
  if id
    "/1/indexes/noa_aem_game_en_us/query".freeze
  elsif object_id
    "/1/indexes/*/objects".freeze
  end
end