noresponse 10.0.10 → 10.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/lib/no_response/events.rb +1 -1
  3. data/lib/no_response/models/shared/attendeedecided.rb +89 -0
  4. data/lib/no_response/models/shared/attendeedecided.rbi +44 -0
  5. data/lib/no_response/models/shared/attendeedecidedevent.rb +70 -0
  6. data/lib/no_response/models/shared/attendeedecidedevent.rbi +38 -0
  7. data/lib/no_response/models/shared/attendeeflagged.rb +95 -0
  8. data/lib/no_response/models/shared/attendeeflagged.rbi +44 -0
  9. data/lib/no_response/models/shared/attendeeflaggedevent.rb +70 -0
  10. data/lib/no_response/models/shared/attendeeflaggedevent.rbi +38 -0
  11. data/lib/no_response/models/shared/attendeeflaggedmatchstate.rb +19 -0
  12. data/lib/no_response/models/shared/attendeeflaggedmatchstate.rbi +9 -0
  13. data/lib/no_response/models/shared/conflicterrorcode.rb +1 -0
  14. data/lib/no_response/models/shared/metric.rb +2 -1
  15. data/lib/no_response/models/shared/policyhistoryitem.rb +1 -1
  16. data/lib/no_response/models/shared/screening.rb +20 -0
  17. data/lib/no_response/models/shared/screening.rbi +12 -0
  18. data/lib/no_response/models/shared/screeningcompleted.rb +146 -0
  19. data/lib/no_response/models/shared/screeningcompleted.rbi +74 -0
  20. data/lib/no_response/models/shared/screeningcompletedbyband.rb +52 -0
  21. data/lib/no_response/models/shared/screeningcompletedbyband.rbi +38 -0
  22. data/lib/no_response/models/shared/screeningcompletedevent.rb +70 -0
  23. data/lib/no_response/models/shared/screeningcompletedevent.rbi +38 -0
  24. data/lib/no_response/models/shared/screeningcompletedstatus.rb +17 -0
  25. data/lib/no_response/models/shared/screeningcompletedstatus.rbi +9 -0
  26. data/lib/no_response/models/shared/settings.rb +13 -3
  27. data/lib/no_response/models/shared/settings.rbi +6 -0
  28. data/lib/no_response/models/shared/settingsrequest.rb +12 -2
  29. data/lib/no_response/models/shared/settingsrequest.rbi +6 -0
  30. data/lib/no_response/models/shared/usage.rb +1 -1
  31. data/lib/no_response/models/shared/usagecount.rb +1 -1
  32. data/lib/no_response/models/shared/webhookdeliveryattempt.rb +1 -1
  33. data/lib/no_response/models/shared/webhookreplay.rb +1 -1
  34. data/lib/no_response/models/shared.rb +9 -0
  35. data/lib/no_response/sdkconfiguration.rb +2 -2
  36. data/lib/no_response/settings.rb +2 -2
  37. data/lib/no_response/usage.rb +1 -1
  38. data/lib/no_response/webhook_verification.rb +8 -2
  39. metadata +19 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d96b8580166e44806112443d1675e10b636e5c6c80d66163632042e21385c8d3
4
- data.tar.gz: 65422e8912fcbec275173a0d1b9fec1c0f78851bf8504a2fb6b8f8e06bf5db65
3
+ metadata.gz: 5d85291717a92183c2302b31d3d0f62582b5561a73c71ad96653471708f6f320
4
+ data.tar.gz: 21707ffd2be377765fbb485bb748edfd1f4aade4891ca596926088ccc0f7acc9
5
5
  SHA512:
