Class: CardDB::Resources::Decks

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

Overview

Decks resource for hosted decks and external deck hydration. rubocop:disable Metrics/ClassLength

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

#access(token:, cache: nil) ⇒ Object

Fetch token-authorized published data using an exchanged access token.



207
208
209
210
211
212
213
# File 'lib/carddb/resources/decks.rb', line 207

def access(token:, cache: nil)
  key = cache_key('decks', 'access', token: token)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck_access, { token: token })
    data['deckAccess'] ? Deck.new(data['deckAccess'], client: client) : nil
  end
end

#access_token_issuers(deck_id:, cache: nil) ⇒ Object



313
314
315
316
317
318
319
# File 'lib/carddb/resources/decks.rb', line 313

def access_token_issuers(deck_id:, cache: nil)
  key = cache_key('decks', 'access_token_issuers', deck_id: deck_id)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck_access_token_issuers, { deckId: deck_id })
    (data['deckAccessTokenIssuers'] || []).map { |issuer| DeckAccessTokenIssuer.new(issuer, client: client) }
  end
end

#add_entry(input:) ⇒ Object



382
383
384
385
# File 'lib/carddb/resources/decks.rb', line 382

def add_entry(input:)
  data = connection.execute(QueryBuilder.add_deck_entry, { input: input })
  DeckEntryMutationPayload.new(data['deckEntryAdd'], client: client)
end

#api_application_accesses(deck_id:, include_revoked: nil, cache: nil) ⇒ Object



321
322
323
324
325
326
327
328
329
330
# File 'lib/carddb/resources/decks.rb', line 321

def api_application_accesses(deck_id:, include_revoked: nil, cache: nil)
  variables = build_variables(deckId: deck_id, includeRevoked: include_revoked)
  key = cache_key('decks', 'api_application_accesses', **variables)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck_api_application_accesses, variables)
    (data['deckApiApplicationAccesses'] || []).map do |access|
      DeckAPIApplicationAccess.new(access, client: client)
    end
  end
end

#archive(id:) ⇒ Object



490
491
492
493
# File 'lib/carddb/resources/decks.rb', line 490

def archive(id:)
  data = connection.execute(QueryBuilder.archive_deck, { id: id })
  Deck.new(data['deckArchive'], client: client)
end

#archive_import_format(id:) ⇒ Object



469
470
471
472
# File 'lib/carddb/resources/decks.rb', line 469

def archive_import_format(id:)
  data = connection.execute(QueryBuilder.archive_deck_import_format, { id: id })
  DeckImportFormatDefinition.new(data['deckImportFormatArchive'], client: client)
end

#claim(id:, input:) ⇒ Object



367
368
369
370
# File 'lib/carddb/resources/decks.rb', line 367

def claim(id:, input:)
  data = connection.execute(QueryBuilder.claim_deck, { id: id, input: input })
  DeckOwnershipTransferPayload.new(data['deckClaim'], client: client)
end

#collaborators(deck_id:, cache: nil) ⇒ Object

List collaborators for a deck.



288
289
290
291
292
293
294
# File 'lib/carddb/resources/decks.rb', line 288

def collaborators(deck_id:, cache: nil)
  key = cache_key('decks', 'collaborators', deck_id: deck_id)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck_collaborators, { deckId: deck_id })
    (data['deckCollaborators'] || []).map { |collaborator| DeckCollaborator.new(collaborator, client: client) }
  end
end

#copy(id:, input:) ⇒ Object



377
378
379
380
# File 'lib/carddb/resources/decks.rb', line 377

def copy(id:, input:)
  data = connection.execute(QueryBuilder.copy_deck, { id: id, input: input })
  DeckCopyPayload.new(data['deckCopy'], client: client)
end

#create(input:) ⇒ Object

Create a hosted deck.



344
345
346
347
# File 'lib/carddb/resources/decks.rb', line 344

def create(input:)
  data = connection.execute(QueryBuilder.create_deck, { input: input })
  Deck.new(data['deckCreate'], client: client)
end

#create_access_token_issuer(input:) ⇒ Object

rubocop:enable Naming/PredicateMethod



