noresponse 2.0.18 → 2.1.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.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/lib/no_response/integrations.rb +1 -1
  3. data/lib/no_response/late_results.rb +23 -17
  4. data/lib/no_response/models/operations/createwebhookendpoint_response.rb +34 -0
  5. data/lib/no_response/models/operations/createwebhookendpoint_response.rbi +20 -0
  6. data/lib/no_response/models/operations/deletewebhookendpoint_request.rb +29 -0
  7. data/lib/no_response/models/operations/deletewebhookendpoint_request.rbi +14 -0
  8. data/lib/no_response/models/operations/deletewebhookendpoint_response.rb +28 -0
  9. data/lib/no_response/models/operations/deletewebhookendpoint_response.rbi +14 -0
  10. data/lib/no_response/models/operations/listwebhookendpoints_response.rb +32 -0
  11. data/lib/no_response/models/operations/listwebhookendpoints_response.rbi +20 -0
  12. data/lib/no_response/models/operations/rotatewebhooksigningkey_request.rb +33 -0
  13. data/lib/no_response/models/operations/rotatewebhooksigningkey_request.rbi +20 -0
  14. data/lib/no_response/models/operations/rotatewebhooksigningkey_response.rb +32 -0
  15. data/lib/no_response/models/operations/rotatewebhooksigningkey_response.rbi +20 -0
  16. data/lib/no_response/models/operations/sendwebhooktestevent_request.rb +33 -0
  17. data/lib/no_response/models/operations/sendwebhooktestevent_request.rbi +20 -0
  18. data/lib/no_response/models/operations/sendwebhooktestevent_response.rb +32 -0
  19. data/lib/no_response/models/operations/sendwebhooktestevent_response.rbi +20 -0
  20. data/lib/no_response/models/operations.rb +8 -0
  21. data/lib/no_response/models/shared/assessment.rb +12 -2
  22. data/lib/no_response/models/shared/assessment.rbi +6 -0
  23. data/lib/no_response/models/shared/assessmentauthcontext.rb +121 -0
  24. data/lib/no_response/models/shared/assessmentauthcontext.rbi +56 -0
  25. data/lib/no_response/models/shared/assessmentquery.rb +1 -1
  26. data/lib/no_response/models/shared/assessmentrequest.rb +1 -1
  27. data/lib/no_response/models/shared/authcontext.rb +4 -4
  28. data/lib/no_response/models/shared/badrequesterrorcode.rb +1 -0
  29. data/lib/no_response/models/shared/conflicterrorcode.rb +2 -0
  30. data/lib/no_response/models/shared/hookpoint.rb +5 -2
  31. data/lib/no_response/models/shared/responsemode.rb +4 -1
  32. data/lib/no_response/models/shared/security.rb +3 -3
  33. data/lib/no_response/models/shared/signingkey.rb +49 -0
  34. data/lib/no_response/models/shared/signingkey.rbi +26 -0
  35. data/lib/no_response/models/shared/signingsecret.rb +49 -0
  36. data/lib/no_response/models/shared/signingsecret.rbi +26 -0
  37. data/lib/no_response/models/shared/transport.rb +5 -2
  38. data/lib/no_response/models/shared/webhookendpoint.rb +100 -0
  39. data/lib/no_response/models/shared/webhookendpoint.rbi +50 -0
  40. data/lib/no_response/models/shared/webhookendpointcreated.rb +41 -0
  41. data/lib/no_response/models/shared/webhookendpointcreated.rbi +20 -0
  42. data/lib/no_response/models/shared/webhookendpointlist.rb +32 -0
  43. data/lib/no_response/models/shared/webhookendpointlist.rbi +14 -0
  44. data/lib/no_response/models/shared/webhookendpointrequest.rb +42 -0
  45. data/lib/no_response/models/shared/webhookendpointrequest.rbi +20 -0
  46. data/lib/no_response/models/shared/webhookendpointstate.rb +20 -0
  47. data/lib/no_response/models/shared/webhookendpointstate.rbi +9 -0
  48. data/lib/no_response/models/shared/webhookkeyrotation.rb +65 -0
  49. data/lib/no_response/models/shared/webhookkeyrotation.rbi +32 -0
  50. data/lib/no_response/models/shared/webhookkeyrotationrequest.rb +23 -0
  51. data/lib/no_response/models/shared/webhookkeyrotationrequest.rbi +9 -0
  52. data/lib/no_response/models/shared/webhooktest.rb +86 -0
  53. data/lib/no_response/models/shared/webhooktest.rbi +38 -0
  54. data/lib/no_response/models/shared/webhooktestrequest.rb +39 -0
  55. data/lib/no_response/models/shared/webhooktestrequest.rbi +14 -0
  56. data/lib/no_response/models/shared/webhooktestrequestevent.rb +19 -0
  57. data/lib/no_response/models/shared/webhooktestrequestevent.rbi +9 -0
  58. data/lib/no_response/models/shared.rb +13 -0
  59. data/lib/no_response/noresponseclient.rb +2 -1
  60. data/lib/no_response/sdkconfiguration.rb +5 -2
  61. data/lib/no_response/webhookendpoints.rb +1444 -0
  62. data/lib/no_response/webhooks.rb +7 -2
  63. data/lib/noresponse.rb +1 -0
  64. metadata +45 -2
