workos 0.5.0 → 0.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 56cf52cb4a104516de13499b34f7c6f36a102c0c2af1bf6934e963579f27a596
4
- data.tar.gz: 45dee16f5ed91f99133e7f974d607e76effa73e0d0d3b271fd7e9756e72055c5
3
+ metadata.gz: f0fdd6aec096f0a3a3aa2f20c398515b1bf42d8e5b3d529e316bdce2327a0961
4
+ data.tar.gz: 269a70ac10a9aa6f7b49f7cefbde2b1af8e5bf559b429d202b5d5167bb8b83f2
5
5
  SHA512:
6
- metadata.gz: 00d537dcaf496aa3b8244f72b04137496fef5613100ec61d32f837f20f42f6f5ed20180d41eb560dd6bfe6491810f07d4f4401d0e0cacc121c991b5c74d80676
7
- data.tar.gz: 843f4d8558e3412ed6fa3becaf6c7717a301121baa7fd6edb292184518d335b2f616f024fdf13a9adf8659110aae3411744525be76f25f1bf238dd05acf14d99
6
+ metadata.gz: dd67a590cefd06ae6fc83e45cd0cfe9243d8849e865e0b7f7eb342d0bb9a29b10cbb6693802d54bb25c045a2f90505f17217358c36ef196a2066ffab0ca6f2bc
7
+ data.tar.gz: e528ade9f4a33fff0a25d24fcdb94f6232a3fc00c8ef27233735520a71a7b8c207c2fb853040c96ce34a5a8b91c842d4b9dc485699101bcc58159743f9471934
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- workos (0.5.0)
4
+ workos (0.6.0)
5
5
  sorbet-runtime (~> 0.5)
6
6
 
7
7
  GEM
@@ -54,7 +54,7 @@ GEM
54
54
  simplecov-html (0.12.2)
55
55
  sorbet (0.5.5560)
56
56
  sorbet-static (= 0.5.5560)
57
- sorbet-runtime (0.5.5877)
57
+ sorbet-runtime (0.5.5909)
58
58
  sorbet-static (0.5.5560-universal-darwin-14)
59
59
  unicode-display_width (1.6.0)
60
60
  vcr (5.0.0)
@@ -31,6 +31,8 @@ module WorkOS
31
31
  autoload :AuditTrail, 'workos/audit_trail'
32
32
  autoload :Connection, 'workos/connection'
33
33
  autoload :DirectorySync, 'workos/directory_sync'
34
+ autoload :Organization, 'workos/organization'
35
+ autoload :Portal, 'workos/portal'
34
36
  autoload :Profile, 'workos/profile'
35
37
  autoload :SSO, 'workos/sso'