551
552
553
554
# File 'lib/carddb/resources/decks.rb', line 551

def create_access_token_issuer(input:)
  data = connection.execute(QueryBuilder.create_deck_access_token_issuer, { input: input })
  DeckAccessTokenIssuer.new(data['deckAccessTokenIssuerCreate'], client: client)
end

#create_embed_token(input:) ⇒ Object

rubocop:enable Naming/PredicateMethod



539
540
541
542
# File 'lib/carddb/resources/decks.rb', line 539

def create_embed_token(input:)
  data = connection.execute(QueryBuilder.create_deck_embed_token, { input: input })
  DeckEmbedTokenCreatePayload.new(data['deckEmbedTokenCreate'], client: client)
end

#create_import_format(input:) ⇒ Object



459
460
461
462
# File 'lib/carddb/resources/decks.rb', line 459

def create_import_format(input:)
  data = connection.execute(QueryBuilder.create_deck_import_format, { input: input })
  DeckImportFormatDefinition.new(data['deckImportFormatCreate'], client: client)
end

#create_preview_token(input:) ⇒ Object

Create a revocable draft preview token.



526
527
528
529
# File 'lib/carddb/resources/decks.rb', line 526

def create_preview_token(input:)
  data = connection.execute(QueryBuilder.create_deck_preview_token, { input: input })
  DeckPreviewTokenCreatePayload.new(data['deckPreviewTokenCreate'], client: client)
end

#delete(id:) ⇒ Object

Delete a hosted deck. rubocop:disable Naming/PredicateMethod



601
602
603
604
# File 'lib/carddb/resources/decks.rb', line 601

def delete(id:)
  data = connection.execute(QueryBuilder.delete_deck, { id: id })
  !!data['deckDelete']
end

#draft_diff(id:, cache: nil) ⇒ Object



215
216
217
218
219
220
221
# File 'lib/carddb/resources/decks.rb', line 215

def draft_diff(id:, cache: nil)
  key = cache_key('decks', 'draft_diff', id: id)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck_draft_diff, { id: id })
    DeckDiff.new(data['deckDraftDiff'], client: client)
  end
end

#embed(token:, cache: nil) ⇒ Object

Fetch published embed data using a revocable embed token.



198
199
200
201
202
203
204
# File 'lib/carddb/resources/decks.rb', line 198

def embed(token:, cache: nil)
  key = cache_key('decks', 'embed', token: token)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck_embed, { token: token })
    data['deckEmbed'] ? Deck.new(data['deckEmbed'], client: client) : nil
  end
end

#embed_tokens(deck_id:, cache: nil) ⇒ Object



305
306
307
308
309
310
311
# File 'lib/carddb/resources/decks.rb', line 305

def embed_tokens(deck_id:, cache: nil)
  key = cache_key('decks', 'embed_tokens', deck_id: deck_id)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck_embed_tokens, { deckId: deck_id })
    (data['deckEmbedTokens'] || []).map { |token| DeckEmbedToken.new(token, client: client) }
  end
end

#exchange_access_token(input:) ⇒ Object

rubocop:enable Naming/PredicateMethod



583
584
585
586
587
588
# File 'lib/carddb/resources/decks.rb', line 583

def exchange_access_token(input:)
  config.require_secret_credential!('decks.exchange_access_token')

  data = connection.execute(QueryBuilder.exchange_deck_access_token, { input: input })
  DeckAccessTokenExchangePayload.new(data['deckAccessTokenExchange'], client: client)
end

#export_deck(id:, format: 'SIMPLE_TEXT', cache: nil) ⇒ Object



249
250
251
252
253
254
255
256
# File 'lib/carddb/resources/decks.rb', line 249

def export_deck(id:, format: 'SIMPLE_TEXT', cache: nil)
  variables = { id: id, format: format }
  key = cache_key('decks', 'export_deck', **variables)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck_export, variables)
    DeckExportPayload.new(data['deckExport'], client: client)
  end
end

#fetch(id, cache: nil) ⇒ Object

Fetch a hosted deck by CardDB UUID.



85
86
87
88
89
90
91
# File 'lib/carddb/resources/decks.rb', line 85