6
- metadata.gz: a8db10579a56cdf898208e5ba72e7d8f0d74ac9b1622469ec9704d84d2880c02b7747fff0f10e3d09a17d3af8d037a6bf489e2d0af5d1f1d0cecfa2dc02384ea
7
- data.tar.gz: 399fe22b16111ba4de9cb5cb6b4e1a942682a9f931c8e5457ccc645e02c522a3571e34133adeae86a13270caee10c3d3226b81bbde7eb2c309035f4f62993d46
6
+ metadata.gz: faaf0a015394cdd88127765ae24a0674c25196b492d0b45b9b161af3b970c84ebe96a78e03939e39f843ca56e3327da05f0b635dd7b37d2fe80c6dc90d88dd75
7
+ data.tar.gz: 926780bbb6c32c1fe083c8600d760c1e78c30f23e4bab8d5d5d694b0d95afb173f17082c8e3a8de294888462bd38468bbc38f90b098c3520513702d9ad60395e
@@ -3029,7 +3029,7 @@ module NoResponse
3029
3029
  http_headers: nil
3030
3030
  )
3031
3031
  # start_screening - Start a screening.
3032
- # Start a screening of new attendees and everyone on watch or escalated, with an Idempotency-Key. It finishes completed, partial or failed minutes to hours later; poll it. The test environment screens with stand-ins that find no accounts.
3032
+ # Start a screening of new attendees and everyone on watch or escalated, with an Idempotency-Key. It finishes completed, partial or failed minutes to hours later; poll it. The answer carries estimated_spend; a screening whose estimate exceeds what the daily screening cap has left answers 409 screening_cap_exceeded. The test environment screens with stand-ins that find no accounts.
3033
3033
  request = Models::Operations::StartScreeningRequest.new(
3034
3034
  workspace_id: workspace_id,
3035
3035
  environment: environment,
@@ -0,0 +1,89 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # A reviewer recorded a decision on an attendee. The decision's note stays in the API. Sent once per recorded review; an attendee's latest review is its decision, so order by decided_at.
8
+ class AttendeeDecided
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # The attendee's event.
13
+ field(
14
+ :event_id,
15
+ ::String,
16
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("event_id"), required: true}}
17
+ )
18
+ # The attendee decided on.
19
+ field(
20
+ :attendee_id,
21
+ ::String,
22
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("attendee_id"), required: true}}
23
+ )
24
+ # The recorded review.
25
+ field(
26
+ :review_id,
27
+ ::String,
28
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("review_id"), required: true}}
29
+ )
30
+
31
+ field(
32
+ :decision,
33
+ Models::Shared::AttendeeDecision,
34
+ {
35
+ 'format_json': {
36
+ 'letter_case': ::NoResponse::Utils.field_name("decision"),
37
+ required: true,
38
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::AttendeeDecision, false)
39
+ }
40
+ }
41
+ )
42
+ # Who decided: the member's external user id, or the API key's label, as the attendee's decided_by.
43
+ field(
44
+ :decided_by,
45
+ ::String,
46
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("decided_by"), required: true}}
47
+ )
48
+ # When the decision was recorded; equal to the event's created_at.
49
+ field(
50
+ :decided_at,
51
+ ::String,
52
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("decided_at"), required: true}}
53
+ )
54
+
55
+ sig {
56
+ params(
57
+ event_id: ::String,
58
+ attendee_id: ::String,
59
+ review_id: ::String,
60
+ decision: Models::Shared::AttendeeDecision,
61
+ decided_by: ::String,
62
+ decided_at: ::String
63
+ )
64
+ .void
65
+ }
66
+ def initialize(event_id:, attendee_id:, review_id:, decision:, decided_by:, decided_at:)
67
+ @event_id = event_id
68
+ @attendee_id = attendee_id
69
+ @review_id = review_id
70
+ @decision = decision
71
+ @decided_by = decided_by
72
+ @decided_at = decided_at
73
+ end
74
+
75
+ sig { params(other: T.untyped).returns(T::Boolean) }
76
+ def ==(other)
77
+ return false unless other.is_a?(self.class)
78
+ return false unless @event_id == other.event_id
79
+ return false unless @attendee_id == other.attendee_id
80
+ return false unless @review_id == other.review_id
81
+ return false unless @decision == other.decision
82
+ return false unless @decided_by == other.decided_by
83
+ return false unless @decided_at == other.decided_at
84
+ true
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,44 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::AttendeeDecided
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::AttendeeDecided
9
+ def event_id
10
+ end
11
+
12
+ def event_id=(str_)
13
+ end
14
+
15
+ def attendee_id
16
+ end
17
+
18
+ def attendee_id=(str_)
19
+ end
20
+
21
+ def review_id
22
+ end
23
+
24
+ def review_id=(str_)
25
+ end
26
+
27
+ def decision
28
+ end
29
+
30
+ def decision=(str_)
31
+ end
32
+
33
+ def decided_by
34
+ end
35
+
36
+ def decided_by=(str_)
37
+ end
38
+
39
+ def decided_at
40
+ end
41
+
42
+ def decided_at=(str_)
43
+ end
44
+ end
@@ -0,0 +1,70 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # The attendee.decided event.
8
+ class AttendeeDecidedEvent
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # The event id, equal to the NR-Webhook-Id header and across redeliveries and every endpoint the event fans out to.
13
+ field :id, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("id"), required: true}}
14
+ # When the event was created. Equal across redeliveries; the signing timestamp header is per delivery.
15
+ field(
16
+ :created_at,
17
+ ::String,
18
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("created_at"), required: true}}
19
+ )
20
+ # A reviewer recorded a decision on an attendee. The decision's note stays in the API. Sent once per recorded review; an attendee's latest review is its decision, so order by decided_at.
21
+ field(
22
+ :data,
23
+ Models::Shared::AttendeeDecided,
24
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("data"), required: true}}
25
+ )
26
+ # Always attendee.decided.
27
+ field :type, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("type"), required: true}}
28
+ # Present, and true, only on an event sent by POST /v1/webhooks/{endpoint_id}/test: its data is a fixed example assessment, not one of the workspace's, so a receiver acknowledges it and applies nothing. Real events have no test member.
29
+ field(
30
+ :test,
31
+ Crystalline::Nilable.new(Crystalline::Boolean.new),
32
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("test")}}
33
+ )
34
+
35
+ sig {
36
+ params(
37
+ id: ::String,
38
+ created_at: ::String,
39
+ data: Models::Shared::AttendeeDecided,
40
+ type: ::String,
41
+ test: T.nilable(T::Boolean)
42
+ )
43
+ .void
44
+ }
45
+ def initialize(id:, created_at:, data:, type: "attendee.decided", test: nil)
46
+ @id = id
47
+ @created_at = created_at
48
+ @data = data
49
+ unless type == "attendee.decided"
50
+ raise ArgumentError, "Invalid value for type"
51
+ end
52
+
53
+ @type = "attendee.decided"
54
+ @test = test
55
+ end
56
+
57
+ sig { params(other: T.untyped).returns(T::Boolean) }
58
+ def ==(other)
59
+ return false unless other.is_a?(self.class)
60
+ return false unless @id == other.id
61
+ return false unless @created_at == other.created_at
62
+ return false unless @data == other.data
63
+ return false unless @type == other.type
64
+ return false unless @test == other.test
65
+ true
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,38 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::AttendeeDecidedEvent
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::AttendeeDecidedEvent
9
+ def id
10
+ end
11
+
12
+ def id=(str_)
13
+ end
14
+
15
+ def created_at
16
+ end
17
+
18
+ def created_at=(str_)
19
+ end
20
+
21
+ def data
22
+ end
23
+
24
+ def data=(str_)
25
+ end
26
+
27
+ def type
28
+ end
29
+
30
+ def type=(str_)
31
+ end
32
+
33
+ def test
34
+ end
35
+
36
+ def test=(str_)
37
+ end
38
+ end
@@ -0,0 +1,95 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # A screening recorded a finding on an attendee. It says which attendee and how severe, not what they posted, who they are or why: GET the attendee report for the findings. Sent once per screening that flags the attendee, so a re-screen of someone on watch announces them again.
8
+ class AttendeeFlagged
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # The attendee's event.
13
+ field(
14
+ :event_id,
15
+ ::String,
16
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("event_id"), required: true}}
17
+ )
18
+ # The flagged attendee.
19
+ field(
20
+ :attendee_id,
21
+ ::String,
22
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("attendee_id"), required: true}}
23
+ )
24
+ # The screening that flagged them.
25
+ field(
26
+ :screening_id,
27
+ ::String,
28
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("screening_id"), required: true}}
29
+ )
30
+
31
+ field(
32
+ :highest_band,
33
+ Models::Shared::HighestBand,
34
+ {
35
+ 'format_json': {
36
+ 'letter_case': ::NoResponse::Utils.field_name("highest_band"),
37
+ required: true,
38
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::HighestBand, false)
39
+ }
40
+ }
41
+ )
42
+ # How sure the screening is that the accounts it read are the attendee's. A finding on a possible match is at most moderate, on a probable match at most high.
43
+ field(
44
+ :match_state,
45
+ Models::Shared::AttendeeFlaggedMatchState,
46
+ {
47
+ 'format_json': {
48
+ 'letter_case': ::NoResponse::Utils.field_name("match_state"),
49
+ required: true,
50
+ 'decoder': ::NoResponse::Utils.enum_from_string(Models::Shared::AttendeeFlaggedMatchState, false)
51
+ }
52
+ }
53
+ )
54
+ # When the screening recorded the finding; equal to the event's created_at.
55
+ field(
56
+ :flagged_at,
57
+ ::String,
58
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("flagged_at"), required: true}}
59
+ )
60
+
61
+ sig {
62
+ params(
63
+ event_id: ::String,
64
+ attendee_id: ::String,
65
+ screening_id: ::String,
66
+ highest_band: Models::Shared::HighestBand,
67
+ match_state: Models::Shared::AttendeeFlaggedMatchState,
68
+ flagged_at: ::String
69
+ )
70
+ .void
71
+ }
72
+ def initialize(event_id:, attendee_id:, screening_id:, highest_band:, match_state:, flagged_at:)
73
+ @event_id = event_id
74
+ @attendee_id = attendee_id
75
+ @screening_id = screening_id
76
+ @highest_band = highest_band
77
+ @match_state = match_state
78
+ @flagged_at = flagged_at
79
+ end
80
+
81
+ sig { params(other: T.untyped).returns(T::Boolean) }
82
+ def ==(other)
83
+ return false unless other.is_a?(self.class)
84
+ return false unless @event_id == other.event_id
85
+ return false unless @attendee_id == other.attendee_id
86
+ return false unless @screening_id == other.screening_id
87
+ return false unless @highest_band == other.highest_band
88
+ return false unless @match_state == other.match_state
89
+ return false unless @flagged_at == other.flagged_at
90
+ true
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,44 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::AttendeeFlagged
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::AttendeeFlagged
9
+ def event_id
10
+ end
11
+
12
+ def event_id=(str_)
13
+ end
14
+
15
+ def attendee_id
16
+ end
17
+
18
+ def attendee_id=(str_)
19
+ end
20
+
21
+ def screening_id
22
+ end
23
+
24
+ def screening_id=(str_)
25
+ end
26
+
27
+ def highest_band
28
+ end
29
+
30
+ def highest_band=(str_)
31
+ end
32
+
33
+ def match_state
34
+ end
35
+
36
+ def match_state=(str_)
37
+ end
38
+
39
+ def flagged_at
40
+ end
41
+
42
+ def flagged_at=(str_)
43
+ end
44
+ end
@@ -0,0 +1,70 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # The attendee.flagged event.
8
+ class AttendeeFlaggedEvent
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # The event id, equal to the NR-Webhook-Id header and across redeliveries and every endpoint the event fans out to.
13
+ field :id, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("id"), required: true}}
14
+ # When the event was created. Equal across redeliveries; the signing timestamp header is per delivery.
15
+ field(
16
+ :created_at,
17
+ ::String,
18
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("created_at"), required: true}}
19
+ )
20
+ # A screening recorded a finding on an attendee. It says which attendee and how severe, not what they posted, who they are or why: GET the attendee report for the findings. Sent once per screening that flags the attendee, so a re-screen of someone on watch announces them again.
21
+ field(
22
+ :data,
23
+ Models::Shared::AttendeeFlagged,
24
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("data"), required: true}}
25
+ )
26
+ # Always attendee.flagged.
27
+ field :type, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("type"), required: true}}
28
+ # Present, and true, only on an event sent by POST /v1/webhooks/{endpoint_id}/test: its data is a fixed example assessment, not one of the workspace's, so a receiver acknowledges it and applies nothing. Real events have no test member.
29
+ field(
30
+ :test,
31
+ Crystalline::Nilable.new(Crystalline::Boolean.new),
32
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("test")}}
33
+ )
34
+
35
+ sig {
36
+ params(
37
+ id: ::String,
38
+ created_at: ::String,
39
+ data: Models::Shared::AttendeeFlagged,
40
+ type: ::String,
41
+ test: T.nilable(T::Boolean)
42
+ )
43
+ .void
44
+ }
45
+ def initialize(id:, created_at:, data:, type: "attendee.flagged", test: nil)
46
+ @id = id
47
+ @created_at = created_at
48
+ @data = data
49
+ unless type == "attendee.flagged"
50
+ raise ArgumentError, "Invalid value for type"
51
+ end
52
+
53
+ @type = "attendee.flagged"
54
+ @test = test
55
+ end
56
+
57
+ sig { params(other: T.untyped).returns(T::Boolean) }
58
+ def ==(other)
59
+ return false unless other.is_a?(self.class)
60
+ return false unless @id == other.id
61
+ return false unless @created_at == other.created_at
62
+ return false unless @data == other.data
63
+ return false unless @type == other.type
64
+ return false unless @test == other.test
65
+ true
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,38 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::AttendeeFlaggedEvent
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::AttendeeFlaggedEvent
9
+ def id
10
+ end
11
+
12
+ def id=(str_)
13
+ end
14
+
15
+ def created_at
16
+ end
17
+
18
+ def created_at=(str_)
19
+ end
20
+
21
+ def data
22
+ end
23
+
24
+ def data=(str_)
25
+ end
26
+
27
+ def type
28
+ end
29
+
30
+ def type=(str_)
31
+ end
32
+
33
+ def test
34
+ end
35
+
36
+ def test=(str_)
37
+ end
38
+ end
@@ -0,0 +1,19 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # AttendeeFlaggedMatchState - How sure the screening is that the accounts it read are the attendee's. A finding on a possible match is at most moderate, on a probable match at most high.
8
+ class AttendeeFlaggedMatchState < T::Enum
9
+ enums do
10
+ CONFIRMED = new("confirmed")
11
+ PROBABLE = new("probable")
12
+ POSSIBLE = new("possible")
13
+ NONE_FOUND = new("none_found")
14
+ INACCESSIBLE = new("inaccessible")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::AttendeeFlaggedMatchState
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::AttendeeFlaggedMatchState
9
+ end
@@ -36,6 +36,7 @@ module NoResponse
36
36
  AGGREGATE_ERASED_DATA = new("aggregate_erased_data")