@@ -0,0 +1,121 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # The identity fields of the auth context the assessment was made with, echoed for the tenant's own correlation: the request's auth_context, or the one a hosted provider hook (POST /hooks/{integration_id}) built, with transport provider_hook and its hook_point. Present exactly when the request carried an auth_context, and the same on every revision of the assessment. Values are as the request or the hook sent them; tokens, timestamps, roles and scopes are not echoed, and the echo does not change the score.
8
+ class AssessmentAuthContext
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # The provider slug the context named.
13
+ field(
14
+ :provider,
15
+ ::String,
16
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("provider"), required: true}}
17
+ )
18
+ # The issuer the context named.
19
+ field(
20
+ :issuer,
21
+ ::String,
22
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("issuer"), required: true}}
23
+ )
24
+ # The verified flag the context carried. A provider_hook context is always false.
25
+ field(
26
+ :verified,
27
+ Crystalline::Boolean.new,
28
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("verified"), required: true}}
29
+ )
30
+ # Where the context was derived: backend (also when the request named no transport), browser, or provider_hook for a hosted provider hook.
31
+ field(
32
+ :transport,
33
+ Models::Shared::Transport,
34
+ {
35
+ 'format_json': {
36
+ 'letter_case': ::NoResponse::Utils.field_name("transport"),
37
+ required: true,
38
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Transport, false)
39
+ }
40
+ }
41
+ )
42
+ # The subject the context named; absent when it named none (a pre_registration hook).
43
+ field(
44
+ :subject,
45
+ Crystalline::Nilable.new(::String),
46
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("subject")}}
47
+ )
48
+ # The session identifier the context named, when it named one.
49
+ field(
50
+ :session_id,
51
+ Crystalline::Nilable.new(::String),
52
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("session_id")}}
53
+ )
54
+ # The organization identifier the context named, when it named one.
55
+ field(
56
+ :organization_id,
57
+ Crystalline::Nilable.new(::String),
58
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("organization_id")}}
59
+ )
60
+ # The provider event a provider_hook context was sent for; absent for any other transport.
61
+ field(
62
+ :hook_point,
63
+ Crystalline::Nilable.new(Models::Shared::HookPoint),
64
+ {
65
+ 'format_json': {
66
+ 'letter_case': ::NoResponse::Utils.field_name("hook_point"),
67
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::HookPoint, true)
68
+ }
69
+ }
70
+ )
71
+
72
+ sig {
73
+ params(
74
+ provider: ::String,
75
+ issuer: ::String,
76
+ verified: T::Boolean,
77
+ transport: Models::Shared::Transport,
78
+ subject: T.nilable(::String),
79
+ session_id: T.nilable(::String),
80
+ organization_id: T.nilable(::String),
81
+ hook_point: T.nilable(Models::Shared::HookPoint)
82
+ )
83
+ .void
84
+ }
85
+ def initialize(
86
+ provider:,
87
+ issuer:,
88
+ verified:,
89
+ transport:,
90
+ subject: nil,
91
+ session_id: nil,
92
+ organization_id: nil,
93
+ hook_point: nil
94
+ )
95
+ @provider = provider
96
+ @issuer = issuer
97
+ @verified = verified
98
+ @transport = transport
99
+ @subject = subject
100
+ @session_id = session_id
101
+ @organization_id = organization_id
102
+ @hook_point = hook_point
103
+ end
104
+
105
+ sig { params(other: T.untyped).returns(T::Boolean) }
106
+ def ==(other)
107
+ return false unless other.is_a?(self.class)
108
+ return false unless @provider == other.provider
109
+ return false unless @issuer == other.issuer
110
+ return false unless @verified == other.verified
111
+ return false unless @transport == other.transport
112
+ return false unless @subject == other.subject
113
+ return false unless @session_id == other.session_id
114
+ return false unless @organization_id == other.organization_id
115
+ return false unless @hook_point == other.hook_point
116
+ true
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,56 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::AssessmentAuthContext
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::AssessmentAuthContext
9
+ def provider
10
+ end
11
+
12
+ def provider=(str_)
13
+ end
14
+
15
+ def issuer
16
+ end
17
+
18
+ def issuer=(str_)
19
+ end
20
+
21
+ def verified
22
+ end
23
+
24
+ def verified=(str_)
25
+ end
26
+
27
+ def transport
28
+ end
29
+
30
+ def transport=(str_)
31
+ end
32
+
33
+ def subject
34
+ end
35
+
36
+ def subject=(str_)
37
+ end
38
+
39
+ def session_id
40
+ end
41
+
42
+ def session_id=(str_)
43
+ end
44
+
45
+ def organization_id
46
+ end
47
+
48
+ def organization_id=(str_)
49
+ end
50
+
51
+ def hook_point
52
+ end
53
+
54
+ def hook_point=(str_)
55
+ end
56
+ end
@@ -28,7 +28,7 @@ module NoResponse
28
28
  {
29
29
  'format_json': {
30
30
  'letter_case': ::NoResponse::Utils.field_name("response_mode"),
31
- 'decoder': ::NoResponse::Utils.enum_from_string(Models::Shared::ResponseMode, true)
31
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::ResponseMode, true)
32
32
  }