def fetch(id, cache: nil)
  key = cache_key('decks', 'fetch', id: id)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.fetch_deck, { id: id })
    data['fetchDeck'] ? Deck.new(data['fetchDeck'], client: client) : nil
  end
end

#fetch_by_external_ref(external_ref:, cache: nil) ⇒ Object

Fetch a hosted deck by external reference for the current API application.



144
145
146
147
148
149
150
# File 'lib/carddb/resources/decks.rb', line 144

def fetch_by_external_ref(external_ref:, cache: nil)
  key = cache_key('decks', 'fetch_by_external_ref', external_ref: external_ref)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.fetch_deck_by_external_ref, { externalRef: external_ref })
    data['fetchDeckByExternalRef'] ? Deck.new(data['fetchDeckByExternalRef'], client: client) : nil
  end
end

#fetch_by_slug(slug:, publisher_slug: nil, game_key: nil, cache: nil) ⇒ Object

Fetch a hosted deck by canonical or historical slug.



112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/carddb/resources/decks.rb', line 112

def fetch_by_slug(slug:, publisher_slug: nil, game_key: nil, cache: nil)
  resolved_publisher = resolve_publisher(publisher_slug)
  resolved_game = resolve_game(game_key)
  validate_access!(resolved_publisher, resolved_game)

  key = cache_key('decks', 'fetch_by_slug', publisher_slug: resolved_publisher, game_key: resolved_game, slug: slug)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(
      QueryBuilder.fetch_deck_by_slug,
      { publisherSlug: resolved_publisher, gameKey: resolved_game, slug: slug }
    )
    data['fetchDeckBySlug'] ? Deck.new(data['fetchDeckBySlug'], client: client) : nil
  end
end

#fetch_import_format(id, cache: nil) ⇒ Object



446
447
448
449
450
451
452
# File 'lib/carddb/resources/decks.rb', line 446

def fetch_import_format(id, cache: nil)
  key = cache_key('decks', 'fetch_import_format', id: id)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck_import_format, { id: id })
    data['deckImportFormat'] ? DeckImportFormatDefinition.new(data['deckImportFormat'], client: client) : nil
  end
end

#fetch_mine(id, cache: nil) ⇒ Object

Fetch one deck owned by the current account or API application.



103
104
105
106
107
108
109
# File 'lib/carddb/resources/decks.rb', line 103

def fetch_mine(id, cache: nil)
  key = cache_key('decks', 'fetch_mine', id: id)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.my_deck, { id: id })
    data['myDeck'] ? Deck.new(data['myDeck'], client: client) : nil
  end
end

#fetch_version(id, cache: nil) ⇒ Object

Fetch one immutable published deck version.



162
163
164
165
166
167
168
# File 'lib/carddb/resources/decks.rb', line 162

def fetch_version(id, cache: nil)
  key = cache_key('decks', 'fetch_version', id: id)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck_version, { id: id })
    data['deckVersion'] ? DeckVersion.new(data['deckVersion'], client: client) : nil
  end
end

#get(id, cache: nil) ⇒ Object

Fetch by UUID using the ownership-aware deck API.



94
95
96
97
98
99
100
# File 'lib/carddb/resources/decks.rb', line 94

def get(id, cache: nil)
  key = cache_key('decks', 'get', id: id)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck, { id: id })
    data['deck'] ? Deck.new(data['deck'], client: client) : nil
  end
end

#get_by_external_ref(external_ref:, cache: nil) ⇒ Object

Fetch by external reference using the ownership-aware deckByExternalRef API.



153
154
155
156
157
158
159
# File 'lib/carddb/resources/decks.rb', line 153

def get_by_external_ref(external_ref:, cache: nil)
  key = cache_key('decks', 'get_by_external_ref', external_ref: external_ref)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck_by_external_ref, { externalRef: external_ref })
    data['deckByExternalRef'] ? Deck.new(data['deckByExternalRef'], client: client) : nil
  end
end

#get_by_slug(slug:, publisher_slug: nil, game_key: nil, cache: nil) ⇒ Object