36
38
 
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+
4
+ require 'json'
5
+
6
+ module WorkOS
7
+ # The Organization class provides a lightweight wrapper around
8
+ # a WorkOS Organization resource. This class is not meant to be instantiated
9
+ # in user space, and is instantiated internally but exposed.
10
+ class Organization
11
+ extend T::Sig
12
+
13
+ attr_accessor :id, :domains, :name
14
+
15
+ sig { params(json: String).void }
16
+ def initialize(json)
17
+ raw = parse_json(json)
18
+
19
+ @id = T.let(raw.id, String)
20
+ @name = T.let(raw.name, String)
21
+ @domains = T.let(raw.domains, Array)
22
+ end
23
+
24
+ def to_json(*)
25
+ {
26
+ id: id,
27
+ name: name,
28
+ domains: domains,
29
+ }
30
+ end
31
+
32
+ private
33
+
34
+ sig do
35
+ params(
36
+ json_string: String,
37
+ ).returns(WorkOS::Types::OrganizationStruct)
38
+ end
39
+ def parse_json(json_string)
40
+ hash = JSON.parse(json_string, symbolize_names: true)
41
+
42
+ WorkOS::Types::OrganizationStruct.new(
43
+ id: hash[:id],
44
+ name: hash[:name],
45
+ domains: hash[:domains],
46
+ )
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,145 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+
4
+ require 'net/http'
5
+
6
+ module WorkOS
7
+ # The Portal module provides resource methods for working with the Admin
8
+ # Portal product
9
+ module Portal
10
+ class << self
11
+ extend T::Sig
12
+ include Base
13
+ include Client
14
+
15
+ GENERATE_LINK_INTENTS = WorkOS::Types::Intent.values.map(&:serialize).
16
+ freeze
17
+
18
+ # Create an organization
19
+ #
20
+ # @param [Array<String>] domains List of domains that belong to the
21
+ # organization
22
+ # @param [String] name A unique, descriptive name for the organization
23
+ sig do
24
+ params(
25
+ domains: T::Array[String],
26
+ name: String,
27
+ ).returns(WorkOS::Organization)
28
+ end
29
+ def create_organization(domains:, name:)
30
+ request = post_request(
31
+ auth: true,
32
+ body: { domains: domains, name: name },
33
+ path: '/organizations',
34
+ )
35
+
36
+ response = execute_request(request: request)
37
+ check_and_raise_organization_error(response: response)
38
+
39
+ WorkOS::Organization.new(response.body)
40
+ end
41
+
42
+ # Generate a link to grant access to an organization's Admin Portal
43
+ #
44
+ # @param [String] intent The access scope for the generated Admin Portal
45
+ # link. Valid values are: ["sso"]
46
+ # @param [String] organization The ID of the organization the Admin
47
+ # Portal link will be generated for.
48
+ # @param [String] The URL that the end user will be redirected to upon
49
+ # exiting the generated Admin Portal. If none is provided, the default
50
+ # redirect link set in your WorkOS Dashboard will be used.
51
+ sig do
52
+ params(
53
+ intent: String,
54
+ organization: String,
55
+ return_url: T.nilable(String),
56
+ ).returns(String)
57
+ end
58
+ # rubocop:disable Metrics/MethodLength
59
+ def generate_link(intent:, organization:, return_url: nil)
60
+ validate_intent(intent)
61
+
62
+ request = post_request(
63
+ auth: true,
64
+ body: {
65
+ intent: intent,
66
+ organization: organization,
67
+ return_url: return_url,
68
+ },
69
+ path: '/portal/generate_link',
70
+ )
71
+
72
+ response = execute_request(request: request)
73
+
74
+ JSON.parse(response.body)['link']
75
+ end
76
+ # rubocop:enable Metrics/MethodLength
77
+
78
+ # Retrieve a list of organizations that have connections configured
79
+ # within your WorkOS dashboard.
80
+ #
81
+ # @param [Array<String>] domains Filter organizations to only return those
82
+ # that are associated with the provided domains.
83
+ # @param [String] before A pagination argument used to request
84
+ # organizations before the provided Organization ID.
85
+ # @param [String] after A pagination argument used to request
86
+ # organizations after the provided Organization ID.
87
+ # @param [Integer] limit A pagination argument used to limit the number
88
+ # of listed Organizations that are returned.
89
+ sig do
90
+ params(
91
+ options: T::Hash[Symbol, String],
92
+ ).returns(WorkOS::Types::ListStruct)
93
+ end
94
+ # rubocop:disable Metrics/MethodLength
95
+ def list_organizations(options = {})
96
+ response = execute_request(
97
+ request: get_request(
98
+ path: '/organizations',
99
+ auth: true,
100
+ params: options,
101
+ ),
102
+ )
103
+
104
+ parsed_response = JSON.parse(response.body)
105
+
106
+ WorkOS::Types::ListStruct.new(
107
+ data: parsed_response['data'],
108
+ list_metadata: parsed_response['listMetadata'],
109
+ )
110
+ end
111
+ # rubocop:enable Metrics/MethodLength
112
+
113
+ private
114
+
115
+ sig { params(response: Net::HTTPResponse).void }
116
+ # rubocop:disable Metrics/MethodLength
117
+ def check_and_raise_organization_error(response:)
118
+ begin
119
+ body = JSON.parse(response.body)
120
+ return unless body['message']
121
+
122
+ message = body['message']
123
+ request_id = response['x-request-id']
124
+ rescue StandardError
125
+ message = 'Something went wrong'
126
+ end
127
+
128
+ raise APIError.new(
129
+ message: message,
130
+ http_status: nil,
131
+ request_id: request_id,
132
+ )
133
+ end
134
+ # rubocop:enable Metrics/MethodLength
135
+
136
+ sig { params(intent: String).void }
137
+ def validate_intent(intent)
138
+ return if GENERATE_LINK_INTENTS.include?(intent)
139
+
140
+ raise ArgumentError, "#{intent} is not a valid value." \
141
+ " `intent` must be in #{GENERATE_LINK_INTENTS}"
142
+ end
143
+ end
144
+ end
145
+ end
@@ -6,6 +6,9 @@ module WorkOS
6
6
  # so we're using Sorbet throughout this Ruby gem.
