Class: CardDB::Resources::Games

Inherits:
Base
  • Object
show all
Defined in:
lib/carddb/resources/games.rb

Overview

Games resource for searching and fetching games

Instance Attribute Summary

Attributes inherited from Base

#client, #config, #connection

Instance Method Summary collapse

Methods inherited from Base

#initialize

Constructor Details

This class inherits a constructor from CardDB::Resources::Base

Instance Method Details

#fetch(id, cache: nil) ⇒ Game?

Fetch a game by ID

Parameters:

  • id (String)

    The game UUID

  • cache (Boolean, nil) (defaults to: nil)

    Whether to cache (nil = use config setting)

Returns:

  • (Game, nil)

    The game or nil if not found



57
58
59
60
61
62
63
64
65
66
67
# File 'lib/carddb/resources/games.rb', line 57

def fetch(id, cache: nil)
  key = cache_key('games', 'fetch', id: id)
  with_cache(key, resource: :games, cache: cache) do
    query = QueryBuilder.fetch_game_by_id
    data = connection.execute(query, { id: id })

    return nil unless data['fetchGame']

    Game.new(data['fetchGame'], client: client)
  end
end

#fetch_many(ids) ⇒ Array<Game>

Fetch multiple games by IDs

Parameters:

  • ids (Array<String>)

    Array of game UUIDs (max 100)

Returns:

  • (Array<Game>)

    Array of games

Raises:

  • (ArgumentError)

    If more than 100 IDs provided



101
102
103
104
105
106
107
108
# File 'lib/carddb/resources/games.rb', line 101

def fetch_many(ids)
  raise ArgumentError, 'Maximum 100 IDs allowed' if ids.length > 100

  query = QueryBuilder.fetch_games
  data = connection.execute(query, { ids: ids })

  (data['fetchGames'] || []).map { |g| Game.new(g, client: client) }
end

#get(game_key:, publisher_slug: nil, cache: nil) ⇒ Game?

Get a game by publisher slug and game key

Parameters:

  • game_key (String)

    Game key (required)

  • publisher_slug (String, nil) (defaults to: nil)

    Publisher slug (uses default if not provided)

  • cache (Boolean, nil) (defaults to: nil)

    Whether to cache (nil = use config setting)

Returns:

  • (Game, nil)

    The game or nil if not found



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/carddb/resources/games.rb', line 75

def get(game_key:, publisher_slug: nil, cache: nil)
  resolved_publisher = resolve_publisher(publisher_slug)

  validate_access!(resolved_publisher, game_key)

  key = cache_key('games', 'get', publisher_slug: resolved_publisher, game_key: game_key)
  with_cache(key, resource: :games, cache: cache) do
    query = QueryBuilder.fetch_game_by_keys
    variables = {
      publisherSlug: resolved_publisher,
      gameKey: game_key
    }

    data = connection.execute(query, variables)

    return nil unless data['fetchGame']

    Game.new(data['fetchGame'], client: client)
  end
end

#search(publisher_slug: nil, search: nil, first: nil, after: nil) ⇒ Collection<Game>

Search for games

Parameters:

  • publisher_slug (String, nil) (defaults to: nil)

    Filter by publisher slug

  • search (String, nil) (defaults to: nil)

    Search by name

  • first (Integer, nil) (defaults to: nil)

    Maximum number of results

  • after (String, nil) (defaults to: nil)

    Cursor for pagination

Returns:



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/carddb/resources/games.rb', line 14

def search(publisher_slug: nil, search: nil, first: nil, after: nil)
  resolved_publisher = config.resolve_publisher(publisher_slug)
  validate_access!(resolved_publisher, nil) if resolved_publisher

  query = QueryBuilder.search_games(
    publisher_slug: resolved_publisher,
    search: search,
    first: first,
    after: after
  )

  variables = build_variables(
    publisherSlug: resolved_publisher,
    search: search,
    first: first,
    after: after
  )

  data = connection.execute(query, variables)

  # Create next page loader
  next_page_loader = lambda do |cursor|
    search(
      publisher_slug: publisher_slug,
      search: search,
      first: first,
      after: cursor
    )
  end

  Collection.new(
    data['searchGames'],
    item_class: Game,
    next_page_loader: next_page_loader,
    client: client
  )
end