Fetch by slug using the ownership-aware deckBySlug API.



128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/carddb/resources/decks.rb', line 128

def get_by_slug(slug:, publisher_slug: nil, game_key: nil, cache: nil)
  resolved_publisher = resolve_publisher(publisher_slug)
  resolved_game = resolve_game(game_key)
  validate_access!(resolved_publisher, resolved_game)

  key = cache_key('decks', 'get_by_slug', publisher_slug: resolved_publisher, game_key: resolved_game, slug: slug)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(
      QueryBuilder.deck_by_slug,
      { publisherSlug: resolved_publisher, gameKey: resolved_game, slug: slug }
    )
    data['deckBySlug'] ? Deck.new(data['deckBySlug'], client: client) : nil
  end
end

#grant_api_application_access(input:) ⇒ Object



568
569
570
571
# File 'lib/carddb/resources/decks.rb', line 568

def grant_api_application_access(input:)
  data = connection.execute(QueryBuilder.grant_deck_api_application_access, { input: input })
  DeckAPIApplicationAccess.new(data['deckApiApplicationAccessGrant'], client: client)
end

#hydrate_deck_entries(input:, cache: nil) ⇒ Object



241
242
243
244
245
246
247
# File 'lib/carddb/resources/decks.rb', line 241

def hydrate_deck_entries(input:, cache: nil)
  key = cache_key('decks', 'hydrate_deck_entries', input: input)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck_hydrate_entries, { input: input })
    DeckHydrateEntriesPayload.new(data['deckHydrateEntries'], client: client)
  end
end

#hydrate_entries(dataset_key:, entries:, publisher_slug: nil, game_key: nil, identifier_field: nil, cache: nil) ⇒ Object

Hydrate third-party-owned deck entries without storing them in CardDB.



608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
# File 'lib/carddb/resources/decks.rb', line 608

def hydrate_entries(dataset_key:, entries:, publisher_slug: nil, game_key: nil, identifier_field: nil, cache: nil)
  return [] if entries.empty?

  resolved_publisher = resolve_publisher(publisher_slug)
  resolved_game = resolve_game(game_key)
  validate_access!(resolved_publisher, resolved_game)

  identifiers = entries.map { |entry| entry_identifier(entry) }
  key = cache_key(
    'decks',
    'hydrate_entries',
    publisher_slug: resolved_publisher,
    game_key: resolved_game,
    dataset_key: dataset_key,
    identifiers: identifiers
  )
  records = with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(
      QueryBuilder.fetch_records_by_identifier,
      {
        publisherSlug: resolved_publisher,
        gameKey: resolved_game,
        datasetKey: dataset_key,
        identifiers: identifiers
      }
    )
    (data['fetchRecordsByIdentifier'] || []).map { |record| Record.new(record, client: client) }
  end

  records_by_identifier = records_by_deck_identifier(records, identifiers, identifier_field)
  entries.map do |entry|
    entry.merge(record: records_by_identifier[entry_identifier(entry)])
  end
end

#import_deck(input:) ⇒ Object

Import a decklist into an existing deck or dry-run resolution.



411
412
413
414
# File 'lib/carddb/resources/decks.rb', line 411

def import_deck(input:)
  data = connection.execute(QueryBuilder.import_deck, { input: input })
  DeckImportPayload.new(data['deckImport'], client: client)
end

#import_formats(game_id:, include_archived: nil, first: nil, after: nil, cache: nil) ⇒ Object



416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
# File 'lib/carddb/resources/decks.rb', line 416

def import_formats(game_id:, include_archived: nil, first: nil, after: nil, cache: nil)
  query = QueryBuilder.deck_import_formats(
    game_id: game_id,
    include_archived: include_archived,
    first: first,
    after: after
  )
  variables = build_variables(gameId: game_id, includeArchived: include_archived, first: first, after: after)
  key = cache_key('decks', 'import_formats', **variables)

  data = with_cache(key, resource: :decks, cache: cache) do
    connection.execute(query, variables)
  end

  Collection.new(
    data['deckImportFormats'],
    item_class: DeckImportFormatDefinition,
    next_page_loader: lambda { |cursor|
      import_formats(
        game_id: game_id,
        include_archived: include_archived,
        first: first,
        after: cursor,
        cache: cache
      )
    },
    client: client
  )