7
7
  module Types
8
8
  require_relative 'types/connection_struct'
9
+ require_relative 'types/intent_enum'
10
+ require_relative 'types/list_struct'
11
+ require_relative 'types/organization_struct'
9
12
  require_relative 'types/profile_struct'
10
13
  require_relative 'types/provider_enum'
11
14
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ module WorkOS
5
+ module Types
6
+ # The IntentEnum is type-safe declarations of a fixed set of values for
7
+ # intents while generating an Admin Portal link.
8
+ class Intent < T::Enum
9
+ enums do
10
+ SSO = new('sso')
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ module WorkOS
5
+ module Types
6
+ # ListStruct acts as a typed interface to expose lists of data and related
7
+ # metadata
8
+ class ListStruct < T::Struct
9
+ const :data, T::Array[T.untyped]
10
+ const :list_metadata, T::Hash[String, T.nilable(String)]
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ module WorkOS
5
+ module Types
6
+ # This OrganizationStruct acts as a typed interface
7
+ # for the Organization class
8
+ class OrganizationStruct < T::Struct
9
+ const :id, String
10
+ const :name, String
11
+ const :domains, T::Array[T.untyped]
12
+ end
13
+ end
14
+ end
@@ -2,5 +2,5 @@
2
2
  # typed: strong
3
3
 
4
4
  module WorkOS
5
- VERSION = '0.5.0'
5
+ VERSION = '0.6.0'
6
6
  end