37
37
  EVENT_CONFLICT = new("event_conflict")
38
38
  EVENT_LIMIT_REACHED = new("event_limit_reached")
39
+ SCREENING_CAP_EXCEEDED = new("screening_cap_exceeded")
39
40
  SCREENING_UNAVAILABLE = new("screening_unavailable")
40
41
  end
41
42
 
@@ -4,13 +4,14 @@
4
4
  module NoResponse
5
5
  module Models
6
6
  module Shared
7
- # Metric - assessments: assessments admitted. webhook_deliveries: events sent to endpoints, one per event per endpoint. key_usage_events: key-usage events accepted.
7
+ # Metric - assessments: assessments admitted. webhook_deliveries: events sent to endpoints, one per event per endpoint. key_usage_events: key-usage events accepted. screenings: attendees a screening recorded a final result for, one per attendee per screening; a failed attendee counts nothing.
8
8
  class Metric
9
9
  include ::Crystalline::Enum
10
10
  enums do
11
11
  ASSESSMENTS = new("assessments")
12
12
  WEBHOOK_DELIVERIES = new("webhook_deliveries")
13
13
  KEY_USAGE_EVENTS = new("key_usage_events")
14
+ SCREENINGS = new("screenings")
14
15
  end
15
16
 
16
17
  open!