end

#list_app(filter: nil, first: nil, after: nil, cache: nil) ⇒ Object

List app-owned decks for the current secret-key API application.



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/carddb/resources/decks.rb', line 47

def list_app(filter: nil, first: nil, after: nil, cache: nil)
  config.require_secret_credential!('decks.list_app')

  query = QueryBuilder.app_decks(filter: filter, first: first, after: after)
  variables = build_variables(filter: filter, first: first, after: after)
  key = cache_key('decks', 'list_app', **variables)

  data = with_cache(key, resource: :decks, cache: cache) do
    connection.execute(query, variables)
  end

  Collection.new(
    data['appDecks'],
    item_class: Deck,
    next_page_loader: ->(cursor) { list_app(filter: filter, first: first, after: cursor, cache: cache) },
    client: client
  )
end

#list_mine(first: nil, after: nil, include_archived: nil, cache: nil) ⇒ Object

List decks owned by the current account or API application.



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/carddb/resources/decks.rb', line 9

def list_mine(first: nil, after: nil, include_archived: nil, cache: nil)
  query = QueryBuilder.list_my_decks(first: first, after: after, include_archived: include_archived)
  variables = build_variables(first: first, after: after, includeArchived: include_archived)
  key = cache_key('decks', 'list_mine', **variables)

  data = with_cache(key, resource: :decks, cache: cache) do
    connection.execute(query, variables)
  end

  Collection.new(
    data['myDecks'],
    item_class: Deck,
    next_page_loader: lambda { |cursor|
      list_mine(first: first, after: cursor, include_archived: include_archived, cache: cache)
    },
    client: client
  )
end

#list_public(filter: nil, first: nil, after: nil, cache: nil) ⇒ Object

List published live decks eligible for public discovery.



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/carddb/resources/decks.rb', line 67

def list_public(filter: nil, first: nil, after: nil, cache: nil)
  query = QueryBuilder.public_decks(filter: filter, first: first, after: after)
  variables = build_variables(filter: filter, first: first, after: after)
  key = cache_key('decks', 'list_public', **variables)

  data = with_cache(key, resource: :decks, cache: cache) do
    connection.execute(query, variables)
  end

  Collection.new(
    data['publicDecks'],
    item_class: Deck,
    next_page_loader: ->(cursor) { list_public(filter: filter, first: first, after: cursor, cache: cache) },
    client: client
  )
end

#list_versions(deck_id:, first: nil, after: nil, cache: nil) ⇒ Object

List immutable published versions for a deck.



171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/carddb/resources/decks.rb', line 171

def list_versions(deck_id:, first: nil, after: nil, cache: nil)
  query = QueryBuilder.deck_versions(first: first, after: after)
  variables = build_variables(deckId: deck_id, first: first, after: after)
  key = cache_key('decks', 'list_versions', **variables)

  data = with_cache(key, resource: :decks, cache: cache) do
    connection.execute(query, variables)
  end

  Collection.new(
    data['deckVersions'],
    item_class: DeckVersion,
    next_page_loader: ->(cursor) { list_versions(deck_id: deck_id, first: first, after: cursor, cache: cache) },
    client: client
  )
end

#list_viewer(filter: nil, first: nil, after: nil, cache: nil) ⇒ Object

List decks owned by the current account or OAuth grant.



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/carddb/resources/decks.rb', line 29

def list_viewer(filter: nil, first: nil, after: nil, cache: nil)
  query = QueryBuilder.viewer_decks(filter: filter, first: first, after: after)
  variables = build_variables(filter: filter, first: first, after: after)
  key = cache_key('decks', 'list_viewer', **variables)

  data = with_cache(key, resource: :decks, cache: cache) do
    connection.execute(query, variables)
  end

  Collection.new(
    data['viewerDecks'],
    item_class: Deck,
    next_page_loader: ->(cursor) { list_viewer(filter: filter, first: first, after: cursor, cache: cache) },
    client: client
  )
end