@@ -0,0 +1,176 @@
1
+ # frozen_string_literal: true
2
+ # typed: false
3
+
4
+ describe WorkOS::Portal do
5
+ before :all do
6
+ WorkOS.key = 'test'
7
+ end
8
+
9
+ after :all do
10
+ WorkOS.key = nil
11
+ end
12
+
13
+ describe '.create_organization' do
14
+ context 'with valid payload' do
15
+ it 'creates an organization' do
16
+ VCR.use_cassette 'organization/create' do
17
+ organization = described_class.create_organization(
18
+ domains: ['example.com'],
19
+ name: 'Test Organization',
20
+ )
21
+
22
+ expect(organization.id).to eq('org_01EHT88Z8J8795GZNQ4ZP1J81T')
23
+ expect(organization.name).to eq('Test Organization')
24
+ expect(organization.domains.first[:domain]).to eq('example.com')
25
+ end
26
+ end
27
+ end
28
+
29
+ context 'with an invalid payload' do
30
+ it 'returns an error' do
31
+ VCR.use_cassette 'organization/create_invalid' do
32
+ expect do
33
+ described_class.create_organization(
34
+ domains: ['example.com'],
35
+ name: 'Test Organization 2',
36
+ )
37
+ end.to raise_error(
38
+ WorkOS::APIError,
39
+ /An Organization with the domain example.com already exists/,
40
+ )
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ describe '.generate_link' do
47
+ let(:organization) { 'org_01EHQMYV6MBK39QC5PZXHY59C3' }
48
+
49
+ describe 'with a valid organization' do
50
+ describe 'with the minimal params' do
51
+ it 'returns an Admin Portal link' do
52
+ VCR.use_cassette 'portal/generate_link' do
53
+ portal_link = described_class.generate_link(
54
+ intent: 'sso',
55
+ organization: organization,
56
+ )
57
+
58
+ expect(portal_link).to eq(
59
+ 'https://id.workos.com/portal/launch?secret=secret',
60
+ )
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ describe 'with an invalid organization' do
67
+ it 'raises an error' do
68
+ VCR.use_cassette 'portal/generate_link_invalid' do
69
+ expect do
70
+ described_class.generate_link(
71
+ intent: 'sso',
72
+ organization: 'bogus-id',
73
+ )
74
+ end.to raise_error(
75
+ WorkOS::InvalidRequestError,
76
+ /Could not find an organization with the id, bogus-id/,
77
+ )
78
+ end
79
+ end
80
+ end
81
+
82
+ describe 'with an invalid intent' do
83
+ it 'raises an error' do
84
+ expect do
85
+ described_class.generate_link(
86
+ intent: 'bogus-intent',
87
+ organization: organization,
88
+ )
89
+ end.to raise_error(
90
+ ArgumentError,
91
+ 'bogus-intent is not a valid value. `intent` must be in ["sso"]',
92
+ )
93
+ end
94
+ end
95
+ end
96
+
97
+ describe '.list_organizations' do
98
+ context 'with no options' do
99
+ it 'returns organizations and metadata' do
100
+ expected_metadata = {
101
+ 'after' => nil,
102
+ 'before' => 'before-id',
103
+ }
104
+
105
+ VCR.use_cassette 'organization/list' do
106
+ organizations = described_class.list_organizations
107
+
108
+ expect(organizations.data.size).to eq(7)
109
+ expect(organizations.list_metadata).to eq(expected_metadata)
110
+ end
111
+ end
112
+ end
113
+
114
+ context 'with the before option' do
115
+ it 'forms the proper request to the API' do
116
+ request_args = [
117
+ '/organizations?before=before-id',
118
+ 'Content-Type' => 'application/json'
119
+ ]
120
+
121
+ expected_request = Net::HTTP::Get.new(*request_args)
122
+
123
+ expect(Net::HTTP::Get).to receive(:new).with(*request_args).
124
+ and_return(expected_request)
125
+
126
+ VCR.use_cassette 'organization/list', match_requests_on: [:path] do
127
+ organizations = described_class.list_organizations(
128
+ before: 'before-id',
129
+ )
130
+
131
+ expect(organizations.data.size).to eq(7)
132
+ end
133
+ end
134
+ end
135
+
136
+ context 'with the after option' do
137
+ it 'forms the proper request to the API' do
138
+ request_args = [
139
+ '/organizations?after=after-id',
140
+ 'Content-Type' => 'application/json'
141
+ ]
142
+
143
+ expected_request = Net::HTTP::Get.new(*request_args)
144
+
145
+ expect(Net::HTTP::Get).to receive(:new).with(*request_args).
146
+ and_return(expected_request)
147
+
148
+ VCR.use_cassette 'organization/list', match_requests_on: [:path] do
149
+ organizations = described_class.list_organizations(after: 'after-id')
150
+
151
+ expect(organizations.data.size).to eq(7)
152
+ end
153
+ end
154
+ end
155
+
156
+ context 'with the limit option' do
157
+ it 'forms the proper request to the API' do
158
+ request_args = [
159
+ '/organizations?limit=10',
160
+ 'Content-Type' => 'application/json'
161
+ ]
162
+
163
+ expected_request = Net::HTTP::Get.new(*request_args)
164
+
165
+ expect(Net::HTTP::Get).to receive(:new).with(*request_args).
166
+ and_return(expected_request)
167
+
168
+ VCR.use_cassette 'organization/list', match_requests_on: [:path] do
169
+ organizations = described_class.list_organizations(limit: 10)
170
+
171
+ expect(organizations.data.size).to eq(7)
172
+ end
173
+ end
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,72 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api.workos.com/organizations
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"domains":["example.com"],"name":"Test Organization"}'
9
+ headers:
10
+ Content-Type:
11
+ - application/json
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ User-Agent:
17
+ - WorkOS; ruby/2.7.1; x86_64-darwin19; v0.5.0
18
+ Authorization:
19
+ - Bearer <API_KEY>
20
+ response:
21
+ status:
22
+ code: 201
23
+ message: Created
24
+ headers:
25
+ Server:
26
+ - Cowboy
27
+ Connection:
28
+ - keep-alive
29
+ Vary:
30
+ - Origin, Accept-Encoding
31
+ Access-Control-Allow-Credentials:
32
+ - 'true'
33
+ Content-Security-Policy:
34
+ - 'default-src ''self'';base-uri ''self'';block-all-mixed-content;font-src ''self''
35
+ https: data:;frame-ancestors ''self'';img-src ''self'' data:;object-src ''none'';script-src
36
+ ''self'';script-src-attr ''none'';style-src ''self'' https: ''unsafe-inline'';upgrade-insecure-requests'
37
+ X-Dns-Prefetch-Control:
38
+ - 'off'
39
+ Expect-Ct:
40
+ - max-age=0
41
+ X-Frame-Options:
42
+ - SAMEORIGIN
43
+ Strict-Transport-Security:
44
+ - max-age=15552000; includeSubDomains
45
+ X-Download-Options:
46
+ - noopen
47
+ X-Content-Type-Options:
48
+ - nosniff
49
+ X-Permitted-Cross-Domain-Policies:
50
+ - none
51
+ Referrer-Policy:
52
+ - no-referrer
53
+ X-Xss-Protection:
54
+ - '0'
55
+ X-Request-Id:
56
+ - bcddfa8b-3a12-4d48-b265-6094a26225a4
57
+ Content-Type:
58
+ - application/json; charset=utf-8
59
+ Content-Length:
60
+ - '203'
61
+ Etag:
62
+ - W/"cb-T4+GTGrJeuAmC0PAjcaSX5ZXL18"
63
+ Date:
64
+ - Wed, 09 Sep 2020 20:17:53 GMT
65
+ Via:
66
+ - 1.1 vegur
67
+ body:
68
+ encoding: UTF-8
69
+ string: '{"name":"Test Organization","object":"organization","id":"org_01EHT88Z8J8795GZNQ4ZP1J81T","domains":[{"domain":"example.com","object":"organization_domain","id":"org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8"}]}'
70
+ http_version:
71
+ recorded_at: Wed, 09 Sep 2020 20:17:54 GMT
72
+ recorded_with: VCR 5.0.0
@@ -0,0 +1,72 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api.workos.com/organizations
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"domains":["example.com"],"name":"Test Organization 2"}'
9
+ headers:
10
+ Content-Type:
11
+ - application/json
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ User-Agent:
17
+ - WorkOS; ruby/2.7.1; x86_64-darwin19; v0.5.0
18
+ Authorization:
19
+ - Bearer <API_KEY>
20
+ response:
21
+ status:
22
+ code: 409
23
+ message: Conflict
24
+ headers:
25
+ Server:
26
+ - Cowboy
27
+ Connection:
28
+ - keep-alive
29
+ Vary:
30
+ - Origin, Accept-Encoding
31
+ Access-Control-Allow-Credentials:
32
+ - 'true'
33
+ Content-Security-Policy:
34
+ - 'default-src ''self'';base-uri ''self'';block-all-mixed-content;font-src ''self''
35
+ https: data:;frame-ancestors ''self'';img-src ''self'' data:;object-src ''none'';script-src
36
+ ''self'';script-src-attr ''none'';style-src ''self'' https: ''unsafe-inline'';upgrade-insecure-requests'
37
+ X-Dns-Prefetch-Control:
38
+ - 'off'
39
+ Expect-Ct:
40
+ - max-age=0
41
+ X-Frame-Options:
42
+ - SAMEORIGIN
43
+ Strict-Transport-Security:
44
+ - max-age=15552000; includeSubDomains
45
+ X-Download-Options:
46
+ - noopen
47
+ X-Content-Type-Options:
48
+ - nosniff
49
+ X-Permitted-Cross-Domain-Policies:
50
+ - none
51
+ Referrer-Policy:
52
+ - no-referrer
53
+ X-Xss-Protection:
54
+ - '0'
55
+ X-Request-Id:
56
+ - 929940d6-33dd-404c-9856-eca6cc606d28
57
+ Content-Type:
58
+ - application/json; charset=utf-8
59
+ Content-Length:
60
+ - '73'
61
+ Etag:
62
+ - W/"49-8i1S2EtfSciiA8rvGWbYFNlSlhw"
63
+ Date:
64
+ - Wed, 09 Sep 2020 21:26:03 GMT
65
+ Via:
66
+ - 1.1 vegur
67
+ body:
68
+ encoding: UTF-8
69
+ string: '{"message":"An Organization with the domain example.com already exists."}'
70
+ http_version:
71
+ recorded_at: Wed, 09 Sep 2020 21:26:03 GMT
72
+ recorded_with: VCR 5.0.0
@@ -0,0 +1,72 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.workos.com/organizations
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Content-Type:
11
+ - application/json
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ User-Agent:
17
+ - WorkOS; ruby/2.7.1; x86_64-darwin19; v0.5.0
18
+ Authorization:
19
+ - Bearer <API_KEY>
20
+ response:
21
+ status:
22
+ code: 200
23
+ message: OK
24
+ headers:
25
+ Server:
26
+ - Cowboy
27
+ Connection:
28
+ - keep-alive
29
+ Vary:
30
+ - Origin, Accept-Encoding
31
+ Access-Control-Allow-Credentials:
32
+ - 'true'
33
+ Content-Security-Policy:
34
+ - 'default-src ''self'';base-uri ''self'';block-all-mixed-content;font-src ''self''
35
+ https: data:;frame-ancestors ''self'';img-src ''self'' data:;object-src ''none'';script-src
36
+ ''self'';script-src-attr ''none'';style-src ''self'' https: ''unsafe-inline'';upgrade-insecure-requests'
37
+ X-Dns-Prefetch-Control:
38
+ - 'off'
39
+ Expect-Ct:
40
+ - max-age=0
41
+ X-Frame-Options:
42
+ - SAMEORIGIN
43
+ Strict-Transport-Security:
44
+ - max-age=15552000; includeSubDomains
45
+ X-Download-Options:
46
+ - noopen
47
+ X-Content-Type-Options:
48
+ - nosniff
49
+ X-Permitted-Cross-Domain-Policies:
50
+ - none
51
+ Referrer-Policy:
52
+ - no-referrer
53
+ X-Xss-Protection:
54
+ - '0'
55
+ X-Request-Id:
56
+ - bac447a8-ba37-40d0-bd2e-c6b0d9e55cb4
57
+ Content-Type:
58
+ - application/json; charset=utf-8
59
+ Etag:
60
+ - W/"5e0-jXwzOfsEklDxV9I2vJyDWqYBnmU"
61
+ Date:
62
+ - Tue, 08 Sep 2020 23:05:22 GMT
63
+ Transfer-Encoding:
64
+ - chunked
65
+ Via:
66
+ - 1.1 vegur
67
+ body:
68
+ encoding: ASCII-8BIT
69
+ string: '{"object":"list","data":[{"object":"organization","id":"org_01EHQMYV6MBK39QC5PZXHY59C3","name":"example.com","domains":[{"object":"organization_domain","id":"org_domain_01EHQMYV71XT8H31WE5HF8YK4A","domain":"example.com"}]},{"object":"organization","id":"org_01EHQMVDTC2GRAHFCCRNTSKH46","name":"example2.com","domains":[{"object":"organization_domain","id":"org_domain_01EHQMVDTZVA27PK614ME4YK7V","domain":"example2.com"}]},{"object":"organization","id":"org_01EGS4P7QR31EZ4YWD1Z1XA176","name":"foo-corp.com","domains":[{"object":"organization_domain","id":"org_domain_01EGS4P7RNQPFQAQ7SKCC40KNE","domain":"foo-corp.com"}]},{"object":"organization","id":"org_01EGPYFYM0Y66AHNYQG9Z63DTN","name":"example3.com","domains":[{"object":"organization_domain","id":"org_domain_01EGPYFYMGTRR38Z109MCJ3HHA","domain":"example3.com"}]},{"object":"organization","id":"org_01EGPJWMT2EQMK7FMPR3TBC861","name":"workos.com","domains":[{"object":"organization_domain","id":"org_domain_01EGPJWMTHRB5FP6MKE14RZ9BQ","domain":"workos.com"}]},{"object":"organization","id":"org_01EGPJ5YY5P897573GJFGGY7ZF","name":"example4.com","domains":[{"object":"organization_domain","id":"org_domain_01EGPJ5YYE7V931BWYS1AJHHHC","domain":"example4.com"}]},{"object":"organization","id":"org_01EGP9Z6RY2J6YE0ZV57CGEXV2","name":"example5.com","domains":[{"object":"organization_domain","id":"org_domain_01EGP9Z6S6HVQ5CPD152GJBEA5","domain":"example5.com"}]}],"listMetadata":{"before":"before-id","after":null}}'
70
+ http_version:
71
+ recorded_at: Tue, 08 Sep 2020 23:05:22 GMT
72
+ recorded_with: VCR 5.0.0
@@ -0,0 +1,72 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api.workos.com/portal/generate_link
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"intent":"sso","organization":"org_01EHQMYV6MBK39QC5PZXHY59C3","return_url":null}'
9
+ headers:
10
+ Content-Type:
11
+ - application/json
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ User-Agent:
17
+ - WorkOS; ruby/2.7.1; x86_64-darwin19; v0.5.0
18
+ Authorization:
19
+ - Bearer <API_KEY>
20
+ response:
21
+ status:
22
+ code: 201
23
+ message: Created
24
+ headers:
25
+ Server:
26
+ - Cowboy
27
+ Connection:
28
+ - keep-alive
29
+ Vary:
30
+ - Origin, Accept-Encoding
31
+ Access-Control-Allow-Credentials:
32
+ - 'true'
33
+ Content-Security-Policy:
34
+ - 'default-src ''self'';base-uri ''self'';block-all-mixed-content;font-src ''self''
35
+ https: data:;frame-ancestors ''self'';img-src ''self'' data:;object-src ''none'';script-src
36
+ ''self'';script-src-attr ''none'';style-src ''self'' https: ''unsafe-inline'';upgrade-insecure-requests'
37
+ X-Dns-Prefetch-Control:
38
+ - 'off'
39
+ Expect-Ct:
40
+ - max-age=0
41
+ X-Frame-Options:
42
+ - SAMEORIGIN
43
+ Strict-Transport-Security:
44
+ - max-age=15552000; includeSubDomains
45
+ X-Download-Options:
46
+ - noopen
47
+ X-Content-Type-Options:
48
+ - nosniff
49
+ X-Permitted-Cross-Domain-Policies:
50
+ - none
51
+ Referrer-Policy:
52
+ - no-referrer
53
+ X-Xss-Protection:
54
+ - '0'
55
+ X-Request-Id:
56
+ - cb9ad5cf-243a-4084-a4f6-2d7d2b097b8b
57
+ Content-Type:
58
+ - application/json; charset=utf-8
59
+ Content-Length:
60
+ - '79'
61
+ Etag:
62
+ - W/"4f-NN86NUZRu/GQgPAYTexTS6/9DnM"
63
+ Date:
64
+ - Wed, 09 Sep 2020 23:43:07 GMT
65
+ Via:
66
+ - 1.1 vegur
67
+ body:
68
+ encoding: UTF-8
69
+ string: '{"link":"https://id.workos.com/portal/launch?secret=secret"}'
70
+ http_version:
71
+ recorded_at: Wed, 09 Sep 2020 23:43:07 GMT
72
+ recorded_with: VCR 5.0.0
@@ -0,0 +1,72 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api.workos.com/portal/generate_link
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"intent":"sso","organization":"bogus-id","return_url":null}'
9
+ headers:
10
+ Content-Type:
11
+ - application/json
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ User-Agent:
17
+ - WorkOS; ruby/2.7.1; x86_64-darwin19; v0.5.0
18
+ Authorization:
19
+ - Bearer <API_KEY>
20
+ response:
21
+ status:
22
+ code: 400
23
+ message: Bad Request
24
+ headers:
25
+ Server:
26
+ - Cowboy
27
+ Connection:
28
+ - keep-alive
29
+ Vary:
30
+ - Origin, Accept-Encoding
31
+ Access-Control-Allow-Credentials:
32
+ - 'true'
33
+ Content-Security-Policy:
34
+ - 'default-src ''self'';base-uri ''self'';block-all-mixed-content;font-src ''self''
35
+ https: data:;frame-ancestors ''self'';img-src ''self'' data:;object-src ''none'';script-src
36
+ ''self'';script-src-attr ''none'';style-src ''self'' https: ''unsafe-inline'';upgrade-insecure-requests'
37
+ X-Dns-Prefetch-Control:
38
+ - 'off'
39
+ Expect-Ct:
40
+ - max-age=0
41
+ X-Frame-Options:
42
+ - SAMEORIGIN
43
+ Strict-Transport-Security:
44
+ - max-age=15552000; includeSubDomains
45
+ X-Download-Options:
46
+ - noopen
47
+ X-Content-Type-Options:
48
+ - nosniff
49
+ X-Permitted-Cross-Domain-Policies:
50
+ - none
51
+ Referrer-Policy:
52
+ - no-referrer
53
+ X-Xss-Protection:
54
+ - '0'
55
+ X-Request-Id:
56
+ - f1c46aa5-0d87-4d9a-b2ce-dc0505eb8f75
57
+ Content-Type:
58
+ - application/json; charset=utf-8
59
+ Content-Length:
60
+ - '67'
61
+ Etag:
62
+ - W/"43-kRRkij6uWMfZoSUJpiGbSXw7SNc"
63
+ Date:
64
+ - Thu, 10 Sep 2020 16:14:41 GMT
65
+ Via:
66
+ - 1.1 vegur
67
+ body:
68
+ encoding: UTF-8
69
+ string: '{"message":"Could not find an organization with the id, bogus-id."}'
70
+ http_version:
71
+ recorded_at: Thu, 10 Sep 2020 16:14:41 GMT
72
+ recorded_with: VCR 5.0.0
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workos
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - WorkOS
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-25 00:00:00.000000000 Z
11
+ date: 2020-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sorbet-runtime
@@ -213,10 +213,15 @@ files:
213
213
  - lib/workos/connection.rb