33
33
  }
34
34
  )
@@ -46,7 +46,7 @@ module NoResponse
46
46
  {
47
47
  'format_json': {
48
48
  'letter_case': ::NoResponse::Utils.field_name("response_mode"),
49
- 'decoder': ::NoResponse::Utils.enum_from_string(Models::Shared::ResponseMode, true)
49
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::ResponseMode, true)
50
50
  }
51
51
  }
52
52
  )
@@ -128,25 +128,25 @@ module NoResponse
128
128
  Crystalline::Nilable.new(Crystalline::Boolean.new),
129
129
  {'format_json': {'letter_case': ::NoResponse::Utils.field_name("impersonated")}}
130
130
  )
131
- # Where this context was derived. Backend is the trusted integration path; browser values are treated as weak hints. provider_hook is a hosted provider hook (an Auth0 or WorkOS Action) calling at hook_point; it needs hook_point and verified false, and its authentication facts are not scored.
131
+ # Where the context was derived: backend (also when the request named no transport), browser, or provider_hook for a hosted provider hook.
132
132
  field(
133
133
  :transport,
134
134
  Crystalline::Nilable.new(Models::Shared::Transport),
135
135
  {
136
136
  'format_json': {
137
137
  'letter_case': ::NoResponse::Utils.field_name("transport"),
138
- 'decoder': ::NoResponse::Utils.enum_from_string(Models::Shared::Transport, true)
138
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Transport, true)
139
139
  }
140
140
  }
141
141
  )
142
- # The provider event a provider_hook context was sent for. pre_registration runs before the user exists, so subject and the request's account_id may be absent there. Sent only with transport provider_hook.
142
+ # The provider event a provider_hook context was sent for; absent for any other transport.
143
143
  field(
144
144
  :hook_point,
145
145
  Crystalline::Nilable.new(Models::Shared::HookPoint),
146
146
  {
147
147
  'format_json': {
148
148
  'letter_case': ::NoResponse::Utils.field_name("hook_point"),
149
- 'decoder': ::NoResponse::Utils.enum_from_string(Models::Shared::HookPoint, true)
149
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::HookPoint, true)
150
150
  }
151
151
  }
152
152
  )
@@ -11,6 +11,7 @@ module NoResponse
11
11
  INVALID_REQUEST = new("invalid_request")
12
12
  INVALID_IDEMPOTENCY_KEY = new("invalid_idempotency_key")
13
13
  INVALID_CURSOR = new("invalid_cursor")
14
+ WEBHOOK_URL_REFUSED = new("webhook_url_refused")
14
15
  end
15
16
 
16
17
  open!