#my_api_application_accesses(application_id: nil, cache: nil) ⇒ Object



332
333
334
335
336
337
338
339
340
341
# File 'lib/carddb/resources/decks.rb', line 332

def my_api_application_accesses(application_id: nil, cache: nil)
  variables = build_variables(applicationId: application_id)
  key = cache_key('decks', 'my_api_application_accesses', **variables)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.my_deck_api_application_accesses, variables)
    (data['myDeckApiApplicationAccesses'] || []).map do |access|
      DeckAPIApplicationAccess.new(access, client: client)
    end
  end
end

#preview(token:, cache: nil) ⇒ Object

Fetch current draft data using a revocable preview token.



189
190
191
192
193
194
195
# File 'lib/carddb/resources/decks.rb', line 189

def preview(token:, cache: nil)
  key = cache_key('decks', 'preview', token: token)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck_preview, { token: token })
    data['deckPreview'] ? Deck.new(data['deckPreview'], client: client) : nil
  end
end

#preview_tokens(deck_id:, cache: nil) ⇒ Object

List draft preview tokens for a deck.



297
298
299
300
301
302
303
# File 'lib/carddb/resources/decks.rb', line 297

def preview_tokens(deck_id:, cache: nil)
  key = cache_key('decks', 'preview_tokens', deck_id: deck_id)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck_preview_tokens, { deckId: deck_id })
    (data['deckPreviewTokens'] || []).map { |token| DeckPreviewToken.new(token, client: client) }
  end
end

#publish(id:, input:) ⇒ Object

Publish the current draft as an immutable deck version.



480
481
482
483
# File 'lib/carddb/resources/decks.rb', line 480

def publish(id:, input:)
  data = connection.execute(QueryBuilder.publish_deck, { id: id, input: input })
  DeckPublishPayload.new(data['deckPublish'], client: client)
end

#remove_collaborator(deck_id:, account_id:) ⇒ Object

Remove a deck collaborator. rubocop:disable Naming/PredicateMethod



516
517
518
519
520
521
522
# File 'lib/carddb/resources/decks.rb', line 516

def remove_collaborator(deck_id:, account_id:)
  data = connection.execute(
    QueryBuilder.remove_deck_collaborator,
    { deckId: deck_id, accountId:  }
  )
  !!data['deckCollaboratorRemove']
end

#remove_entry(id:, expected_draft_revision:) ⇒ Object



392
393
394
395
396
397
398
# File 'lib/carddb/resources/decks.rb', line 392

def remove_entry(id:, expected_draft_revision:)
  data = connection.execute(
    QueryBuilder.remove_deck_entry,
    { id: id, expectedDraftRevision: expected_draft_revision }
  )
  DeckEntryMutationPayload.new(data['deckEntryRemove'], client: client)
end

#remove_invalid_entries(id:, input:) ⇒ Object



485
486
487
488
# File 'lib/carddb/resources/decks.rb', line 485

def remove_invalid_entries(id:, input:)
  data = connection.execute(QueryBuilder.remove_invalid_deck_entries, { id: id, input: input })
  Deck.new(data['deckRemoveInvalidEntries'], client: client)
end

#reorder_entries(deck_id:, input:) ⇒ Object



400
401
402
403
# File 'lib/carddb/resources/decks.rb', line 400

def reorder_entries(deck_id:, input:)
  data = connection.execute(QueryBuilder.reorder_deck_entries, { deckId: deck_id, input: input })
  DeckEntryReorderPayload.new(data['deckEntryReorder'], client: client)
end

#replace_entries(deck_id:, input:) ⇒ Object



405
406
407
408
# File 'lib/carddb/resources/decks.rb', line 405

def replace_entries(deck_id:, input:)
  data = connection.execute(QueryBuilder.replace_deck_entries, { deckId: deck_id, input: input })
  DeckEntriesReplacePayload.new(data['deckEntriesReplace'], client: client)
end

#restore(id:) ⇒ Object



495
496
497
498
# File 'lib/carddb/resources/decks.rb', line 495

def restore(id:)
  data = connection.execute(QueryBuilder.restore_deck, { id: id })
  Deck.new(data['deckRestore'], client: client)
