noresponse 8.2.0 → 8.3.0
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.
- checksums.yaml +4 -4
- data/lib/no_response/accounts.rb +2 -2
- data/lib/no_response/assessments.rb +298 -5
- data/lib/no_response/models/operations/aggregateassessments_response.rb +32 -0
- data/lib/no_response/models/operations/aggregateassessments_response.rbi +20 -0
- data/lib/no_response/models/operations.rb +1 -0
- data/lib/no_response/models/shared/aggregatebucket.rb +73 -0
- data/lib/no_response/models/shared/aggregatebucket.rbi +38 -0
- data/lib/no_response/models/shared/aggregatedimension.rb +26 -0
- data/lib/no_response/models/shared/aggregatedimension.rbi +9 -0
- data/lib/no_response/models/shared/aggregategroup.rb +179 -0
- data/lib/no_response/models/shared/aggregategroup.rbi +74 -0
- data/lib/no_response/models/shared/aggregatelateflip.rb +83 -0
- data/lib/no_response/models/shared/aggregatelateflip.rbi +32 -0
- data/lib/no_response/models/shared/aggregatescorecount.rb +63 -0
- data/lib/no_response/models/shared/aggregatescorecount.rbi +32 -0
- data/lib/no_response/models/shared/answerrevision.rb +16 -0
- data/lib/no_response/models/shared/answerrevision.rbi +9 -0
- data/lib/no_response/models/shared/assessmentaggregate.rb +121 -0
- data/lib/no_response/models/shared/assessmentaggregate.rbi +62 -0
- data/lib/no_response/models/shared/assessmentaggregate_metric.rb +20 -0
- data/lib/no_response/models/shared/assessmentaggregate_metric.rbi +9 -0
- data/lib/no_response/models/shared/assessmentaggregaterequest.rb +163 -0
- data/lib/no_response/models/shared/assessmentaggregaterequest.rbi +74 -0
- data/lib/no_response/models/shared/assessmentaggregaterequest_metric.rb +17 -0
- data/lib/no_response/models/shared/assessmentaggregaterequest_metric.rbi +9 -0
- data/lib/no_response/models/shared/assessmentdetail.rb +10 -0
- data/lib/no_response/models/shared/assessmentdetail.rbi +6 -0
- data/lib/no_response/models/shared/assessmentsearchrequest.rb +17 -2
- data/lib/no_response/models/shared/assessmentsearchrequest.rbi +6 -0
- data/lib/no_response/models/shared/bucket.rb +20 -0
- data/lib/no_response/models/shared/bucket.rbi +9 -0
- data/lib/no_response/models/shared/decision.rb +5 -2
- data/lib/no_response/models/shared/delay.rb +23 -0
- data/lib/no_response/models/shared/delay.rbi +9 -0
- data/lib/no_response/models/shared/listmatch.rb +19 -0
- data/lib/no_response/models/shared/listmatch.rbi +9 -0
- data/lib/no_response/models/shared/sentidentifiers.rb +74 -0
- data/lib/no_response/models/shared/sentidentifiers.rbi +38 -0
- data/lib/no_response/models/shared.rb +14 -0
- data/lib/no_response/sdkconfiguration.rb +2 -2
- metadata +31 -1
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# Count this environment's assessments created in [from,to) by bucket, from counts kept as each assessment is first answered, not by scanning assessments. Each assessment counts once, by its first answer (the answer served when it was first answered); later revisions and late results do not count it again, and late_flips counts its later account decision changes. from and to start a bucket (an hour, a UTC day, or a week from Monday 00:00 UTC), cover at most 366 days (31 for hour buckets) and from is inside the retention period. The filters are POST /v1/assessments/search's and describe the first answer, so a cell drills down to search with the same filters, revision first and the cell's bucket as from and to. Counts hold no identifier and stay when an assessment or account is deleted or erased; they expire with retention and go with the workspace. Reasons are counted by code and impact band, not by weight. No Idempotency-Key.
|
|
8
|
+
class AssessmentAggregateRequest
|
|
9
|
+
extend T::Sig
|
|
10
|
+
include Crystalline::MetadataFields
|
|
11
|
+
|
|
12
|
+
# The first bucket's start.
|
|
13
|
+
field :from, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("from"), required: true}}
|
|
14
|
+
# The end, excluded: the start of the bucket after the last.
|
|
15
|
+
field :to, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("to"), required: true}}
|
|
16
|
+
# The period each count covers, in UTC; a week starts on Monday.
|
|
17
|
+
field(
|
|
18
|
+
:bucket,
|
|
19
|
+
Models::Shared::Bucket,
|
|
20
|
+
{
|
|
21
|
+
'format_json': {
|
|
22
|
+
'letter_case': ::NoResponse::Utils.field_name("bucket"),
|
|
23
|
+
required: true,
|
|
24
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Bucket, false)
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
)
|
|
28
|
+
# At most two dimensions to count by, of which at most one is reason, lane, country or asn. An assessment counts once in each of its reasons and incomplete lanes, so those groups can add up to more than the bucket's count.
|
|
29
|
+
field(
|
|
30
|
+
:group_by,
|
|
31
|
+
Crystalline::Nilable.new(Crystalline::Array.new(Models::Shared::AggregateDimension)),
|
|
32
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("group_by")}}
|
|
33
|
+
)
|
|
34
|
+
# count: each bucket's count and groups. score_histogram: first answers by flow and 5-point score bucket. late_flips: changes of an assessment's account decision for its flow after its first answer, by from, to and delay.
|
|
35
|
+
field(
|
|
36
|
+
:metrics,
|
|
37
|
+
Crystalline::Nilable.new(Crystalline::Array.new(Models::Shared::AssessmentAggregateRequestMetric)),
|
|
38
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("metrics")}}
|
|
39
|
+
)
|
|
40
|
+
# The event an assessment is made for: account_creation (a user creates an account), login (a user returns to an existing account) or purchase (a payment or a credit grant). The account's risk is reported with the decision for this flow.
|
|
41
|
+
field(
|
|
42
|
+
:flow,
|
|
43
|
+
Crystalline::Nilable.new(Models::Shared::Flow),
|
|
44
|
+
{
|
|
45
|
+
'format_json': {
|
|
46
|
+
'letter_case': ::NoResponse::Utils.field_name("flow"),
|
|
47
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Flow, true)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
)
|
|
51
|
+
# complete: final; nothing is still running. A lane that failed or missed its 10 s deadline stays listed in incomplete_sources, and confidence is lower. partial: a recommendation exists and at least one lane is still running or did not settle (see incomplete_sources). pending: nothing usable before the deadline; no recommendation yet, poll or wait for the webhook.
|
|
52
|
+
field(
|
|
53
|
+
:status,
|
|
54
|
+
Crystalline::Nilable.new(Models::Shared::Status),
|
|
55
|
+
{
|
|
56
|
+
'format_json': {
|
|
57
|
+
'letter_case': ::NoResponse::Utils.field_name("status"),
|
|
58
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Status, true)
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
)
|
|
62
|
+
# The recommended action: allow, step_up or review. Your application applies it.
|
|
63
|
+
field(
|
|
64
|
+
:recommendation,
|
|
65
|
+
Crystalline::Nilable.new(Models::Shared::Recommendation),
|
|
66
|
+
{
|
|
67
|
+
'format_json': {
|
|
68
|
+
'letter_case': ::NoResponse::Utils.field_name("recommendation"),
|
|
69
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Recommendation, true)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
)
|
|
73
|
+
# An assessment's own decision: block when its stored risk.block is true, otherwise its recommendation. It is not the account's decision or held-admission state.
|
|
74
|
+
field(
|
|
75
|
+
:decision,
|
|
76
|
+
Crystalline::Nilable.new(Models::Shared::Decision),
|
|
77
|
+
{
|
|
78
|
+
'format_json': {
|
|
79
|
+
'letter_case': ::NoResponse::Utils.field_name("decision"),
|
|
80
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Decision, true)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
# Which answer of each assessment the filters describe: latest, the latest stored revision, or first, the first answer, as served when the assessment was first answered (POST /v1/assessments/aggregate counts first answers). A cell of an aggregate drills down to POST /v1/assessments/search with the same filters, revision first and the cell's bucket as from and to.
|
|
85
|
+
field(
|
|
86
|
+
:revision,
|
|
87
|
+
Crystalline::Nilable.new(Models::Shared::AnswerRevision),
|
|
88
|
+
{
|
|
89
|
+
'format_json': {
|
|
90
|
+
'letter_case': ::NoResponse::Utils.field_name("revision"),
|
|
91
|
+
'decoder': ::NoResponse::Utils.enum_from_string(Models::Shared::AnswerRevision, true)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
)
|
|
95
|
+
# The most groups answered: the largest over the whole range, then by value. groups_truncated says when there were more.
|
|
96
|
+
field(
|
|
97
|
+
:limit,
|
|
98
|
+
Crystalline::Nilable.new(::Integer),
|
|
99
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("limit")}}
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
sig {
|
|
103
|
+
params(
|
|
104
|
+
from: ::String,
|
|
105
|
+
to: ::String,
|
|
106
|
+
bucket: Models::Shared::Bucket,
|
|
107
|
+
group_by: T.nilable(T::Array[Models::Shared::AggregateDimension]),
|
|
108
|
+
metrics: T.nilable(T::Array[Models::Shared::AssessmentAggregateRequestMetric]),
|
|
109
|
+
flow: T.nilable(Models::Shared::Flow),
|
|
110
|
+
status: T.nilable(Models::Shared::Status),
|
|
111
|
+
recommendation: T.nilable(Models::Shared::Recommendation),
|
|
112
|
+
decision: T.nilable(Models::Shared::Decision),
|
|
113
|
+
revision: T.nilable(Models::Shared::AnswerRevision),
|
|
114
|
+
limit: T.nilable(::Integer)
|
|
115
|
+
)
|
|
116
|
+
.void
|
|
117
|
+
}
|
|
118
|
+
def initialize(
|
|
119
|
+
from:,
|
|
120
|
+
to:,
|
|
121
|
+
bucket:,
|
|
122
|
+
group_by: nil,
|
|
123
|
+
metrics: nil,
|
|
124
|
+
flow: nil,
|
|
125
|
+
status: nil,
|
|
126
|
+
recommendation: nil,
|
|
127
|
+
decision: nil,
|
|
128
|
+
revision: nil,
|
|
129
|
+
limit: 20
|
|
130
|
+
)
|
|
131
|
+
@from = from
|
|
132
|
+
@to = to
|
|
133
|
+
@bucket = bucket
|
|
134
|
+
@group_by = group_by
|
|
135
|
+
@metrics = metrics
|
|
136
|
+
@flow = flow
|
|
137
|
+
@status = status
|
|
138
|
+
@recommendation = recommendation
|
|
139
|
+
@decision = decision
|
|
140
|
+
@revision = revision
|
|
141
|
+
@limit = limit
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
sig { params(other: T.untyped).returns(T::Boolean) }
|
|
145
|
+
def ==(other)
|
|
146
|
+
return false unless other.is_a?(self.class)
|
|
147
|
+
return false unless @from == other.from
|
|
148
|
+
return false unless @to == other.to
|
|
149
|
+
return false unless @bucket == other.bucket
|
|
150
|
+
return false unless @group_by == other.group_by
|
|
151
|
+
return false unless @metrics == other.metrics
|
|
152
|
+
return false unless @flow == other.flow
|
|
153
|
+
return false unless @status == other.status
|
|
154
|
+
return false unless @recommendation == other.recommendation
|
|
155
|
+
return false unless @decision == other.decision
|
|
156
|
+
return false unless @revision == other.revision
|
|
157
|
+
return false unless @limit == other.limit
|
|
158
|
+
true
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
class NoResponse::Models::Shared::AssessmentAggregateRequest
|
|
5
|
+
extend ::Crystalline::MetadataFields::ClassMethods
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class NoResponse::Models::Shared::AssessmentAggregateRequest
|
|
9
|
+
def from
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def from=(str_)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def to
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def to=(str_)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def bucket
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def bucket=(str_)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def group_by
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def group_by=(str_)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def metrics
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def metrics=(str_)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def flow
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def flow=(str_)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def status
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def status=(str_)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def recommendation
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def recommendation=(str_)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def decision
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def decision=(str_)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def revision
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def revision=(str_)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def limit
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def limit=(str_)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
|
|
8
|
+
class AssessmentAggregateRequestMetric < T::Enum
|
|
9
|
+
enums do
|
|
10
|
+
COUNT = new("count")
|
|
11
|
+
SCORE_HISTOGRAM = new("score_histogram")
|
|
12
|
+
LATE_FLIPS = new("late_flips")
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -93,6 +93,12 @@ module NoResponse
|
|
|
93
93
|
::String,
|
|
94
94
|
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("schema_version"), required: true}}
|
|
95
95
|
)
|
|
96
|
+
# The identifiers an assessment was sent: each member of the request's identifiers object exactly as received, before the server normalised it (the email domain keeps its case, the name its Unicode form). A member the request did not send is absent. NoResponse keeps them encrypted under the workspace's own key, does not index or log them, and deletes them with the assessment: on DELETE of the assessment or its account, at its expires_at, and with the workspace.
|
|
97
|
+
field(
|
|
98
|
+
:identifiers,
|
|
99
|
+
Crystalline::Nilable.new(Models::Shared::SentIdentifiers),
|
|
100
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("identifiers")}}
|
|
101
|
+
)
|
|
96
102
|
# An optional provider correlation id, echoed back. It is not an idempotency key. Refuses an exact-shape JWT or a bare 40, 64 or 128 character hex digest; a UUID is accepted.
|
|
97
103
|
field(
|
|
98
104
|
:request_id,
|
|
@@ -155,6 +161,7 @@ module NoResponse
|
|
|
155
161
|
expires_at: ::String,
|
|
156
162
|
timing: Models::Shared::AssessmentDetailTiming,
|
|
157
163
|
schema_version: ::String,
|
|
164
|
+
identifiers: T.nilable(Models::Shared::SentIdentifiers),
|
|
158
165
|
request_id: T.nilable(::String),
|
|
159
166
|
recommendation: T.nilable(Models::Shared::Recommendation),
|
|
160
167
|
risk: T.nilable(Models::Shared::Risk),
|
|
@@ -178,6 +185,7 @@ module NoResponse
|
|
|
178
185
|
expires_at:,
|
|
179
186
|
timing:,
|
|
180
187
|
schema_version: "1",
|
|
188
|
+
identifiers: nil,
|
|
181
189
|
request_id: nil,
|
|
182
190
|
recommendation: nil,
|
|
183
191
|
risk: nil,
|
|
@@ -202,6 +210,7 @@ module NoResponse
|
|
|
202
210
|
end
|
|
203
211
|
|
|
204
212
|
@schema_version = "1"
|
|
213
|
+
@identifiers = identifiers
|
|
205
214
|
@request_id = request_id
|
|
206
215
|
@recommendation = recommendation
|
|
207
216
|
@risk = risk
|
|
@@ -230,6 +239,7 @@ module NoResponse
|
|
|
230
239
|
return false unless @expires_at == other.expires_at
|
|
231
240
|
return false unless @timing == other.timing
|
|
232
241
|
return false unless @schema_version == other.schema_version
|
|
242
|
+
return false unless @identifiers == other.identifiers
|
|
233
243
|
return false unless @request_id == other.request_id
|
|
234
244
|
return false unless @recommendation == other.recommendation
|
|
235
245
|
return false unless @risk == other.risk
|
|
@@ -68,14 +68,25 @@ module NoResponse
|
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
)
|
|
71
|
-
#
|
|
71
|
+
# An assessment's own decision: block when its stored risk.block is true, otherwise its recommendation. It is not the account's decision or held-admission state.
|
|
72
72
|
field(
|
|
73
73
|
:decision,
|
|
74
74
|
Crystalline::Nilable.new(Models::Shared::Decision),
|
|
75
75
|
{
|
|
76
76
|
'format_json': {
|
|
77
77
|
'letter_case': ::NoResponse::Utils.field_name("decision"),
|
|
78
|
-
'decoder': ::NoResponse::Utils.
|
|
78
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Decision, true)
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
)
|
|
82
|
+
# Which answer of each assessment the filters describe: latest, the latest stored revision, or first, the first answer, as served when the assessment was first answered (POST /v1/assessments/aggregate counts first answers). A cell of an aggregate drills down to POST /v1/assessments/search with the same filters, revision first and the cell's bucket as from and to.
|
|
83
|
+
field(
|
|
84
|
+
:revision,
|
|
85
|
+
Crystalline::Nilable.new(Models::Shared::AnswerRevision),
|
|
86
|
+
{
|
|
87
|
+
'format_json': {
|
|
88
|
+
'letter_case': ::NoResponse::Utils.field_name("revision"),
|
|
89
|
+
'decoder': ::NoResponse::Utils.enum_from_string(Models::Shared::AnswerRevision, true)
|
|
79
90
|
}
|
|
80
91
|
}
|
|
81
92
|
)
|
|
@@ -97,6 +108,7 @@ module NoResponse
|
|
|
97
108
|
cursor: T.nilable(::String),
|
|
98
109
|
response_mode: T.nilable(Models::Shared::ResponseMode),
|
|
99
110
|
decision: T.nilable(Models::Shared::Decision),
|
|
111
|
+
revision: T.nilable(Models::Shared::AnswerRevision),
|
|
100
112
|
limit: T.nilable(::Integer)
|
|
101
113
|
)
|
|
102
114
|
.void
|
|
@@ -111,6 +123,7 @@ module NoResponse
|
|
|
111
123
|
cursor: nil,
|
|
112
124
|
response_mode: nil,
|
|
113
125
|
decision: nil,
|
|
126
|
+
revision: nil,
|
|
114
127
|
limit: 20
|
|
115
128
|
)
|
|
116
129
|
@from = from
|
|
@@ -122,6 +135,7 @@ module NoResponse
|
|
|
122
135
|
@cursor = cursor
|
|
123
136
|
@response_mode = response_mode
|
|
124
137
|
@decision = decision
|
|
138
|
+
@revision = revision
|
|
125
139
|
@limit = limit
|
|
126
140
|
end
|
|
127
141
|
|
|
@@ -137,6 +151,7 @@ module NoResponse
|
|
|
137
151
|
return false unless @cursor == other.cursor
|
|
138
152
|
return false unless @response_mode == other.response_mode
|
|
139
153
|
return false unless @decision == other.decision
|
|
154
|
+
return false unless @revision == other.revision
|
|
140
155
|
return false unless @limit == other.limit
|
|
141
156
|
true
|
|
142
157
|
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# Bucket - The period each count covers, in UTC; a week starts on Monday.
|
|
8
|
+
class Bucket
|
|
9
|
+
include ::Crystalline::Enum
|
|
10
|
+
enums do
|
|
11
|
+
HOUR = new("hour")
|
|
12
|
+
DAY = new("day")
|
|
13
|
+
WEEK = new("week")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
open!
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -4,14 +4,17 @@
|
|
|
4
4
|
module NoResponse
|
|
5
5
|
module Models
|
|
6
6
|
module Shared
|
|
7
|
-
# Decision -
|
|
8
|
-
class Decision
|
|
7
|
+
# Decision - An assessment's own decision: block when its stored risk.block is true, otherwise its recommendation. It is not the account's decision or held-admission state.
|
|
8
|
+
class Decision
|
|
9
|
+
include ::Crystalline::Enum
|
|
9
10
|
enums do
|
|
10
11
|
ALLOW = new("allow")
|
|
11
12
|
STEP_UP = new("step_up")
|
|
12
13
|
REVIEW = new("review")
|
|
13
14
|
BLOCK = new("block")
|
|
14
15
|
end
|
|
16
|
+
|
|
17
|
+
open!
|
|
15
18
|
end
|
|
16
19
|
end
|
|
17
20
|
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# Delay - How long after the assessment's creation the change was made.
|
|
8
|
+
class Delay
|
|
9
|
+
include ::Crystalline::Enum
|
|
10
|
+
enums do
|
|
11
|
+
UNDER_10S = new("under_10s")
|
|
12
|
+
UNDER_1M = new("under_1m")
|
|
13
|
+
UNDER_10M = new("under_10m")
|
|
14
|
+
UNDER_1H = new("under_1h")
|
|
15
|
+
UNDER_1D = new("under_1d")
|
|
16
|
+
OVER_1D = new("over_1d")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
open!
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# ListMatch - The action of the list entry that decided the account.
|
|
8
|
+
class ListMatch
|
|
9
|
+
include ::Crystalline::Enum
|
|
10
|
+
enums do
|
|
11
|
+
BLOCK = new("block")
|
|
12
|
+
ALLOW = new("allow")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
open!
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# The identifiers an assessment was sent: each member of the request's identifiers object exactly as received, before the server normalised it (the email domain keeps its case, the name its Unicode form). A member the request did not send is absent. NoResponse keeps them encrypted under the workspace's own key, does not index or log them, and deletes them with the assessment: on DELETE of the assessment or its account, at its expires_at, and with the workspace.
|
|
8
|
+
class SentIdentifiers
|
|
9
|
+
extend T::Sig
|
|
10
|
+
include Crystalline::MetadataFields
|
|
11
|
+
|
|
12
|
+
# identifiers.email as the request sent it.
|
|
13
|
+
field(
|
|
14
|
+
:email,
|
|
15
|
+
Crystalline::Nilable.new(::String),
|
|
16
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("email")}}
|
|
17
|
+
)
|
|
18
|
+
# identifiers.username as the request sent it.
|
|
19
|
+
field(
|
|
20
|
+
:username,
|
|
21
|
+
Crystalline::Nilable.new(::String),
|
|
22
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("username")}}
|
|
23
|
+
)
|
|
24
|
+
# identifiers.phone as the request sent it.
|
|
25
|
+
field(
|
|
26
|
+
:phone,
|
|
27
|
+
Crystalline::Nilable.new(::String),
|
|
28
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("phone")}}
|
|
29
|
+
)
|
|
30
|
+
# identifiers.name as the request sent it, before NFC normalisation.
|
|
31
|
+
field(
|
|
32
|
+
:name,
|
|
33
|
+
Crystalline::Nilable.new(::String),
|
|
34
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("name")}}
|
|
35
|
+
)
|
|
36
|
+
# identifiers.ip as the request sent it.
|
|
37
|
+
field(
|
|
38
|
+
:ip,
|
|
39
|
+
Crystalline::Nilable.new(::String),
|
|
40
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("ip")}}
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
sig {
|
|
44
|
+
params(
|
|
45
|
+
email: T.nilable(::String),
|
|
46
|
+
username: T.nilable(::String),
|
|
47
|
+
phone: T.nilable(::String),
|
|
48
|
+
name: T.nilable(::String),
|
|
49
|
+
ip: T.nilable(::String)
|
|
50
|
+
)
|
|
51
|
+
.void
|
|
52
|
+
}
|
|
53
|
+
def initialize(email: nil, username: nil, phone: nil, name: nil, ip: nil)
|
|
54
|
+
@email = email
|
|
55
|
+
@username = username
|
|
56
|
+
@phone = phone
|
|
57
|
+
@name = name
|
|
58
|
+
@ip = ip
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
sig { params(other: T.untyped).returns(T::Boolean) }
|
|
62
|
+
def ==(other)
|
|
63
|
+
return false unless other.is_a?(self.class)
|
|
64
|
+
return false unless @email == other.email
|
|
65
|
+
return false unless @username == other.username
|
|
66
|
+
return false unless @phone == other.phone
|
|
67
|
+
return false unless @name == other.name
|
|
68
|
+
return false unless @ip == other.ip
|
|
69
|
+
true
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
class NoResponse::Models::Shared::SentIdentifiers
|
|
5
|
+
extend ::Crystalline::MetadataFields::ClassMethods
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class NoResponse::Models::Shared::SentIdentifiers
|
|
9
|
+
def email
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def email=(str_)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def username
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def username=(str_)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def phone
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def phone=(str_)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def name
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def name=(str_)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def ip
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def ip=(str_)
|
|
37
|
+
end
|
|
38
|
+
end
|