@@ -10,6 +10,8 @@ module NoResponse
10
10
  enums do
11
11
  IDEMPOTENCY_KEY_REUSED = new("idempotency_key_reused")
12
12
  KEY_ROTATION_IN_PROGRESS = new("key_rotation_in_progress")
13
+ WEBHOOK_ENDPOINT_LIMIT_REACHED = new("webhook_endpoint_limit_reached")
14
+ WEBHOOK_ENDPOINT_UNVERIFIED = new("webhook_endpoint_unverified")
13
15
  TOO_MANY_INTEGRATIONS = new("too_many_integrations")
14
16
  end
15
17
 
@@ -4,8 +4,9 @@
4
4
  module NoResponse
5
5
  module Models
6
6
  module Shared
7
- # HookPoint - The provider event a provider_hook context was sent for. pre_registration runs before the user exists, so subject and the request's account_id may be absent there. Sent only with transport provider_hook.
8
- class HookPoint < T::Enum
7
+ # HookPoint - The provider event a provider_hook context was sent for; absent for any other transport.
8
+ class HookPoint
9
+ include ::Crystalline::Enum
9
10
  enums do
10
11
  PRE_REGISTRATION = new("pre_registration")
11
12
  POST_REGISTRATION = new("post_registration")
@@ -13,6 +14,8 @@ module NoResponse
13
14
  POST_LOGIN = new("post_login")
14
15
  TOKEN_ISSUANCE = new("token_issuance")
15
16
  end
17
+
18
+ open!
16
19
  end
17
20
  end
18
21
  end
@@ -5,11 +5,14 @@ module NoResponse
5
5
  module Models
6
6
  module Shared
7
7
  # ResponseMode - standard returns the consolidated risk response; detailed adds merged provider-neutral facts when the key has detailed scope. There is no raw mode.
8
- class ResponseMode < T::Enum
8
+ class ResponseMode
9
+ include ::Crystalline::Enum
9
10
  enums do
10
11
  STANDARD = new("standard")
11
12
  DETAILED = new("detailed")
12
13
  end
14
+
15
+ open!
13
16
  end
14
17
  end
15
18
  end
@@ -11,12 +11,12 @@ module NoResponse
11
11
 
12
12
  field(
13
13
  :api_key,
14
- ::String,
14
+ Crystalline::Nilable.new(::String),
15
15
  {'security': {'scheme': true, 'type': "http", 'sub_type': "bearer", 'field_name': "Authorization"}}
16
16
  )
17
17
 
18
- sig { params(api_key: ::String).void }
19
- def initialize(api_key:)
18
+ sig { params(api_key: T.nilable(::String)).void }
19
+ def initialize(api_key: nil)
20
20
  @api_key = api_key
21
21
  end
22
22
 