end

#revoke_access_token(id:) ⇒ Object

rubocop:disable Naming/PredicateMethod



591
592
593
594
595
596
# File 'lib/carddb/resources/decks.rb', line 591

def revoke_access_token(id:)
  config.require_secret_credential!('decks.revoke_access_token')

  data = connection.execute(QueryBuilder.revoke_deck_access_token, { id: id })
  !!data['deckAccessTokenRevoke']
end

#revoke_access_token_issuer(id:) ⇒ Object

rubocop:disable Naming/PredicateMethod



557
558
559
560
# File 'lib/carddb/resources/decks.rb', line 557

def revoke_access_token_issuer(id:)
  data = connection.execute(QueryBuilder.revoke_deck_access_token_issuer, { id: id })
  !!data['deckAccessTokenIssuerRevoke']
end

#revoke_access_token_issuer_signing_key(id:) ⇒ Object

rubocop:enable Naming/PredicateMethod



563
564
565
566
# File 'lib/carddb/resources/decks.rb', line 563

def revoke_access_token_issuer_signing_key(id:)
  data = connection.execute(QueryBuilder.revoke_deck_access_token_issuer_signing_key, { id: id })
  DeckAccessTokenIssuer.new(data['deckAccessTokenIssuerSigningKeyRevoke'], client: client)
end

#revoke_api_application_access(deck_id:, api_application_id:) ⇒ Object

rubocop:disable Naming/PredicateMethod



574
575
576
577
578
579
580
# File 'lib/carddb/resources/decks.rb', line 574

def revoke_api_application_access(deck_id:, api_application_id:)
  data = connection.execute(
    QueryBuilder.revoke_deck_api_application_access,
    { deckId: deck_id, apiApplicationId: api_application_id }
  )
  !!data['deckApiApplicationAccessRevoke']
end

#revoke_embed_token(id:) ⇒ Object

rubocop:disable Naming/PredicateMethod



545
546
547
548
# File 'lib/carddb/resources/decks.rb', line 545

def revoke_embed_token(id:)
  data = connection.execute(QueryBuilder.revoke_deck_embed_token, { id: id })
  !!data['deckEmbedTokenRevoke']
end

#revoke_preview_token(id:) ⇒ Object

Revoke a draft preview token. rubocop:disable Naming/PredicateMethod



533
534
535
536
# File 'lib/carddb/resources/decks.rb', line 533

def revoke_preview_token(id:)
  data = connection.execute(QueryBuilder.revoke_deck_preview_token, { id: id })
  !!data['deckPreviewTokenRevoke']
end

#section_definitions(publisher_slug: nil, game_key: nil, game_id: nil, ruleset_key: nil, ruleset_version_id: nil, cache: nil) ⇒ Object



258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
# File 'lib/carddb/resources/decks.rb', line 258

def section_definitions(
  publisher_slug: nil,
  game_key: nil,
  game_id: nil,
  ruleset_key: nil,
  ruleset_version_id: nil,
  cache: nil
)
  query = QueryBuilder.deck_section_definitions(
    publisher_slug: publisher_slug,
    game_key: game_key,
    game_id: game_id,
    ruleset_key: ruleset_key,
    ruleset_version_id: ruleset_version_id
  )
  variables = build_variables(
    publisherSlug: publisher_slug,
    gameKey: game_key,
    gameId: game_id,
    rulesetKey: ruleset_key,
    rulesetVersionId: ruleset_version_id
  )
  key = cache_key('decks', 'section_definitions', **variables)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(query, variables)
    (data['deckSectionDefinitions'] || []).map { |definition| DeckSectionDefinition.new(definition, client: client) }
  end
end

#test_import_format(input:) ⇒ Object



454
455
456
457
# File 'lib/carddb/resources/decks.rb', line 454

def test_import_format(input:)
  data = connection.execute(QueryBuilder.deck_import_format_test, { input: input })
  DeckImportFormatTestPayload.new(data['deckImportFormatTest'], client: client)
end

#transfer_ownership(id:, input:) ⇒ Object



372
373
374
375
# File 'lib/carddb/resources/decks.rb', line 372