@@ -9,7 +9,7 @@ module NoResponse
9
9
  extend T::Sig
10
10
  include Crystalline::MetadataFields
11
11
 
12
- # One environment's settings: how long its assessments are kept, and for each flow the risk thresholds that decide it and the depth a request that names none is served at, and the sources it refuses. Live and test each have their own. A flow without thresholds of its own uses account_creation's (inherits_account_creation). Every change is recorded in the audit log as settings.updated, with who made it.
12
+ # One environment's settings: how long its assessments are kept, and for each flow the risk thresholds that decide it and the depth a request that names none is served at, the sources it refuses, and the daily cap on screening spend. Live and test each have their own. A flow without thresholds of its own uses account_creation's (inherits_account_creation). Every change is recorded in the audit log as settings.updated, with who made it.
13
13
  field(
14
14
  :settings,
15
15
  Models::Shared::Settings,
@@ -100,6 +100,18 @@ module NoResponse
100
100
  ::Integer,
101
101
  {'format_json': {'letter_case': ::NoResponse::Utils.field_name("attendees_failed"), required: true}}
102
102
  )
103
+ # What the screening was estimated to cost when it started, in minor units of USD (cents): its attendees at its depth and platforms. Until the screening finishes, what it has not yet spent counts against the environment's screening_daily_cap.
104
+ field(
105
+ :estimated_spend,
106
+ ::Integer,
107
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("estimated_spend"), required: true}}
108
+ )
109
+ # What the attendees it has screened recorded, in minor units of USD. Each counts toward the UTC day it was recorded on; a failed attendee records nothing.
110
+ field(
111
+ :spent,
112
+ ::Integer,
113
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("spent"), required: true}}
114
+ )
103
115
 