214
214
  - lib/workos/directory_sync.rb
215
215
  - lib/workos/errors.rb
216
+ - lib/workos/organization.rb
217
+ - lib/workos/portal.rb
216
218
  - lib/workos/profile.rb
217
219
  - lib/workos/sso.rb
218
220
  - lib/workos/types.rb
219
221
  - lib/workos/types/connection_struct.rb
222
+ - lib/workos/types/intent_enum.rb
223
+ - lib/workos/types/list_struct.rb
224
+ - lib/workos/types/organization_struct.rb
220
225
  - lib/workos/types/profile_struct.rb
221
226
  - lib/workos/types/provider_enum.rb
222
227
  - lib/workos/version.rb
@@ -232,6 +237,7 @@ files:
232
237
  - spec/lib/workos/audit_trail_spec.rb
233
238
  - spec/lib/workos/base_spec.rb
234
239
  - spec/lib/workos/directory_sync_spec.rb
240
+ - spec/lib/workos/portal_spec.rb
235
241
  - spec/lib/workos/sso_spec.rb
236
242
  - spec/spec_helper.rb
237
243
  - spec/support/fixtures/vcr_cassettes/audit_trail/create_event.yml
@@ -251,6 +257,11 @@ files:
251
257
  - spec/support/fixtures/vcr_cassettes/directory_sync/list_groups_with_directory_param.yml