def transfer_ownership(id:, input:)
  data = connection.execute(QueryBuilder.transfer_deck_ownership, { id: id, input: input })
  DeckOwnershipTransferPayload.new(data['deckTransferOwnership'], client: client)
end

#unarchive_import_format(id:) ⇒ Object



474
475
476
477
# File 'lib/carddb/resources/decks.rb', line 474

def unarchive_import_format(id:)
  data = connection.execute(QueryBuilder.unarchive_deck_import_format, { id: id })
  DeckImportFormatDefinition.new(data['deckImportFormatUnarchive'], client: client)
end

#unpublish(id:) ⇒ Object



500
501
502
503
# File 'lib/carddb/resources/decks.rb', line 500

def unpublish(id:)
  data = connection.execute(QueryBuilder.unpublish_deck, { id: id })
  Deck.new(data['deckUnpublish'], client: client)
end

#update(id:, input:) ⇒ Object

Update a hosted deck.



350
351
352
353
# File 'lib/carddb/resources/decks.rb', line 350

def update(id:, input:)
  data = connection.execute(QueryBuilder.update_deck, { id: id, input: input })
  Deck.new(data['deckUpdate'], client: client)
end

#update_entry(id:, input:) ⇒ Object



387
388
389
390
# File 'lib/carddb/resources/decks.rb', line 387

def update_entry(id:, input:)
  data = connection.execute(QueryBuilder.update_deck_entry, { id: id, input: input })
  DeckEntryMutationPayload.new(data['deckEntryUpdate'], client: client)
end

#update_import_format(id:, input:) ⇒ Object



464
465
466
467
# File 'lib/carddb/resources/decks.rb', line 464

def update_import_format(id:, input:)
  data = connection.execute(QueryBuilder.update_deck_import_format, { id: id, input: input })
  DeckImportFormatDefinition.new(data['deckImportFormatUpdate'], client: client)
end

#update_metadata(id:, input:) ⇒ Object

Update deck-level metadata without mutating entries.



356
357
358
# File 'lib/carddb/resources/decks.rb', line 356

def (id:, input:)
  update(id: id, input: input)
end

#upsert_by_external_ref(input:) ⇒ Object



360
361
362
363
364
365
# File 'lib/carddb/resources/decks.rb', line 360

def upsert_by_external_ref(input:)
  config.require_secret_credential!('decks.upsert_by_external_ref')

  data = connection.execute(QueryBuilder.upsert_deck_by_external_ref, { input: input })
  DeckUpsertByExternalRefPayload.new(data['deckUpsertByExternalRef'], client: client)
end

#upsert_collaborator(deck_id:, account_id:, role:) ⇒ Object

Create or update a deck collaborator.



506
507
508
509
510
511
512
# File 'lib/carddb/resources/decks.rb', line 506

def upsert_collaborator(deck_id:, account_id:, role:)
  data = connection.execute(
    QueryBuilder.upsert_deck_collaborator,
    { deckId: deck_id, accountId: , role: role }
  )
  DeckCollaborator.new(data['deckCollaboratorUpsert'], client: client)
end

#validate(id:, input: nil, cache: nil) ⇒ Object



232
233
234
235
236
237
238
239
# File 'lib/carddb/resources/decks.rb', line 232

def validate(id:, input: nil, cache: nil)
  variables = build_variables(id: id, input: input)
  key = cache_key('decks', 'validate', **variables)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck_validate, variables)
    DeckValidation.new(data['deckValidate'], client: client)
  end
end

#version_diff(from_version_id:, to_version_id:, cache: nil) ⇒ Object



223
224
225
226
227
228
229
230
# File 'lib/carddb/resources/decks.rb', line 223

def version_diff(from_version_id:, to_version_id:, cache: nil)
  variables = { fromVersionId: from_version_id, toVersionId: to_version_id }
  key = cache_key('decks', 'version_diff', **variables)
  with_cache(key, resource: :decks, cache: cache) do
    data = connection.execute(QueryBuilder.deck_version_diff, variables)
    DeckDiff.new(data['deckVersionDiff'], client: client)
  end
end