@@ -0,0 +1,49 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # One signing key, by id. The secret is not included.
8
+ class SigningKey
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # The signing key id, sent as NR-Webhook-Key-Id on every delivery it signs.
13
+ field(
14
+ :key_id,
15
+ ::String,
16
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("key_id"), required: true}}
17
+ )
18
+
19
+ field(
20
+ :created_at,
21
+ ::String,
22
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("created_at"), required: true}}
23
+ )
24
+ # Present on a key a rotation replaced: it stops verifying at this instant, 7 days after the rotation. Absent on the key that signs.
25
+ field(
26
+ :expires_at,
27
+ Crystalline::Nilable.new(::String),
28
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("expires_at")}}
29
+ )
30
+
31
+ sig { params(key_id: ::String, created_at: ::String, expires_at: T.nilable(::String)).void }
32
+ def initialize(key_id:, created_at:, expires_at: nil)
33
+ @key_id = key_id
34
+ @created_at = created_at
35
+ @expires_at = expires_at
36
+ end
37
+
38
+ sig { params(other: T.untyped).returns(T::Boolean) }
39
+ def ==(other)
40
+ return false unless other.is_a?(self.class)
41
+ return false unless @key_id == other.key_id
42
+ return false unless @created_at == other.created_at
43
+ return false unless @expires_at == other.expires_at
44
+ true
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,26 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::SigningKey
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::SigningKey
9
+ def key_id
10
+ end
11
+
12
+ def key_id=(str_)
13
+ end
14
+
15
+ def created_at
16
+ end
17
+
18
+ def created_at=(str_)
19
+ end
20
+
21
+ def expires_at
22
+ end
23
+
24
+ def expires_at=(str_)
25
+ end
26
+ end
@@ -0,0 +1,49 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # A newly issued signing key with its secret, shown only in this answer. A receiver verifies NR-Webhook-Signature with the secret's UTF-8 bytes as the HMAC-SHA256 key.
8
+ class SigningSecret
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # The signing key id, sent as NR-Webhook-Key-Id on every delivery it signs.
13
+ field(
14
+ :key_id,
15
+ ::String,
16
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("key_id"), required: true}}
17
+ )
18
+ # The signing secret: 32 random bytes as 43 characters of unpadded base64url. It is not stored in readable form or returned again.
19
+ field(
20
+ :secret,
21
+ ::String,
22
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("secret"), required: true}}
23
+ )
24
+
25
+ field(
26
+ :created_at,
27
+ ::String,
28
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("created_at"), required: true}}
29
+ )
30
+
31
+ sig { params(key_id: ::String, secret: ::String, created_at: ::String).void }
32
+ def initialize(key_id:, secret:, created_at:)
33
+ @key_id = key_id
34
+ @secret = secret
35
+ @created_at = created_at
36
+ end
37
+
38
+ sig { params(other: T.untyped).returns(T::Boolean) }
39
+ def ==(other)
40
+ return false unless other.is_a?(self.class)
41
+ return false unless @key_id == other.key_id
42
+ return false unless @secret == other.secret
43
+ return false unless @created_at == other.created_at
44
+ true
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,26 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::SigningSecret
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::SigningSecret
9
+ def key_id
10
+ end
11
+
12
+ def key_id=(str_)
13
+ end
14
+
15
+ def secret
16
+ end
17
+
18
+ def secret=(str_)
19
+ end
20
+
21
+ def created_at
22
+ end
23
+
24
+ def created_at=(str_)
25
+ end
26
+ end
@@ -4,13 +4,16 @@
4
4
  module NoResponse
5
5
  module Models
6
6
  module Shared
7
- # Transport - Where this context was derived. Backend is the trusted integration path; browser values are treated as weak hints. provider_hook is a hosted provider hook (an Auth0 or WorkOS Action) calling at hook_point; it needs hook_point and verified false, and its authentication facts are not scored.
8
- class Transport < T::Enum
7
+ # Transport - Where the context was derived: backend (also when the request named no transport), browser, or provider_hook for a hosted provider hook.
8
+ class Transport
9
+ include ::Crystalline::Enum
9
10
  enums do
10
11
  BACKEND = new("backend")
11
12
  BROWSER = new("browser")
12
13
  PROVIDER_HOOK = new("provider_hook")
13
14
  end
15
+
16
+ open!
14
17
  end
15
18
  end
16
19
  end