252
258
  - spec/support/fixtures/vcr_cassettes/directory_sync/list_users.yml
253
259
  - spec/support/fixtures/vcr_cassettes/directory_sync/list_users_with_directory_param.yml
260
+ - spec/support/fixtures/vcr_cassettes/organization/create.yml
261
+ - spec/support/fixtures/vcr_cassettes/organization/create_invalid.yml
262
+ - spec/support/fixtures/vcr_cassettes/organization/list.yml
263
+ - spec/support/fixtures/vcr_cassettes/portal/generate_link.yml
264
+ - spec/support/fixtures/vcr_cassettes/portal/generate_link_invalid.yml
254
265
  - spec/support/fixtures/vcr_cassettes/sso/create_connection_with_invalid_source.yml
255
266
  - spec/support/fixtures/vcr_cassettes/sso/create_connection_with_valid_source.yml
256
267
  - spec/support/profile.txt
@@ -283,6 +294,7 @@ test_files:
283
294
  - spec/lib/workos/audit_trail_spec.rb
284
295
  - spec/lib/workos/base_spec.rb
285
296
  - spec/lib/workos/directory_sync_spec.rb
297
+ - spec/lib/workos/portal_spec.rb
286
298
  - spec/lib/workos/sso_spec.rb
287
299
  - spec/spec_helper.rb
288
300
  - spec/support/fixtures/vcr_cassettes/audit_trail/create_event.yml
@@ -302,6 +314,11 @@ test_files:
302
314
  - spec/support/fixtures/vcr_cassettes/directory_sync/list_groups_with_directory_param.yml
303
315
  - spec/support/fixtures/vcr_cassettes/directory_sync/list_users.yml
304
316
  - spec/support/fixtures/vcr_cassettes/directory_sync/list_users_with_directory_param.yml
317
+ - spec/support/fixtures/vcr_cassettes/organization/create.yml
318
+ - spec/support/fixtures/vcr_cassettes/organization/create_invalid.yml
319
+ - spec/support/fixtures/vcr_cassettes/organization/list.yml
320
+ - spec/support/fixtures/vcr_cassettes/portal/generate_link.yml
321
+ - spec/support/fixtures/vcr_cassettes/portal/generate_link_invalid.yml
305
322
  - spec/support/fixtures/vcr_cassettes/sso/create_connection_with_invalid_source.yml
306
323
  - spec/support/fixtures/vcr_cassettes/sso/create_connection_with_valid_source.yml
307
324
  - spec/support/profile.txt