11
12
13
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
# File 'app/services/jumbotron/services/canonical/persist_line_observations.rb', line 11
def call
unless ingest.is_a?(Jumbotron::Canonical::LineIngestInput)
context.fail!(
application_error: Jumbotron::Errors::Canonical::InvalidLineIngestError.new(
details: { message: "ingest must be Canonical::LineIngestInput" }
)
)
return
end
if ingest.game_identities.blank? || ingest.provider.blank? || ingest.adapter_scope.blank? ||
ingest.observed_at.blank?
context.fail!(
application_error: Jumbotron::Errors::Canonical::InvalidLineIngestError.new(
details: { message: "provider, adapter_scope, observed_at, and game_identities are required" }
)
)
return
end
created = 0
updated = 0
bookmakers_created = 0
resolved_ids = {}
transaction do
game = resolve_game!
batch = ObservationBatch.create!(
provider: ingest.provider,
adapter_scope: ingest.adapter_scope,
observed_at: ingest.observed_at,
metadata: {}
)
ingest.observations.each do |row|
bookmaker = resolved_ids[bookmaker_key(row.bookmaker_identity)]
unless bookmaker
ensured = EnsureBookmaker.call(
identity: row.bookmaker_identity,
name: row.bookmaker_name,
observed_at: ingest.observed_at
)
fail_transaction!(ensured) unless ensured.success?
bookmaker = ensured.data[:bookmaker]
resolved_ids[bookmaker_key(row.bookmaker_identity)] = bookmaker
bookmakers_created += 1 if ensured.data[:created]
end
case persist_row!(game, bookmaker, batch, row)
when :created
created += 1
when :updated
updated += 1
end
end
context.observation_batch_id = batch.id
context.bookmakers_resolved = resolved_ids.size
context.bookmakers_created = bookmakers_created
context.observations_created = created
context.observations_updated = updated
end
rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotUnique => e
context.fail!(
application_error: Jumbotron::Errors::Canonical::MutationFailedError.new(
details: { message: e.message }
)
)
end
|