104
116
  field(
105
117
  :started_at,
@@ -134,6 +146,8 @@ module NoResponse
134
146
  attendees_done: ::Integer,
135
147
  attendees_flagged: ::Integer,
136
148
  attendees_failed: ::Integer,
149
+ estimated_spend: ::Integer,
150
+ spent: ::Integer,
137
151
  started_at: T.nilable(::String),
138
152
  finished_at: T.nilable(::String),
139
153
  error_code: T.nilable(::String)
@@ -154,6 +168,8 @@ module NoResponse
154
168
  attendees_done:,
155
169
  attendees_flagged:,
156
170
  attendees_failed:,
171
+ estimated_spend:,
172
+ spent:,
157
173
  started_at: nil,
158
174
  finished_at: nil,
159
175
  error_code: nil
@@ -171,6 +187,8 @@ module NoResponse
171
187
  @attendees_done = attendees_done
172
188
  @attendees_flagged = attendees_flagged
173
189
  @attendees_failed = attendees_failed
190
+ @estimated_spend = estimated_spend
191
+ @spent = spent
174
192
  @started_at = started_at
175
193
  @finished_at = finished_at
176
194
  @error_code = error_code
@@ -192,6 +210,8 @@ module NoResponse
192
210
  return false unless @attendees_done == other.attendees_done
193
211
  return false unless @attendees_flagged == other.attendees_flagged
194
212
  return false unless @attendees_failed == other.attendees_failed
213
+ return false unless @estimated_spend == other.estimated_spend
214
+ return false unless @spent == other.spent
195
215
  return false unless @started_at == other.started_at
196
216
  return false unless @finished_at == other.finished_at
197
217
  return false unless @error_code == other.error_code
@@ -84,6 +84,18 @@ class NoResponse::Models::Shared::Screening
84
84
  def attendees_failed=(str_)
85
85
  end
86
86
 
87
+ def estimated_spend
88
+ end
89
+
90
+ def estimated_spend=(str_)
91
+ end
92
+
93
+ def spent
94
+ end
95
+
96
+ def spent=(str_)
97
+ end
98
+
87
99
  def started_at
88
100
  end
89
101