Skip to content

Commit 14effe0

Browse files
Refactor errors (#96)
* Rename SeamHttpApiError to HttpApiError * Rename SeamHttpUnauthorizedError to UnauthorizedError * Rename UnauthorizedError to HttpUnauthorizedError * Rename SeamHttpInvalidInputError to InvalidInputError * Rename SeamActionAttemptError to ActionAttemptError * Rename SeamActionAttemptFailedError to ActionAttemptFailedError * More SeamActionAttemptFailedError rename * Rename SeamActionAttemptTimeoutError to ActionAttemptTimeoutError * ci: Format code * Fix tests, move SeamInvalidTokenError to Http module * Rename Http to Client and HttptMultiWorkspace to ClientMultiWorkspace * Leftover renames * Renames in lib/seam.rb * Move http errors to http module, fix specs * Put action attempt errors under errors module * Rename SeamWebhook to Webhook * Make Http a module with http errors, SingleWorkspace and MultiWorkspace classes * Bump generator to 1.14.5 to put resource related stuff under Resources module * Alias factory methods * Clean up public exports * Bump generator to include base client and resource imports in the routes * Move action attempt errors under WaitForActionAttempt module * Remove Http prefix from http errors * Reduce nesting of wait for action attempt errors * Refactor SeamOptions and SeamAuth --------- Co-authored-by: Seam Bot <devops@getseam.com>
1 parent cb96dcf commit 14effe0

99 files changed

Lines changed: 764 additions & 650 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

lib/seam.rb

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,21 @@
11
# frozen_string_literal: true
22

3-
require_relative "seam/version"
4-
require_relative "seam/lts_version"
5-
require_relative "seam/default_endpoint"
6-
require_relative "seam/request"
73
require_relative "seam/logger"
84
require_relative "seam/http"
9-
require_relative "seam/http_multi_workspace"
10-
require_relative "seam/base_client"
11-
require_relative "seam/base_resource"
12-
require_relative "seam/errors"
13-
require_relative "seam/seam_webhook"
14-
15-
require_relative "seam/routes/resources/index"
16-
require_relative "seam/routes/clients/index"
5+
require_relative "seam/wait_for_action_attempt"
6+
require_relative "seam/webhook"
177

188
module Seam
199
def self.new(**args)
2010
Http.new(**args)
2111
end
2212

2313
def self.from_api_key(api_key, endpoint: nil, wait_for_action_attempt: false, debug: false)
24-
new(api_key: api_key, endpoint: endpoint, wait_for_action_attempt: wait_for_action_attempt, debug: debug)
14+
Http.from_api_key(api_key, endpoint: endpoint, wait_for_action_attempt: wait_for_action_attempt, debug: debug)
2515
end
2616

2717
def self.from_personal_access_token(personal_access_token, workspace_id, endpoint: nil, wait_for_action_attempt: false, debug: false)
28-
new(personal_access_token: personal_access_token, workspace_id: workspace_id, endpoint: endpoint, wait_for_action_attempt: wait_for_action_attempt, debug: debug)
18+
Http.from_personal_access_token(personal_access_token, workspace_id, endpoint: endpoint, wait_for_action_attempt: wait_for_action_attempt, debug: debug)
2919
end
3020

3121
def self.lts_version

lib/seam/auth.rb

Lines changed: 110 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -3,112 +3,116 @@
33
require_relative "options"
44
require_relative "token"
55

6-
module SeamAuth
7-
class SeamInvalidTokenError < StandardError
8-
def initialize(message)
9-
super("Seam received an invalid token: #{message}")
6+
module Seam
7+
module Http
8+
module Auth
9+
class SeamInvalidTokenError < StandardError
10+
def initialize(message)
11+
super("Seam received an invalid token: #{message}")
12+
end
13+
end
14+
15+
def self.get_auth_headers(api_key: nil, personal_access_token: nil, workspace_id: nil)
16+
if Http::Options.seam_http_options_with_api_key?(api_key: api_key, personal_access_token: personal_access_token)
17+
return get_auth_headers_for_api_key(api_key)
18+
end
19+
20+
if Http::Options.seam_http_options_with_personal_access_token?(personal_access_token: personal_access_token, api_key: api_key,
21+
workspace_id: workspace_id)
22+
return get_auth_headers_for_personal_access_token(personal_access_token, workspace_id)
23+
end
24+
25+
raise Http::Options::SeamInvalidOptionsError.new(
26+
"Must specify an api_key or personal_access_token. " \
27+
"Attempted reading configuration from the environment, " \
28+
"but the environment variable SEAM_API_KEY is not set."
29+
)
30+
end
31+
32+
def self.get_auth_headers_for_api_key(api_key)
33+
if Auth.client_session_token?(api_key)
34+
raise SeamInvalidTokenError.new(
35+
"A Client Session Token cannot be used as an api_key"
36+
)
37+
end
38+
39+
raise SeamInvalidTokenError.new("A JWT cannot be used as an api_key") if Auth.jwt?(api_key)
40+
41+
raise SeamInvalidTokenError.new("An Access Token cannot be used as an api_key") if Auth.access_token?(api_key)
42+
43+
if Auth.publishable_key?(api_key)
44+
raise SeamInvalidTokenError.new(
45+
"A Publishable Key cannot be used as an api_key"
46+
)
47+
end
48+
49+
unless Auth.seam_token?(api_key)
50+
raise SeamInvalidTokenError.new(
51+
"Unknown or invalid api_key format, expected token to start with #{Auth::TOKEN_PREFIX}"
52+
)
53+
end
54+
55+
{"authorization" => "Bearer #{api_key}"}
56+
end
57+
58+
def self.get_auth_headers_for_personal_access_token(personal_access_token, workspace_id)
59+
if Auth.jwt?(personal_access_token)
60+
raise SeamInvalidTokenError.new(
61+
"A JWT cannot be used as a personal_access_token"
62+
)
63+
end
64+
65+
if Auth.client_session_token?(personal_access_token)
66+
raise SeamInvalidTokenError.new(
67+
"A Client Session Token cannot be used as a personal_access_token"
68+
)
69+
end
70+
71+
if Auth.publishable_key?(personal_access_token)
72+
raise SeamInvalidTokenError.new(
73+
"A Publishable Key cannot be used as a personal_access_token"
74+
)
75+
end
76+
77+
unless Auth.access_token?(personal_access_token)
78+
raise SeamInvalidTokenError.new(
79+
"Unknown or invalid personal_access_token format, expected token to start with #{Auth::ACCESS_TOKEN_PREFIX}"
80+
)
81+
end
82+
83+
{
84+
"authorization" => "Bearer #{personal_access_token}",
85+
"seam-workspace" => workspace_id
86+
}
87+
end
88+
89+
def self.get_auth_headers_for_multi_workspace_personal_access_token(personal_access_token)
90+
if Auth.jwt?(personal_access_token)
91+
raise SeamInvalidTokenError.new(
92+
"A JWT cannot be used as a personal_access_token"
93+
)
94+
end
95+
96+
if Auth.client_session_token?(personal_access_token)
97+
raise SeamInvalidTokenError.new(
98+
"A Client Session Token cannot be used as a personal_access_token"
99+
)
100+
end
101+
102+
if Auth.publishable_key?(personal_access_token)
103+
raise SeamInvalidTokenError.new(
104+
"A Publishable Key cannot be used as a personal_access_token"
105+
)
106+
end
107+
108+
unless Auth.access_token?(personal_access_token)
109+
raise SeamInvalidTokenError.new(
110+
"Unknown or invalid personal_access_token format, expected token to start with #{Auth::ACCESS_TOKEN_PREFIX}"
111+
)
112+
end
113+
114+
{"authorization" => "Bearer #{personal_access_token}"}
115+
end
10116
end
11117
end
12-
13-
def self.get_auth_headers(api_key: nil, personal_access_token: nil, workspace_id: nil)
14-
if SeamOptions.seam_http_options_with_api_key?(api_key: api_key, personal_access_token: personal_access_token)
15-
return get_auth_headers_for_api_key(api_key)
16-
end
17-
18-
if SeamOptions.seam_http_options_with_personal_access_token?(personal_access_token: personal_access_token, api_key: api_key,
19-
workspace_id: workspace_id)
20-
return get_auth_headers_for_personal_access_token(personal_access_token, workspace_id)
21-
end
22-
23-
raise SeamOptions::SeamInvalidOptionsError.new(
24-
"Must specify an api_key or personal_access_token. " \
25-
"Attempted reading configuration from the environment, " \
26-
"but the environment variable SEAM_API_KEY is not set."
27-
)
28-
end
29-
30-
def self.get_auth_headers_for_api_key(api_key)
31-
if SeamAuth.client_session_token?(api_key)
32-
raise SeamInvalidTokenError.new(
33-
"A Client Session Token cannot be used as an api_key"
34-
)
35-
end
36-
37-
raise SeamInvalidTokenError.new("A JWT cannot be used as an api_key") if SeamAuth.jwt?(api_key)
38-
39-
raise SeamInvalidTokenError.new("An Access Token cannot be used as an api_key") if SeamAuth.access_token?(api_key)
40-
41-
if SeamAuth.publishable_key?(api_key)
42-
raise SeamInvalidTokenError.new(
43-
"A Publishable Key cannot be used as an api_key"
44-
)
45-
end
46-
47-
unless SeamAuth.seam_token?(api_key)
48-
raise SeamInvalidTokenError.new(
49-
"Unknown or invalid api_key format, expected token to start with #{SeamAuth::TOKEN_PREFIX}"
50-
)
51-
end
52-
53-
{"authorization" => "Bearer #{api_key}"}
54-
end
55-
56-
def self.get_auth_headers_for_personal_access_token(personal_access_token, workspace_id)
57-
if SeamAuth.jwt?(personal_access_token)
58-
raise SeamInvalidTokenError.new(
59-
"A JWT cannot be used as a personal_access_token"
60-
)
61-
end
62-
63-
if SeamAuth.client_session_token?(personal_access_token)
64-
raise SeamInvalidTokenError.new(
65-
"A Client Session Token cannot be used as a personal_access_token"
66-
)
67-
end
68-
69-
if SeamAuth.publishable_key?(personal_access_token)
70-
raise SeamInvalidTokenError.new(
71-
"A Publishable Key cannot be used as a personal_access_token"
72-
)
73-
end
74-
75-
unless SeamAuth.access_token?(personal_access_token)
76-
raise SeamInvalidTokenError.new(
77-
"Unknown or invalid personal_access_token format, expected token to start with #{SeamAuth::ACCESS_TOKEN_PREFIX}"
78-
)
79-
end
80-
81-
{
82-
"authorization" => "Bearer #{personal_access_token}",
83-
"seam-workspace" => workspace_id
84-
}
85-
end
86-
87-
def self.get_auth_headers_for_multi_workspace_personal_access_token(personal_access_token)
88-
if SeamAuth.jwt?(personal_access_token)
89-
raise SeamInvalidTokenError.new(
90-
"A JWT cannot be used as a personal_access_token"
91-
)
92-
end
93-
94-
if SeamAuth.client_session_token?(personal_access_token)
95-
raise SeamInvalidTokenError.new(
96-
"A Client Session Token cannot be used as a personal_access_token"
97-
)
98-
end
99-
100-
if SeamAuth.publishable_key?(personal_access_token)
101-
raise SeamInvalidTokenError.new(
102-
"A Publishable Key cannot be used as a personal_access_token"
103-
)
104-
end
105-
106-
unless SeamAuth.access_token?(personal_access_token)
107-
raise SeamInvalidTokenError.new(
108-
"Unknown or invalid personal_access_token format, expected token to start with #{SeamAuth::ACCESS_TOKEN_PREFIX}"
109-
)
110-
end
111-
112-
{"authorization" => "Bearer #{personal_access_token}"}
113-
end
114118
end

lib/seam/base_resource.rb

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,59 +3,61 @@
33
require_relative "deep_hash_accessor"
44

55
module Seam
6-
class BaseResource
7-
attr_accessor :data, :client
6+
module Resources
7+
class BaseResource
8+
attr_accessor :data, :client
89

9-
def initialize(data, client = nil)
10-
@data = data
11-
@client = client
10+
def initialize(data, client = nil)
11+
@data = data
12+
@client = client
1213

13-
@data.each do |key, value|
14-
value = Seam::DeepHashAccessor.new(value) if value.is_a?(Hash)
15-
instance_variable_set(:"@#{key}", value)
14+
@data.each do |key, value|
15+
value = Seam::DeepHashAccessor.new(value) if value.is_a?(Hash)
16+
instance_variable_set(:"@#{key}", value)
17+
end
1618
end
17-
end
1819

19-
def update_from_response(data)
20-
@data = data
21-
@data.each do |key, value|
22-
instance_variable_set(:"@#{key}", value)
20+
def update_from_response(data)
21+
@data = data
22+
@data.each do |key, value|
23+
instance_variable_set(:"@#{key}", value)
24+
end
2325
end
24-
end
2526

26-
def self.load_from_response(data, client = nil)
27-
if data.is_a?(Array)
28-
data.map { |d| new(d, client) }
29-
else
30-
new(data, client)
27+
def self.load_from_response(data, client = nil)
28+
if data.is_a?(Array)
29+
data.map { |d| new(d, client) }
30+
else
31+
new(data, client)
32+
end
3133
end
32-
end
3334

34-
def inspect
35-
"<#{self.class.name}:#{"0x00%x" % (object_id << 1)}\n" + # rubocop:disable Style/StringConcatenation, Style/FormatString
36-
instance_variables
37-
.map { |k| k.to_s.sub("@", "") }
38-
.filter { |k| k != "data" and k != "client" and respond_to? k }
39-
.map { |k| " #{k}=#{send(k).inspect}" }
40-
.join("\n") + ">"
41-
end
35+
def inspect
36+
"<#{self.class.name}:#{"0x00%x" % (object_id << 1)}\n" + # rubocop:disable Style/StringConcatenation, Style/FormatString
37+
instance_variables
38+
.map { |k| k.to_s.sub("@", "") }
39+
.filter { |k| k != "data" and k != "client" and respond_to? k }
40+
.map { |k| " #{k}=#{send(k).inspect}" }
41+
.join("\n") + ">"
42+
end
4243

43-
def self.date_accessor(*attrs)
44-
attrs.each do |attr|
45-
define_method(attr) do
46-
value = instance_variable_get(:"@#{attr}")
44+
def self.date_accessor(*attrs)
45+
attrs.each do |attr|
46+
define_method(attr) do
47+
value = instance_variable_get(:"@#{attr}")
4748

48-
raise "No value for #{attr} set" if value.nil?
49+
raise "No value for #{attr} set" if value.nil?
4950

50-
parse_datetime(value)
51+
parse_datetime(value)
52+
end
5153
end
5254
end
53-
end
5455

55-
protected
56+
protected
5657

57-
def parse_datetime(value)
58-
Time.parse(value)
58+
def parse_datetime(value)
59+
Time.parse(value)
60+
end
5961
end
6062
end
6163
end

0 commit comments

Comments
 (0)