@@ -0,0 +1,100 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # One of the tenant's registered webhook endpoints. Signing secrets are not part of it: a secret is shown once, when it is issued (POST /v1/webhooks and POST /v1/webhooks/{endpoint_id}/rotate).
8
+ class WebhookEndpoint
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # Opaque id of the endpoint registration.
13
+ field(
14
+ :endpoint_id,
15
+ ::String,
16
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("endpoint_id"), required: true}}
17
+ )
18
+ # The destination URL, as registered.
19
+ field :url, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("url"), required: true}}
20
+ # unverified until the endpoint echoes an endpoint.verification challenge (send one with POST /v1/webhooks/{endpoint_id}/test); verified receives assessment.updated events; disabled after 72 hours of continuous delivery failure, and verified again by the same challenge.
21
+ field(
22
+ :state,
23
+ Models::Shared::WebhookEndpointState,
24
+ {
25
+ 'format_json': {
26
+ 'letter_case': ::NoResponse::Utils.field_name("state"),
27
+ required: true,
28
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::WebhookEndpointState, false)
29
+ }
30
+ }
31
+ )
32
+ # standard returns the consolidated risk response; detailed adds merged provider-neutral facts when the key has detailed scope. There is no raw mode.
33
+ field(
34
+ :response_mode,
35
+ Models::Shared::ResponseMode,
36
+ {
37
+ 'format_json': {
38
+ 'letter_case': ::NoResponse::Utils.field_name("response_mode"),
39
+ required: true,
40
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::ResponseMode, false)
41
+ }
42
+ }
43
+ )
44
+
45
+ field(
46
+ :created_at,
47
+ ::String,
48
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("created_at"), required: true}}
49
+ )
50
+ # The keys a receiver may see in NR-Webhook-Key-Id, oldest first. The last one signs every new delivery; an older one keeps verifying until its expires_at.
51
+ field(
52
+ :signing_keys,
53
+ Crystalline::Array.new(Models::Shared::SigningKey),
54
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("signing_keys"), required: true}}
55
+ )
56
+ # When the endpoint last echoed a challenge. Absent until it first does.
57
+ field(
58
+ :verified_at,
59
+ Crystalline::Nilable.new(::String),
60
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("verified_at")}}
61
+ )
62
+
63
+ sig {
64
+ params(
65
+ endpoint_id: ::String,
66
+ url: ::String,
67
+ state: Models::Shared::WebhookEndpointState,
68
+ response_mode: Models::Shared::ResponseMode,
69
+ created_at: ::String,
70
+ signing_keys: T::Array[Models::Shared::SigningKey],
71
+ verified_at: T.nilable(::String)
72
+ )
73
+ .void
74
+ }
75
+ def initialize(endpoint_id:, url:, state:, response_mode:, created_at:, signing_keys:, verified_at: nil)
76
+ @endpoint_id = endpoint_id
77
+ @url = url
78
+ @state = state
79
+ @response_mode = response_mode
80
+ @created_at = created_at
81
+ @signing_keys = signing_keys
82
+ @verified_at = verified_at
83
+ end
84
+
85
+ sig { params(other: T.untyped).returns(T::Boolean) }
86
+ def ==(other)
87
+ return false unless other.is_a?(self.class)
88
+ return false unless @endpoint_id == other.endpoint_id
89
+ return false unless @url == other.url
90
+ return false unless @state == other.state
91
+ return false unless @response_mode == other.response_mode
92
+ return false unless @created_at == other.created_at
93
+ return false unless @signing_keys == other.signing_keys
94
+ return false unless @verified_at == other.verified_at
95
+ true
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,50 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::WebhookEndpoint
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::WebhookEndpoint
9
+ def endpoint_id
10
+ end
11
+
12
+ def endpoint_id=(str_)
13
+ end
14
+
15
+ def url
16
+ end
17
+
18
+ def url=(str_)
19
+ end
20
+
21
+ def state
22
+ end
23
+
24
+ def state=(str_)
25
+ end
26
+
27
+ def response_mode
28
+ end
29
+
30
+ def response_mode=(str_)
31
+ end
32
+
33
+ def created_at
34
+ end
35
+
36
+ def created_at=(str_)
37
+ end
38
+
39
+ def signing_keys
40
+ end
41
+
42
+ def signing_keys=(str_)
43
+ end
44
+
45
+ def verified_at
46
+ end
47
+
48
+ def verified_at=(str_)
49
+ end
50
+ end
@@ -0,0 +1,41 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # The 201 answer of POST /v1/webhooks: the new endpoint, unverified, and its first signing secret, shown once. Store the secret where the receiver reads it, then send endpoint.verification with POST /v1/webhooks/{endpoint_id}/test.
8
+ class WebhookEndpointCreated
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # One of the tenant's registered webhook endpoints. Signing secrets are not part of it: a secret is shown once, when it is issued (POST /v1/webhooks and POST /v1/webhooks/{endpoint_id}/rotate).
13
+ field(
14
+ :endpoint,
15
+ Models::Shared::WebhookEndpoint,
16
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("endpoint"), required: true}}
17
+ )
18
+ # A newly issued signing key with its secret, shown only in this answer. A receiver verifies NR-Webhook-Signature with the secret's UTF-8 bytes as the HMAC-SHA256 key.
19
+ field(
20
+ :signing_secret,
21
+ Models::Shared::SigningSecret,
22
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("signing_secret"), required: true}}
23
+ )
24
+
25
+ sig { params(endpoint: Models::Shared::WebhookEndpoint, signing_secret: Models::Shared::SigningSecret).void }
26
+ def initialize(endpoint:, signing_secret:)
27
+ @endpoint = endpoint
28
+ @signing_secret = signing_secret
29
+ end
30
+
31
+ sig { params(other: T.untyped).returns(T::Boolean) }
32
+ def ==(other)
33
+ return false unless other.is_a?(self.class)
34
+ return false unless @endpoint == other.endpoint
35
+ return false unless @signing_secret == other.signing_secret
36
+ true
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end