workos 2.16.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/Gemfile.lock +5 -14
- data/lib/workos/authentication_factor_and_challenge.rb +31 -0
- data/lib/workos/authentication_response.rb +27 -0
- data/lib/workos/client.rb +1 -1
- data/lib/workos/configuration.rb +1 -1
- data/lib/workos/invitation.rb +68 -0
- data/lib/workos/organization_membership.rb +50 -0
- data/lib/workos/sso.rb +1 -1
- data/lib/workos/types/invitation_struct.rb +20 -0
- data/lib/workos/types/magic_auth_challenge_struct.rb +12 -0
- data/lib/workos/types/organization_membership_struct.rb +15 -0
- data/lib/workos/types/provider_enum.rb +1 -0
- data/lib/workos/types/user_struct.rb +17 -0
- data/lib/workos/types.rb +9 -5
- data/lib/workos/user.rb +57 -0
- data/lib/workos/user_and_token.rb +29 -0
- data/lib/workos/user_management.rb +1008 -0
- data/lib/workos/user_response.rb +25 -0
- data/lib/workos/version.rb +1 -1
- data/lib/workos.rb +35 -28
- data/spec/lib/workos/sso_spec.rb +8 -8
- data/spec/lib/workos/user_management_spec.rb +1092 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_code/invalid.yml +84 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_code/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_email_verification/invalid.yml +83 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_email_verification/valid.yml +81 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_magic_auth/invalid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_magic_auth/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_organization_selection/invalid.yml +81 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_organization_selection/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_password/invalid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_password/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_totp/invalid.yml +83 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_totp/valid.yml +81 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/confirm_password_reset/invalid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/confirm_password_reset/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/create_organization_membership/invalid.yml +83 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/create_organization_membership/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/create_user_invalid.yml +83 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/create_user_valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/delete_organization_membership/invalid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/delete_organization_membership/valid.yml +78 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/delete_user/invalid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/delete_user/valid.yml +78 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/enroll_auth_factor/invalid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/enroll_auth_factor/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/get_invitation/invalid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/get_invitation/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/get_organization_membership.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/get_user.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/list_auth_factors/invalid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/list_auth_factors/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/list_invitations/with_after.yml +83 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/list_invitations/with_before.yml +83 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/list_invitations/with_limit.yml +83 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/list_invitations/with_no_options.yml +83 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/list_invitations/with_organization_id.yml +83 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/list_organization_memberships/no_options.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/list_organization_memberships/with_options.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/list_users/no_options.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/list_users/with_options.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/reset_password/invalid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/reset_password/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/revoke_invitation/invalid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/revoke_invitation/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/send_invitation/invalid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/send_invitation/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/send_magic_auth_code/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/send_password_reset_email/invalid.yml +83 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/send_password_reset_email/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/send_verification_email/invalid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/send_verification_email/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/update_user/invalid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/update_user/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/update_user_password/invalid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/update_user_password/valid.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/verify_email/invalid_code.yml +83 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/verify_email/invalid_magic_auth_challenge.yml +82 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/verify_email/valid.yml +82 -0
- data/workos.gemspec +0 -2
- metadata +132 -55
- data/bin/docs +0 -5
- data/docs/WorkOS/APIError.html +0 -160
- data/docs/WorkOS/AuditLog.html +0 -235
- data/docs/WorkOS/AuditTrail.html +0 -235
- data/docs/WorkOS/AuthenticationError.html +0 -160
- data/docs/WorkOS/Base.html +0 -287
- data/docs/WorkOS/Client.html +0 -504
- data/docs/WorkOS/InvalidRequestError.html +0 -160
- data/docs/WorkOS/Profile.html +0 -788
- data/docs/WorkOS/RequestError.html +0 -135
- data/docs/WorkOS/SSO.html +0 -691
- data/docs/WorkOS/Types/ProfileStruct.html +0 -135
- data/docs/WorkOS/Types/Provider.html +0 -135
- data/docs/WorkOS/Types.html +0 -128
- data/docs/WorkOS/WorkOSError.html +0 -447
- data/docs/WorkOS.html +0 -324
- data/docs/class_list.html +0 -51
- data/docs/css/common.css +0 -1
- data/docs/css/full_list.css +0 -58
- data/docs/css/style.css +0 -496
- data/docs/file.README.html +0 -252
- data/docs/file_list.html +0 -56
- data/docs/frames.html +0 -17
- data/docs/index.html +0 -250
- data/docs/js/app.js +0 -314
- data/docs/js/full_list.js +0 -216
- data/docs/js/jquery.js +0 -4
- data/docs/method_list.html +0 -267
- data/docs/top-level-namespace.html +0 -110
- data/lib/workos/audit_trail.rb +0 -111
- data/spec/lib/workos/audit_trail_spec.rb +0 -146
data/lib/workos/audit_trail.rb
DELETED
@@ -1,111 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
# typed: true
|
3
|
-
|
4
|
-
require 'net/http'
|
5
|
-
require 'uri'
|
6
|
-
|
7
|
-
module WorkOS
|
8
|
-
# The Audit Trail module provides convenience methods for working with the
|
9
|
-
# WorkOS Audit Trail platform. You'll need a valid API key.
|
10
|
-
#
|
11
|
-
# @see https://docs.workos.com/audit-trail/overview
|
12
|
-
module AuditTrail
|
13
|
-
class << self
|
14
|
-
extend T::Sig
|
15
|
-
include Client
|
16
|
-
|
17
|
-
# Create an Audit Trail event.
|
18
|
-
#
|
19
|
-
# @param [Hash] event An event hash
|
20
|
-
# @option event [String] group A single organization containing related
|
21
|
-
# members. This will normally be the customer of a vendor's application.
|
22
|
-
# @option event [String] location Identifier for where the event
|
23
|
-
# originated. This will be an IP address (IPv4 or IPv6), hostname, or
|
24
|
-
# device ID.
|
25
|
-
# @option event [String] action Specific activity performed by the actor.
|
26
|
-
# @option event [String] action_type Corresponding CRUD category of the
|
27
|
-
# event. Can be one of C, R, U, or D.
|
28
|
-
# @option event [String] actor_name Display name of the entity performing
|
29
|
-
# the action.
|
30
|
-
# @option event [String] actor_id Unique identifier of the entity
|
31
|
-
# performing the action.
|
32
|
-
# @option event [String] target_name Display name of the object or
|
33
|
-
# resource that is being acted upon.
|
34
|
-
# @option event [String] target_id Unique identifier of the object or
|
35
|
-
# resource being acted upon.
|
36
|
-
# @option event [String] occurred_at ISO-8601 datetime at which the event
|
37
|
-
# happened, with millisecond precision.
|
38
|
-
# @option event [Hash] metadata Arbitrary key-value data containing
|
39
|
-
# information associated with the event. Note: There is a limit of 50
|
40
|
-
# keys. Key names can be up to 40 characters long, and values can be up
|
41
|
-
# to 500 characters long.
|
42
|
-
# @param [String] idempotency_key An idempotency key
|
43
|
-
sig do
|
44
|
-
params(
|
45
|
-
event: Hash,
|
46
|
-
idempotency_key: T.nilable(String),
|
47
|
-
).returns(::T.untyped)
|
48
|
-
end
|
49
|
-
|
50
|
-
def create_event(event:, idempotency_key: nil)
|
51
|
-
request = post_request(
|
52
|
-
path: '/events',
|
53
|
-
auth: true,
|
54
|
-
idempotency_key: idempotency_key,
|
55
|
-
body: event,
|
56
|
-
)
|
57
|
-
|
58
|
-
execute_request(request: request)
|
59
|
-
end
|
60
|
-
|
61
|
-
# Retrieve Audit Trail events.
|
62
|
-
#
|
63
|
-
# @param [Hash] options An options hash
|
64
|
-
# @option options [String] before Event ID to look before
|
65
|
-
# @option options [String] after Event ID to look after
|
66
|
-
# @option options [Integer] limit Number of Events to return
|
67
|
-
# @option options [String] order The order in which to paginate records
|
68
|
-
# @option options [Array<String>] group List of Groups to filter for
|
69
|
-
# @option options [Array<String>] action List of Actions to filter for
|
70
|
-
# @option options [Array<String>] action_type List of Action Types to
|
71
|
-
# filter for
|
72
|
-
# @option options [Array<String>] actor_name List of Actor Name to filter
|
73
|
-
# for
|
74
|
-
# @option options [Array<String>] actor_id List of Actor IDs to filter for
|
75
|
-
# @option options [Array<String>] target_name List of Target Names to
|
76
|
-
# filter for
|
77
|
-
# @option options [Array<String>] target_id List of Target IDs to filter
|
78
|
-
# for
|
79
|
-
# @option options [String] occurred_at ISO-8601 datetime of when an event
|
80
|
-
# occurred
|
81
|
-
# @option options [String] occurred_at_gt ISO-8601 datetime of when an
|
82
|
-
# event occurred after
|
83
|
-
# @option options [String] occurred_at_gte ISO-8601 datetime of when an
|
84
|
-
# event occurred at or after
|
85
|
-
# @option options [String] occurred_at_lt ISO-8601 datetime of when an
|
86
|
-
# event occurred before
|
87
|
-
# @option options [String] occurred_at_lte ISO-8601 datetime of when an
|
88
|
-
# event occured at or before
|
89
|
-
# @option options [String] search Keyword search
|
90
|
-
#
|
91
|
-
# @return [Array<Hash>]
|
92
|
-
sig do
|
93
|
-
params(
|
94
|
-
options: T::Hash[Symbol, String],
|
95
|
-
).returns(T::Array[T::Hash[String, T.nilable(String)]])
|
96
|
-
end
|
97
|
-
|
98
|
-
def get_events(options = {})
|
99
|
-
response = execute_request(
|
100
|
-
request: get_request(
|
101
|
-
path: '/events',
|
102
|
-
auth: true,
|
103
|
-
params: options,
|
104
|
-
),
|
105
|
-
)
|
106
|
-
|
107
|
-
JSON.parse(response.body)['data']
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
@@ -1,146 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
# typed: false
|
3
|
-
|
4
|
-
describe WorkOS::AuditTrail do
|
5
|
-
it_behaves_like 'client'
|
6
|
-
|
7
|
-
describe '.create_event' do
|
8
|
-
context 'with valid event payload' do
|
9
|
-
let(:valid_event) do
|
10
|
-
{
|
11
|
-
group: 'Terrace House',
|
12
|
-
location: '1.1.1.1',
|
13
|
-
action: 'house.created',
|
14
|
-
action_type: 'C',
|
15
|
-
actor_name: 'Daiki Miyagi',
|
16
|
-
actor_id: 'user_12345',
|
17
|
-
target_name: 'Ryota Yamasato',
|
18
|
-
target_id: 'user_67890',
|
19
|
-
occurred_at: '2020-01-10T15:30:00-05:00',
|
20
|
-
metadata: {
|
21
|
-
a: 'b',
|
22
|
-
},
|
23
|
-
}
|
24
|
-
end
|
25
|
-
|
26
|
-
context 'with idempotency key' do
|
27
|
-
context 'when idempotency key is used once' do
|
28
|
-
it 'creates an event' do
|
29
|
-
VCR.use_cassette('audit_trail/create_event_custom_idempotency_key') do
|
30
|
-
response = described_class.create_event(
|
31
|
-
event: valid_event,
|
32
|
-
idempotency_key: 'key',
|
33
|
-
)
|
34
|
-
|
35
|
-
expect(response.code).to eq '201'
|
36
|
-
json = JSON.parse(response.body)
|
37
|
-
expect(json['success']).to be true
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
context 'when idempotency key is used more than once' do
|
43
|
-
context 'with duplicate event payloads' do
|
44
|
-
it 'creates an event' do
|
45
|
-
VCR.use_cassette('audit_trail/create_events_duplicate_idempotency_key_and_payload') do
|
46
|
-
response1 = described_class.create_event(
|
47
|
-
event: valid_event,
|
48
|
-
idempotency_key: 'foo',
|
49
|
-
)
|
50
|
-
response2 = described_class.create_event(
|
51
|
-
event: valid_event,
|
52
|
-
idempotency_key: 'foo',
|
53
|
-
)
|
54
|
-
|
55
|
-
expect(response1.code).to eq '201'
|
56
|
-
json1 = JSON.parse(response1.body)
|
57
|
-
expect(json1['success']).to be true
|
58
|
-
|
59
|
-
expect(response2.code).to eq '201'
|
60
|
-
json2 = JSON.parse(response1.body)
|
61
|
-
expect(json2['success']).to be true
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
context 'with different event payloads' do
|
67
|
-
it 'raises an error' do
|
68
|
-
VCR.use_cassette('audit_trail/create_events_duplicate_idempotency_key_different_payload') do
|
69
|
-
described_class.create_event(
|
70
|
-
event: valid_event,
|
71
|
-
idempotency_key: 'bar',
|
72
|
-
)
|
73
|
-
|
74
|
-
payload = valid_event.clone
|
75
|
-
payload[:actor_name] = 'Tetsuya Sugaya'
|
76
|
-
|
77
|
-
expect do
|
78
|
-
described_class.create_event(
|
79
|
-
event: payload,
|
80
|
-
idempotency_key: 'bar',
|
81
|
-
)
|
82
|
-
end.to raise_error(
|
83
|
-
WorkOS::InvalidRequestError,
|
84
|
-
/Status 400, Another idempotency key \(bar\) with different request parameters was found. Please use a different idempotency key./,
|
85
|
-
)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
context 'with no idempotency key' do
|
93
|
-
it 'creates an event' do
|
94
|
-
VCR.use_cassette('audit_trail/create_event') do
|
95
|
-
response = described_class.create_event(event: valid_event)
|
96
|
-
|
97
|
-
expect(response.code).to eq '201'
|
98
|
-
json = JSON.parse(response.body)
|
99
|
-
expect(json['success']).to be true
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
context 'with invalid event payload' do
|
106
|
-
let(:invalid_event) do
|
107
|
-
{
|
108
|
-
group: 'Terrace House',
|
109
|
-
location: '1.1.1.1',
|
110
|
-
action: 'house.created',
|
111
|
-
actor_name: 'Daiki Miyagi',
|
112
|
-
actor_id: 'user_12345',
|
113
|
-
target_name: 'Ryota Yamasato',
|
114
|
-
target_id: 'user_67890',
|
115
|
-
occurred_at: '2020-01-10T15:30:00-05:00',
|
116
|
-
metadata: {
|
117
|
-
a: 'b',
|
118
|
-
},
|
119
|
-
}
|
120
|
-
end
|
121
|
-
|
122
|
-
it 'raises an error' do
|
123
|
-
VCR.use_cassette('audit_trail/create_event_invalid') do
|
124
|
-
expect do
|
125
|
-
described_class.create_event(event: invalid_event)
|
126
|
-
end.to raise_error(
|
127
|
-
WorkOS::InvalidRequestError,
|
128
|
-
/Status 422, Validation failed \(action_type: action_type must be a string\)/,
|
129
|
-
)
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
describe '.get_events' do
|
136
|
-
context 'with no options' do
|
137
|
-
it 'returns events' do
|
138
|
-
VCR.use_cassette('audit_trail/get_events') do
|
139
|
-
events = described_class.get_events
|
140
|
-
|
141
|
-
expect(events.size).to eq(2)
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|