doorflow 1.0.0 → 1.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/README.md +222 -316
- data/bin/post-generate +3 -1
- data/doorflow.gemspec +1 -1
- data/lib/doorflow/client/credentials_proxy.rb +6 -9
- data/lib/doorflow/client/element_sessions_proxy.rb +91 -0
- data/lib/doorflow/client.rb +13 -0
- data/lib/doorflow/errors/doorflow_error.rb +1 -1
- data/lib/doorflow/resources/credential.rb +4 -3
- data/lib/doorflow/resources/element_session.rb +28 -0
- data/lib/doorflow/webhooks/handler.rb +6 -6
- data/lib/doorflow/webhooks/signature_verifier.rb +8 -5
- data/lib/doorflow-api/api/accounts_api.rb +1 -1
- data/lib/doorflow-api/api/admission_requests_api.rb +2 -2
- data/lib/doorflow-api/api/card_designs_api.rb +347 -0
- data/lib/doorflow-api/api/card_template_types_api.rb +350 -0
- data/lib/doorflow-api/api/card_templates_api.rb +811 -0
- data/lib/doorflow-api/api/channels_api.rb +11 -11
- data/lib/doorflow-api/api/credential_types_api.rb +1 -1
- data/lib/doorflow-api/api/credentials_api.rb +6 -6
- data/lib/doorflow-api/api/element_sessions_api.rb +90 -0
- data/lib/doorflow-api/api/events_api.rb +2 -2
- data/lib/doorflow-api/api/group_reservations_api.rb +68 -5
- data/lib/doorflow-api/api/groups_api.rb +1 -1
- data/lib/doorflow-api/api/notification_rules_api.rb +7 -7
- data/lib/doorflow-api/api/oauth_api.rb +1 -1
- data/lib/doorflow-api/api/people_api.rb +7 -7
- data/lib/doorflow-api/api/reservations_api.rb +5 -5
- data/lib/doorflow-api/api/roles_api.rb +1 -1
- data/lib/doorflow-api/api/sites_api.rb +1 -1
- data/lib/doorflow-api/api/sync_api.rb +4 -4
- data/lib/doorflow-api/api_client.rb +8 -4
- data/lib/doorflow-api/api_error.rb +9 -14
- data/lib/doorflow-api/api_model_base.rb +1 -1
- data/lib/doorflow-api/configuration.rb +1 -1
- data/lib/doorflow-api/models/account.rb +1 -1
- data/lib/doorflow-api/models/account_passport.rb +1 -1
- data/lib/doorflow-api/models/account_reseller.rb +1 -1
- data/lib/doorflow-api/models/account_sync.rb +1 -1
- data/lib/doorflow-api/models/account_user.rb +1 -1
- data/lib/doorflow-api/models/admission_request.rb +1 -1
- data/lib/doorflow-api/models/admission_request_door_controller.rb +1 -1
- data/lib/doorflow-api/models/admission_request_person.rb +1 -1
- data/lib/doorflow-api/models/admit_channel202_response.rb +1 -1
- data/lib/doorflow-api/models/admit_person202_response.rb +1 -1
- data/lib/doorflow-api/models/admit_person403_response.rb +1 -1
- data/lib/doorflow-api/models/admit_person_request.rb +1 -1
- data/lib/doorflow-api/models/auto_unlock_channel400_response.rb +1 -1
- data/lib/doorflow-api/models/auto_unlock_channel_request.rb +1 -1
- data/lib/doorflow-api/models/card_design.rb +243 -0
- data/lib/doorflow-api/models/card_design_image_back.rb +179 -0
- data/lib/doorflow-api/models/card_design_image_front.rb +179 -0
- data/lib/doorflow-api/models/card_design_input.rb +181 -0
- data/lib/doorflow-api/models/card_template.rb +475 -0
- data/lib/doorflow-api/models/card_template_input.rb +147 -0
- data/lib/doorflow-api/models/card_template_input_card_template.rb +347 -0
- data/lib/doorflow-api/models/card_template_type.rb +321 -0
- data/lib/doorflow-api/models/card_template_type_input.rb +147 -0
- data/lib/doorflow-api/models/card_template_type_input_card_template_type.rb +251 -0
- data/lib/doorflow-api/models/card_template_type_input_card_template_type_non_printable_zones_inner.rb +183 -0
- data/lib/doorflow-api/models/card_template_type_non_printable_zones_inner.rb +188 -0
- data/lib/doorflow-api/models/channel.rb +1 -1
- data/lib/doorflow-api/models/channel_auto_unlock.rb +1 -1
- data/lib/doorflow-api/models/channel_lockdown.rb +1 -1
- data/lib/doorflow-api/models/channel_lockdown_aux_lockdown.rb +1 -1
- data/lib/doorflow-api/models/channel_lockdown_card_lockdown.rb +1 -1
- data/lib/doorflow-api/models/channel_lockdown_rex_lockdown.rb +1 -1
- data/lib/doorflow-api/models/channel_mode.rb +1 -1
- data/lib/doorflow-api/models/channel_sync.rb +5 -2
- data/lib/doorflow-api/models/{create_credential422_response.rb → create_card_design422_response.rb} +5 -5
- data/lib/doorflow-api/models/{create_credential422_response_errors.rb → create_card_design422_response_errors.rb} +4 -4
- data/lib/doorflow-api/models/credential.rb +4 -4
- data/lib/doorflow-api/models/credential_input.rb +1 -1
- data/lib/doorflow-api/models/credential_input_person_credential.rb +1 -1
- data/lib/doorflow-api/models/credential_type.rb +1 -1
- data/lib/doorflow-api/models/credential_update_input.rb +1 -1
- data/lib/doorflow-api/models/credential_update_input_person_credential.rb +1 -1
- data/lib/doorflow-api/models/{delete_group_reservation200_response.rb → delete_card_design200_response.rb} +4 -4
- data/lib/doorflow-api/models/delete_card_template_type409_response.rb +147 -0
- data/lib/doorflow-api/models/element_session.rb +192 -0
- data/lib/doorflow-api/models/element_session_config.rb +265 -0
- data/lib/doorflow-api/models/element_session_error.rb +199 -0
- data/lib/doorflow-api/models/element_session_input.rb +271 -0
- data/lib/doorflow-api/models/element_session_member.rb +186 -0
- data/lib/doorflow-api/models/error.rb +1 -1
- data/lib/doorflow-api/models/event.rb +1 -1
- data/lib/doorflow-api/models/get_access_token200_response.rb +1 -1
- data/lib/doorflow-api/models/get_access_token400_response.rb +1 -1
- data/lib/doorflow-api/models/get_access_token401_response.rb +1 -1
- data/lib/doorflow-api/models/get_admission_request401_response.rb +1 -1
- data/lib/doorflow-api/models/get_admission_request403_response.rb +1 -1
- data/lib/doorflow-api/models/get_admission_request404_response.rb +1 -1
- data/lib/doorflow-api/models/get_admission_request500_response.rb +1 -1
- data/lib/doorflow-api/models/get_token_info200_response.rb +1 -1
- data/lib/doorflow-api/models/get_token_info200_response_application.rb +1 -1
- data/lib/doorflow-api/models/get_token_info401_response.rb +1 -1
- data/lib/doorflow-api/models/group.rb +1 -1
- data/lib/doorflow-api/models/group_reservation.rb +1 -1
- data/lib/doorflow-api/models/group_reservation_input.rb +1 -1
- data/lib/doorflow-api/models/group_reservation_input_group_reservation.rb +1 -1
- data/lib/doorflow-api/models/initiate_sync429_response.rb +1 -1
- data/lib/doorflow-api/models/linked_file.rb +217 -0
- data/lib/doorflow-api/models/list_events400_response.rb +1 -1
- data/lib/doorflow-api/models/lockdown_channel_request.rb +1 -1
- data/lib/doorflow-api/models/notification_rule.rb +1 -1
- data/lib/doorflow-api/models/notification_rule_actions_inner.rb +1 -1
- data/lib/doorflow-api/models/notification_rule_conditions_inner.rb +1 -1
- data/lib/doorflow-api/models/notification_rule_events_inner.rb +1 -1
- data/lib/doorflow-api/models/notification_rule_input.rb +1 -1
- data/lib/doorflow-api/models/person.rb +30 -8
- data/lib/doorflow-api/models/person_input.rb +1 -1
- data/lib/doorflow-api/models/reservation.rb +1 -1
- data/lib/doorflow-api/models/reservation_input.rb +1 -1
- data/lib/doorflow-api/models/revoke_token403_response.rb +1 -1
- data/lib/doorflow-api/models/role.rb +1 -1
- data/lib/doorflow-api/models/site.rb +1 -1
- data/lib/doorflow-api/models/site_site_ips_inner.rb +1 -1
- data/lib/doorflow-api/models/unlock_channel_request.rb +1 -1
- data/lib/doorflow-api/version.rb +2 -2
- data/lib/doorflow-api.rb +28 -9
- data/lib/doorflow.rb +8 -2
- metadata +45 -154
- data/spec/api/admission_requests_api_spec.rb +0 -47
- data/spec/api/channels_api_spec.rb +0 -174
- data/spec/api/credential_types_api_spec.rb +0 -49
- data/spec/api/group_reservations_api_spec.rb +0 -75
- data/spec/api/oauth_api_spec.rb +0 -97
- data/spec/doorflow/client_spec.rb +0 -109
- data/spec/doorflow_spec.rb +0 -22
- data/spec/fixtures/vcr_cassettes/channel/list.yml +0 -70
- data/spec/fixtures/vcr_cassettes/channel/retrieve.yml +0 -131
- data/spec/fixtures/vcr_cassettes/person/auto_pagination.yml +0 -87
- data/spec/fixtures/vcr_cassettes/person/create.yml +0 -64
- data/spec/fixtures/vcr_cassettes/person/delete.yml +0 -125
- data/spec/fixtures/vcr_cassettes/person/list.yml +0 -90
- data/spec/fixtures/vcr_cassettes/person/not_found.yml +0 -62
- data/spec/fixtures/vcr_cassettes/person/retrieve.yml +0 -136
- data/spec/fixtures/vcr_cassettes/person/update.yml +0 -260
- data/spec/fixtures/vcr_cassettes/person/validation_error.yml +0 -62
- data/spec/integration/channel_spec.rb +0 -88
- data/spec/integration/person_spec.rb +0 -99
- data/spec/models/account_passport_spec.rb +0 -42
- data/spec/models/account_reseller_spec.rb +0 -60
- data/spec/models/account_sync_spec.rb +0 -52
- data/spec/models/account_user_spec.rb +0 -54
- data/spec/models/admission_request_door_controller_spec.rb +0 -42
- data/spec/models/admission_request_person_spec.rb +0 -42
- data/spec/models/admission_request_spec.rb +0 -82
- data/spec/models/admit_channel202_response_spec.rb +0 -46
- data/spec/models/admit_person202_response_spec.rb +0 -46
- data/spec/models/admit_person403_response_spec.rb +0 -42
- data/spec/models/admit_person_request_spec.rb +0 -36
- data/spec/models/auto_unlock_channel400_response_spec.rb +0 -42
- data/spec/models/auto_unlock_channel_request_spec.rb +0 -36
- data/spec/models/channel_auto_unlock_spec.rb +0 -42
- data/spec/models/channel_lockdown_aux_lockdown_spec.rb +0 -36
- data/spec/models/channel_lockdown_card_lockdown_spec.rb +0 -36
- data/spec/models/channel_lockdown_rex_lockdown_spec.rb +0 -36
- data/spec/models/channel_lockdown_spec.rb +0 -54
- data/spec/models/channel_mode_spec.rb +0 -52
- data/spec/models/channel_sync_spec.rb +0 -46
- data/spec/models/create_credential422_response_errors_spec.rb +0 -48
- data/spec/models/create_credential422_response_spec.rb +0 -42
- data/spec/models/credential_input_person_credential_spec.rb +0 -48
- data/spec/models/credential_input_spec.rb +0 -36
- data/spec/models/credential_spec.rb +0 -86
- data/spec/models/credential_update_input_person_credential_spec.rb +0 -36
- data/spec/models/credential_update_input_spec.rb +0 -36
- data/spec/models/delete_group_reservation200_response_spec.rb +0 -36
- data/spec/models/error_spec.rb +0 -42
- data/spec/models/get_access_token200_response_spec.rb +0 -66
- data/spec/models/get_access_token400_response_spec.rb +0 -46
- data/spec/models/get_access_token401_response_spec.rb +0 -42
- data/spec/models/get_admission_request401_response_spec.rb +0 -42
- data/spec/models/get_admission_request403_response_spec.rb +0 -42
- data/spec/models/get_admission_request404_response_spec.rb +0 -42
- data/spec/models/get_admission_request500_response_spec.rb +0 -42
- data/spec/models/get_token_info200_response_application_spec.rb +0 -36
- data/spec/models/get_token_info200_response_spec.rb +0 -66
- data/spec/models/get_token_info401_response_spec.rb +0 -42
- data/spec/models/group_reservation_input_group_reservation_spec.rb +0 -54
- data/spec/models/group_reservation_input_spec.rb +0 -36
- data/spec/models/group_reservation_spec.rb +0 -82
- data/spec/models/initiate_sync429_response_spec.rb +0 -52
- data/spec/models/list_events400_response_spec.rb +0 -42
- data/spec/models/lockdown_channel_request_spec.rb +0 -48
- data/spec/models/notification_rule_actions_inner_spec.rb +0 -48
- data/spec/models/notification_rule_conditions_inner_spec.rb +0 -48
- data/spec/models/notification_rule_events_inner_spec.rb +0 -42
- data/spec/models/notification_rule_input_spec.rb +0 -60
- data/spec/models/person_input_spec.rb +0 -180
- data/spec/models/reservation_input_spec.rb +0 -60
- data/spec/models/revoke_token403_response_spec.rb +0 -42
- data/spec/models/site_site_ips_inner_spec.rb +0 -36
- data/spec/models/unlock_channel_request_spec.rb +0 -36
- data/spec/spec_helper.rb +0 -160
|
@@ -35,10 +35,11 @@ module DoorFlow
|
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
# Retrieve a credential by ID
|
|
38
|
+
# @param person_id [Integer] Person ID (required by the API)
|
|
38
39
|
# @param id [String, Integer] Credential ID
|
|
39
40
|
# @return [DoorFlow::Resources::Credential]
|
|
40
|
-
def retrieve(id)
|
|
41
|
-
response = client.credentials_api.get_credential(id)
|
|
41
|
+
def retrieve(person_id, id)
|
|
42
|
+
response = client.credentials_api.get_credential(person_id, id)
|
|
42
43
|
to_resource(response, Resources::Credential)
|
|
43
44
|
end
|
|
44
45
|
|
|
@@ -56,14 +57,10 @@ module DoorFlow
|
|
|
56
57
|
|
|
57
58
|
# Delete a credential
|
|
58
59
|
# @param id [String, Integer] Credential ID
|
|
59
|
-
# @param person_id [
|
|
60
|
+
# @param person_id [Integer] Person ID (required by the API)
|
|
60
61
|
# @return [Boolean] true if successful
|
|
61
|
-
def delete(id, person_id:
|
|
62
|
-
|
|
63
|
-
client.credentials_api.delete_credential(person_id, id)
|
|
64
|
-
else
|
|
65
|
-
client.credentials_api.delete_credential(id)
|
|
66
|
-
end
|
|
62
|
+
def delete(id, person_id:)
|
|
63
|
+
client.credentials_api.delete_credential(person_id, id)
|
|
67
64
|
true
|
|
68
65
|
rescue => e
|
|
69
66
|
false
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
module DoorFlow
|
|
2
|
+
class Client
|
|
3
|
+
# Base proxy for Element Sessions — handles the HTTP call
|
|
4
|
+
#
|
|
5
|
+
# @api private
|
|
6
|
+
class ElementSessionsProxy < ResourceProxy
|
|
7
|
+
def create_session(widget_type:, member:, credentials: nil)
|
|
8
|
+
params = {
|
|
9
|
+
widget_type: widget_type,
|
|
10
|
+
member: {
|
|
11
|
+
external_id: member[:external_id],
|
|
12
|
+
name: member[:name],
|
|
13
|
+
email: member[:email]
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
params[:credentials] = credentials if credentials
|
|
17
|
+
response = post("/api/3/element_sessions", params)
|
|
18
|
+
to_resource(response, Resources::ElementSession)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def post(path, params)
|
|
24
|
+
api_client = client.send(:api_client)
|
|
25
|
+
config = api_client.config
|
|
26
|
+
|
|
27
|
+
url = "#{config.scheme}://#{config.host}#{path}"
|
|
28
|
+
token = client.access_token
|
|
29
|
+
|
|
30
|
+
conn = Faraday.new do |f|
|
|
31
|
+
f.request :json
|
|
32
|
+
f.response :json, parser_options: { symbolize_names: true }
|
|
33
|
+
f.adapter Faraday.default_adapter
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
response = conn.post(url) do |req|
|
|
37
|
+
req.headers["Authorization"] = "Bearer #{token}"
|
|
38
|
+
req.headers["Content-Type"] = "application/json"
|
|
39
|
+
req.body = params.to_json
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
unless response.success?
|
|
43
|
+
raise DoorFlow::ApiError.new(
|
|
44
|
+
code: response.status,
|
|
45
|
+
response_body: response.body
|
|
46
|
+
), "Element session creation failed (#{response.status})"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
response.body
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Proxy for creating admin widget sessions
|
|
54
|
+
#
|
|
55
|
+
# @example
|
|
56
|
+
# session = client.admin_sessions.create(
|
|
57
|
+
# member: {
|
|
58
|
+
# external_id: "usr_123",
|
|
59
|
+
# name: "Alice Anderson",
|
|
60
|
+
# email: "alice@example.com"
|
|
61
|
+
# },
|
|
62
|
+
# credentials: ["mobile_access", "pin"]
|
|
63
|
+
# )
|
|
64
|
+
# session.token #=> "eyJhbGciOiJIUzI1NiJ9..."
|
|
65
|
+
# session.expires_in #=> 900
|
|
66
|
+
class AdminSessionsProxy < ElementSessionsProxy
|
|
67
|
+
def create(member:, credentials: nil)
|
|
68
|
+
create_session(widget_type: "admin", member: member, credentials: credentials)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Proxy for creating member widget sessions
|
|
73
|
+
#
|
|
74
|
+
# @example
|
|
75
|
+
# session = client.member_sessions.create(
|
|
76
|
+
# member: {
|
|
77
|
+
# external_id: "usr_123",
|
|
78
|
+
# name: "Alice Anderson",
|
|
79
|
+
# email: "alice@example.com"
|
|
80
|
+
# },
|
|
81
|
+
# credentials: ["mobile_access", "pin"]
|
|
82
|
+
# )
|
|
83
|
+
# session.token #=> "eyJhbGciOiJIUzI1NiJ9..."
|
|
84
|
+
# session.expires_in #=> 900
|
|
85
|
+
class MemberSessionsProxy < ElementSessionsProxy
|
|
86
|
+
def create(member:, credentials: nil)
|
|
87
|
+
create_session(widget_type: "member", member: member, credentials: credentials)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
data/lib/doorflow/client.rb
CHANGED
|
@@ -129,6 +129,18 @@ module DoorFlow
|
|
|
129
129
|
@account ||= AccountProxy.new(self)
|
|
130
130
|
end
|
|
131
131
|
|
|
132
|
+
# Access admin widget sessions
|
|
133
|
+
# @return [DoorFlow::Client::AdminSessionsProxy] admin sessions resource proxy
|
|
134
|
+
def admin_sessions
|
|
135
|
+
@admin_sessions ||= AdminSessionsProxy.new(self)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Access member widget sessions
|
|
139
|
+
# @return [DoorFlow::Client::MemberSessionsProxy] member sessions resource proxy
|
|
140
|
+
def member_sessions
|
|
141
|
+
@member_sessions ||= MemberSessionsProxy.new(self)
|
|
142
|
+
end
|
|
143
|
+
|
|
132
144
|
# ============================================
|
|
133
145
|
# Low-level API accessors (for advanced use)
|
|
134
146
|
# ============================================
|
|
@@ -261,3 +273,4 @@ require_relative 'client/reservations_proxy'
|
|
|
261
273
|
require_relative 'client/group_reservations_proxy'
|
|
262
274
|
require_relative 'client/notification_rules_proxy'
|
|
263
275
|
require_relative 'client/account_proxy'
|
|
276
|
+
require_relative 'client/element_sessions_proxy'
|
|
@@ -27,10 +27,11 @@ module DoorFlow
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
# Retrieve a credential by ID
|
|
30
|
+
# @param person_id [Integer] person ID (required by the API)
|
|
30
31
|
# @param id [String] credential ID
|
|
31
32
|
# @return [DoorFlow::Credential] the credential
|
|
32
|
-
def self.retrieve(id)
|
|
33
|
-
response = client.credentials_api.get_credential(id)
|
|
33
|
+
def self.retrieve(person_id, id)
|
|
34
|
+
response = client.credentials_api.get_credential(person_id, id)
|
|
34
35
|
from_api_model(response)
|
|
35
36
|
end
|
|
36
37
|
|
|
@@ -63,7 +64,7 @@ module DoorFlow
|
|
|
63
64
|
# Delete this credential
|
|
64
65
|
# @return [Boolean] true if successful
|
|
65
66
|
def delete
|
|
66
|
-
_client.credentials_api.delete_credential(@id)
|
|
67
|
+
_client.credentials_api.delete_credential(@person_id, @id)
|
|
67
68
|
true
|
|
68
69
|
rescue
|
|
69
70
|
false
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module DoorFlow
|
|
2
|
+
module Resources
|
|
3
|
+
# Represents a DoorFlow Elements session token
|
|
4
|
+
#
|
|
5
|
+
# Element sessions provide short-lived JWT tokens for embedding
|
|
6
|
+
# DoorFlow widgets (admin or member) in your application via iframes.
|
|
7
|
+
#
|
|
8
|
+
# @example Create an admin session
|
|
9
|
+
# client = DoorFlow::Client.new(access_token: 'your_token')
|
|
10
|
+
# session = client.element_sessions.create(
|
|
11
|
+
# person_id: 123,
|
|
12
|
+
# widget_type: 'admin'
|
|
13
|
+
# )
|
|
14
|
+
# session.token #=> "eyJhbGciOiJIUzI1NiJ9..."
|
|
15
|
+
# session.expires_in #=> 900
|
|
16
|
+
class ElementSession < Resource
|
|
17
|
+
# @return [String] the JWT session token
|
|
18
|
+
def token
|
|
19
|
+
@attributes[:token]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @return [Integer] seconds until the token expires
|
|
23
|
+
def expires_in
|
|
24
|
+
@attributes[:expires_in]
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -27,8 +27,8 @@ module DoorFlow
|
|
|
27
27
|
# # In your controller:
|
|
28
28
|
# handler.handle(
|
|
29
29
|
# payload: request.raw_post,
|
|
30
|
-
# signature: request.headers['
|
|
31
|
-
# timestamp: request.headers['
|
|
30
|
+
# signature: request.headers['Signature'],
|
|
31
|
+
# timestamp: request.headers['Timestamp']
|
|
32
32
|
# )
|
|
33
33
|
#
|
|
34
34
|
# @example With auto-fetch
|
|
@@ -82,8 +82,8 @@ module DoorFlow
|
|
|
82
82
|
# Process an incoming webhook request
|
|
83
83
|
#
|
|
84
84
|
# @param payload [String] Raw request body
|
|
85
|
-
# @param signature [String]
|
|
86
|
-
# @param timestamp [String]
|
|
85
|
+
# @param signature [String] Signature header
|
|
86
|
+
# @param timestamp [String] Timestamp header
|
|
87
87
|
# @return [Array<Event>] Processed events
|
|
88
88
|
# @raise [SignatureError] If signature verification fails
|
|
89
89
|
def handle(payload:, signature:, timestamp:)
|
|
@@ -108,8 +108,8 @@ module DoorFlow
|
|
|
108
108
|
def handle_request(request)
|
|
109
109
|
handle(
|
|
110
110
|
payload: extract_body(request),
|
|
111
|
-
signature: extract_header(request, '
|
|
112
|
-
timestamp: extract_header(request, '
|
|
111
|
+
signature: extract_header(request, 'Signature'),
|
|
112
|
+
timestamp: extract_header(request, 'Timestamp')
|
|
113
113
|
)
|
|
114
114
|
end
|
|
115
115
|
|
|
@@ -20,8 +20,8 @@ module DoorFlow
|
|
|
20
20
|
# @example Verifying a webhook
|
|
21
21
|
# events = DoorFlow::Webhooks::SignatureVerifier.verify(
|
|
22
22
|
# payload: request.raw_post,
|
|
23
|
-
# signature: request.headers['
|
|
24
|
-
# timestamp: request.headers['
|
|
23
|
+
# signature: request.headers['Signature'],
|
|
24
|
+
# timestamp: request.headers['Timestamp'],
|
|
25
25
|
# secret: ENV['DOORFLOW_WEBHOOK_SECRET']
|
|
26
26
|
# )
|
|
27
27
|
#
|
|
@@ -36,8 +36,8 @@ module DoorFlow
|
|
|
36
36
|
# Verify webhook signature and parse events
|
|
37
37
|
#
|
|
38
38
|
# @param payload [String] Raw request body
|
|
39
|
-
# @param signature [String]
|
|
40
|
-
# @param timestamp [String]
|
|
39
|
+
# @param signature [String] Signature header value
|
|
40
|
+
# @param timestamp [String] Timestamp header value
|
|
41
41
|
# @param secret [String] Webhook secret from DoorFlow dashboard
|
|
42
42
|
# @param tolerance [Integer] Maximum age in seconds (0 to disable)
|
|
43
43
|
# @return [Array<Event>] Parsed webhook events
|
|
@@ -109,7 +109,10 @@ module DoorFlow
|
|
|
109
109
|
|
|
110
110
|
def parse_events(payload)
|
|
111
111
|
data = JSON.parse(payload, symbolize_names: true)
|
|
112
|
-
events = data
|
|
112
|
+
events = case data
|
|
113
|
+
when Array then data
|
|
114
|
+
else data[:events] || [data]
|
|
115
|
+
end
|
|
113
116
|
events.map { |e| Event.new(e) }
|
|
114
117
|
rescue JSON::ParserError => e
|
|
115
118
|
raise SignatureError.new("Invalid JSON payload: #{e.message}")
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
The version of the OpenAPI document: 3.0
|
|
7
7
|
|
|
8
8
|
Generated by: https://openapi-generator.tech
|
|
9
|
-
Generator version: 7.
|
|
9
|
+
Generator version: 7.24.0
|
|
10
10
|
|
|
11
11
|
=end
|
|
12
12
|
|
|
@@ -43,7 +43,7 @@ module DoorFlow
|
|
|
43
43
|
fail ArgumentError, "Missing the required parameter 'id' when calling AdmissionRequestsApi.get_admission_request"
|
|
44
44
|
end
|
|
45
45
|
# resource path
|
|
46
|
-
local_var_path = '/api/3/admission_requests/{id}'.sub('{
|
|
46
|
+
local_var_path = '/api/3/admission_requests/{id}'.sub('{id}', CGI.escape(id.to_s))
|
|
47
47
|
|
|
48
48
|
# query parameters
|
|
49
49
|
query_params = opts[:query_params] || {}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
#DoorFlow API
|
|
3
|
+
|
|
4
|
+
#Access control and door management API for DoorFlow
|
|
5
|
+
|
|
6
|
+
The version of the OpenAPI document: 3.0
|
|
7
|
+
|
|
8
|
+
Generated by: https://openapi-generator.tech
|
|
9
|
+
Generator version: 7.24.0
|
|
10
|
+
|
|
11
|
+
=end
|
|
12
|
+
|
|
13
|
+
require 'cgi'
|
|
14
|
+
|
|
15
|
+
module DoorFlow
|
|
16
|
+
class CardDesignsApi
|
|
17
|
+
attr_accessor :api_client
|
|
18
|
+
|
|
19
|
+
def initialize(api_client = ApiClient.default)
|
|
20
|
+
@api_client = api_client
|
|
21
|
+
end
|
|
22
|
+
# Create card design
|
|
23
|
+
# Creates a new card design. Images can be provided as base64-encoded strings.
|
|
24
|
+
# @param card_design_input [CardDesignInput]
|
|
25
|
+
# @param [Hash] opts the optional parameters
|
|
26
|
+
# @return [CardDesign]
|
|
27
|
+
def create_card_design(card_design_input, opts = {})
|
|
28
|
+
data, _status_code, _headers = create_card_design_with_http_info(card_design_input, opts)
|
|
29
|
+
data
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Create card design
|
|
33
|
+
# Creates a new card design. Images can be provided as base64-encoded strings.
|
|
34
|
+
# @param card_design_input [CardDesignInput]
|
|
35
|
+
# @param [Hash] opts the optional parameters
|
|
36
|
+
# @return [Array<(CardDesign, Integer, Hash)>] CardDesign data, response status code and response headers
|
|
37
|
+
def create_card_design_with_http_info(card_design_input, opts = {})
|
|
38
|
+
if @api_client.config.debugging
|
|
39
|
+
@api_client.config.logger.debug 'Calling API: CardDesignsApi.create_card_design ...'
|
|
40
|
+
end
|
|
41
|
+
# verify the required parameter 'card_design_input' is set
|
|
42
|
+
if @api_client.config.client_side_validation && card_design_input.nil?
|
|
43
|
+
fail ArgumentError, "Missing the required parameter 'card_design_input' when calling CardDesignsApi.create_card_design"
|
|
44
|
+
end
|
|
45
|
+
# resource path
|
|
46
|
+
local_var_path = '/api/3/card_designs'
|
|
47
|
+
|
|
48
|
+
# query parameters
|
|
49
|
+
query_params = opts[:query_params] || {}
|
|
50
|
+
|
|
51
|
+
# header parameters
|
|
52
|
+
header_params = opts[:header_params] || {}
|
|
53
|
+
# HTTP header 'Accept' (if needed)
|
|
54
|
+
header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
|
|
55
|
+
# HTTP header 'Content-Type'
|
|
56
|
+
content_type = @api_client.select_header_content_type(['application/json'])
|
|
57
|
+
if !content_type.nil?
|
|
58
|
+
header_params['Content-Type'] = content_type
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# form parameters
|
|
62
|
+
form_params = opts[:form_params] || {}
|
|
63
|
+
|
|
64
|
+
# http body (model)
|
|
65
|
+
post_body = opts[:debug_body] || @api_client.object_to_http_body(card_design_input)
|
|
66
|
+
|
|
67
|
+
# return_type
|
|
68
|
+
return_type = opts[:debug_return_type] || 'CardDesign'
|
|
69
|
+
|
|
70
|
+
# auth_names
|
|
71
|
+
auth_names = opts[:debug_auth_names] || ['OAuth2']
|
|
72
|
+
|
|
73
|
+
new_options = opts.merge(
|
|
74
|
+
:operation => :"CardDesignsApi.create_card_design",
|
|
75
|
+
:header_params => header_params,
|
|
76
|
+
:query_params => query_params,
|
|
77
|
+
:form_params => form_params,
|
|
78
|
+
:body => post_body,
|
|
79
|
+
:auth_names => auth_names,
|
|
80
|
+
:return_type => return_type
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
data, status_code, headers = @api_client.call_api(:POST, local_var_path, new_options)
|
|
84
|
+
if @api_client.config.debugging
|
|
85
|
+
@api_client.config.logger.debug "API called: CardDesignsApi#create_card_design\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
|
|
86
|
+
end
|
|
87
|
+
return data, status_code, headers
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Delete card design
|
|
91
|
+
# Permanently deletes a card design and its associated images.
|
|
92
|
+
# @param id [Integer] Card Design ID
|
|
93
|
+
# @param [Hash] opts the optional parameters
|
|
94
|
+
# @return [DeleteCardDesign200Response]
|
|
95
|
+
def delete_card_design(id, opts = {})
|
|
96
|
+
data, _status_code, _headers = delete_card_design_with_http_info(id, opts)
|
|
97
|
+
data
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Delete card design
|
|
101
|
+
# Permanently deletes a card design and its associated images.
|
|
102
|
+
# @param id [Integer] Card Design ID
|
|
103
|
+
# @param [Hash] opts the optional parameters
|
|
104
|
+
# @return [Array<(DeleteCardDesign200Response, Integer, Hash)>] DeleteCardDesign200Response data, response status code and response headers
|
|
105
|
+
def delete_card_design_with_http_info(id, opts = {})
|
|
106
|
+
if @api_client.config.debugging
|
|
107
|
+
@api_client.config.logger.debug 'Calling API: CardDesignsApi.delete_card_design ...'
|
|
108
|
+
end
|
|
109
|
+
# verify the required parameter 'id' is set
|
|
110
|
+
if @api_client.config.client_side_validation && id.nil?
|
|
111
|
+
fail ArgumentError, "Missing the required parameter 'id' when calling CardDesignsApi.delete_card_design"
|
|
112
|
+
end
|
|
113
|
+
# resource path
|
|
114
|
+
local_var_path = '/api/3/card_designs/{id}'.sub('{id}', CGI.escape(id.to_s))
|
|
115
|
+
|
|
116
|
+
# query parameters
|
|
117
|
+
query_params = opts[:query_params] || {}
|
|
118
|
+
|
|
119
|
+
# header parameters
|
|
120
|
+
header_params = opts[:header_params] || {}
|
|
121
|
+
# HTTP header 'Accept' (if needed)
|
|
122
|
+
header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
|
|
123
|
+
|
|
124
|
+
# form parameters
|
|
125
|
+
form_params = opts[:form_params] || {}
|
|
126
|
+
|
|
127
|
+
# http body (model)
|
|
128
|
+
post_body = opts[:debug_body]
|
|
129
|
+
|
|
130
|
+
# return_type
|
|
131
|
+
return_type = opts[:debug_return_type] || 'DeleteCardDesign200Response'
|
|
132
|
+
|
|
133
|
+
# auth_names
|
|
134
|
+
auth_names = opts[:debug_auth_names] || ['OAuth2']
|
|
135
|
+
|
|
136
|
+
new_options = opts.merge(
|
|
137
|
+
:operation => :"CardDesignsApi.delete_card_design",
|
|
138
|
+
:header_params => header_params,
|
|
139
|
+
:query_params => query_params,
|
|
140
|
+
:form_params => form_params,
|
|
141
|
+
:body => post_body,
|
|
142
|
+
:auth_names => auth_names,
|
|
143
|
+
:return_type => return_type
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
data, status_code, headers = @api_client.call_api(:DELETE, local_var_path, new_options)
|
|
147
|
+
if @api_client.config.debugging
|
|
148
|
+
@api_client.config.logger.debug "API called: CardDesignsApi#delete_card_design\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
|
|
149
|
+
end
|
|
150
|
+
return data, status_code, headers
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# Get card design
|
|
154
|
+
# Returns details for a specific card design including image URLs at multiple sizes.
|
|
155
|
+
# @param id [Integer] Card Design ID
|
|
156
|
+
# @param [Hash] opts the optional parameters
|
|
157
|
+
# @return [CardDesign]
|
|
158
|
+
def get_card_design(id, opts = {})
|
|
159
|
+
data, _status_code, _headers = get_card_design_with_http_info(id, opts)
|
|
160
|
+
data
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# Get card design
|
|
164
|
+
# Returns details for a specific card design including image URLs at multiple sizes.
|
|
165
|
+
# @param id [Integer] Card Design ID
|
|
166
|
+
# @param [Hash] opts the optional parameters
|
|
167
|
+
# @return [Array<(CardDesign, Integer, Hash)>] CardDesign data, response status code and response headers
|
|
168
|
+
def get_card_design_with_http_info(id, opts = {})
|
|
169
|
+
if @api_client.config.debugging
|
|
170
|
+
@api_client.config.logger.debug 'Calling API: CardDesignsApi.get_card_design ...'
|
|
171
|
+
end
|
|
172
|
+
# verify the required parameter 'id' is set
|
|
173
|
+
if @api_client.config.client_side_validation && id.nil?
|
|
174
|
+
fail ArgumentError, "Missing the required parameter 'id' when calling CardDesignsApi.get_card_design"
|
|
175
|
+
end
|
|
176
|
+
# resource path
|
|
177
|
+
local_var_path = '/api/3/card_designs/{id}'.sub('{id}', CGI.escape(id.to_s))
|
|
178
|
+
|
|
179
|
+
# query parameters
|
|
180
|
+
query_params = opts[:query_params] || {}
|
|
181
|
+
|
|
182
|
+
# header parameters
|
|
183
|
+
header_params = opts[:header_params] || {}
|
|
184
|
+
# HTTP header 'Accept' (if needed)
|
|
185
|
+
header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
|
|
186
|
+
|
|
187
|
+
# form parameters
|
|
188
|
+
form_params = opts[:form_params] || {}
|
|
189
|
+
|
|
190
|
+
# http body (model)
|
|
191
|
+
post_body = opts[:debug_body]
|
|
192
|
+
|
|
193
|
+
# return_type
|
|
194
|
+
return_type = opts[:debug_return_type] || 'CardDesign'
|
|
195
|
+
|
|
196
|
+
# auth_names
|
|
197
|
+
auth_names = opts[:debug_auth_names] || ['OAuth2']
|
|
198
|
+
|
|
199
|
+
new_options = opts.merge(
|
|
200
|
+
:operation => :"CardDesignsApi.get_card_design",
|
|
201
|
+
:header_params => header_params,
|
|
202
|
+
:query_params => query_params,
|
|
203
|
+
:form_params => form_params,
|
|
204
|
+
:body => post_body,
|
|
205
|
+
:auth_names => auth_names,
|
|
206
|
+
:return_type => return_type
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
|
|
210
|
+
if @api_client.config.debugging
|
|
211
|
+
@api_client.config.logger.debug "API called: CardDesignsApi#get_card_design\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
|
|
212
|
+
end
|
|
213
|
+
return data, status_code, headers
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
# List card designs
|
|
217
|
+
# Returns all card designs for the authenticated user's account.
|
|
218
|
+
# @param [Hash] opts the optional parameters
|
|
219
|
+
# @return [Array<CardDesign>]
|
|
220
|
+
def list_card_designs(opts = {})
|
|
221
|
+
data, _status_code, _headers = list_card_designs_with_http_info(opts)
|
|
222
|
+
data
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
# List card designs
|
|
226
|
+
# Returns all card designs for the authenticated user's account.
|
|
227
|
+
# @param [Hash] opts the optional parameters
|
|
228
|
+
# @return [Array<(Array<CardDesign>, Integer, Hash)>] Array<CardDesign> data, response status code and response headers
|
|
229
|
+
def list_card_designs_with_http_info(opts = {})
|
|
230
|
+
if @api_client.config.debugging
|
|
231
|
+
@api_client.config.logger.debug 'Calling API: CardDesignsApi.list_card_designs ...'
|
|
232
|
+
end
|
|
233
|
+
# resource path
|
|
234
|
+
local_var_path = '/api/3/card_designs'
|
|
235
|
+
|
|
236
|
+
# query parameters
|
|
237
|
+
query_params = opts[:query_params] || {}
|
|
238
|
+
|
|
239
|
+
# header parameters
|
|
240
|
+
header_params = opts[:header_params] || {}
|
|
241
|
+
# HTTP header 'Accept' (if needed)
|
|
242
|
+
header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
|
|
243
|
+
|
|
244
|
+
# form parameters
|
|
245
|
+
form_params = opts[:form_params] || {}
|
|
246
|
+
|
|
247
|
+
# http body (model)
|
|
248
|
+
post_body = opts[:debug_body]
|
|
249
|
+
|
|
250
|
+
# return_type
|
|
251
|
+
return_type = opts[:debug_return_type] || 'Array<CardDesign>'
|
|
252
|
+
|
|
253
|
+
# auth_names
|
|
254
|
+
auth_names = opts[:debug_auth_names] || ['OAuth2']
|
|
255
|
+
|
|
256
|
+
new_options = opts.merge(
|
|
257
|
+
:operation => :"CardDesignsApi.list_card_designs",
|
|
258
|
+
:header_params => header_params,
|
|
259
|
+
:query_params => query_params,
|
|
260
|
+
:form_params => form_params,
|
|
261
|
+
:body => post_body,
|
|
262
|
+
:auth_names => auth_names,
|
|
263
|
+
:return_type => return_type
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
|
|
267
|
+
if @api_client.config.debugging
|
|
268
|
+
@api_client.config.logger.debug "API called: CardDesignsApi#list_card_designs\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
|
|
269
|
+
end
|
|
270
|
+
return data, status_code, headers
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
# Update card design
|
|
274
|
+
# Updates an existing card design. Images can be replaced by providing new base64-encoded strings.
|
|
275
|
+
# @param id [Integer] Card Design ID
|
|
276
|
+
# @param card_design_input [CardDesignInput]
|
|
277
|
+
# @param [Hash] opts the optional parameters
|
|
278
|
+
# @return [CardDesign]
|
|
279
|
+
def update_card_design(id, card_design_input, opts = {})
|
|
280
|
+
data, _status_code, _headers = update_card_design_with_http_info(id, card_design_input, opts)
|
|
281
|
+
data
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
# Update card design
|
|
285
|
+
# Updates an existing card design. Images can be replaced by providing new base64-encoded strings.
|
|
286
|
+
# @param id [Integer] Card Design ID
|
|
287
|
+
# @param card_design_input [CardDesignInput]
|
|
288
|
+
# @param [Hash] opts the optional parameters
|
|
289
|
+
# @return [Array<(CardDesign, Integer, Hash)>] CardDesign data, response status code and response headers
|
|
290
|
+
def update_card_design_with_http_info(id, card_design_input, opts = {})
|
|
291
|
+
if @api_client.config.debugging
|
|
292
|
+
@api_client.config.logger.debug 'Calling API: CardDesignsApi.update_card_design ...'
|
|
293
|
+
end
|
|
294
|
+
# verify the required parameter 'id' is set
|
|
295
|
+
if @api_client.config.client_side_validation && id.nil?
|
|
296
|
+
fail ArgumentError, "Missing the required parameter 'id' when calling CardDesignsApi.update_card_design"
|
|
297
|
+
end
|
|
298
|
+
# verify the required parameter 'card_design_input' is set
|
|
299
|
+
if @api_client.config.client_side_validation && card_design_input.nil?
|
|
300
|
+
fail ArgumentError, "Missing the required parameter 'card_design_input' when calling CardDesignsApi.update_card_design"
|
|
301
|
+
end
|
|
302
|
+
# resource path
|
|
303
|
+
local_var_path = '/api/3/card_designs/{id}'.sub('{id}', CGI.escape(id.to_s))
|
|
304
|
+
|
|
305
|
+
# query parameters
|
|
306
|
+
query_params = opts[:query_params] || {}
|
|
307
|
+
|
|
308
|
+
# header parameters
|
|
309
|
+
header_params = opts[:header_params] || {}
|
|
310
|
+
# HTTP header 'Accept' (if needed)
|
|
311
|
+
header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
|
|
312
|
+
# HTTP header 'Content-Type'
|
|
313
|
+
content_type = @api_client.select_header_content_type(['application/json'])
|
|
314
|
+
if !content_type.nil?
|
|
315
|
+
header_params['Content-Type'] = content_type
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
# form parameters
|
|
319
|
+
form_params = opts[:form_params] || {}
|
|
320
|
+
|
|
321
|
+
# http body (model)
|
|
322
|
+
post_body = opts[:debug_body] || @api_client.object_to_http_body(card_design_input)
|
|
323
|
+
|
|
324
|
+
# return_type
|
|
325
|
+
return_type = opts[:debug_return_type] || 'CardDesign'
|
|
326
|
+
|
|
327
|
+
# auth_names
|
|
328
|
+
auth_names = opts[:debug_auth_names] || ['OAuth2']
|
|
329
|
+
|
|
330
|
+
new_options = opts.merge(
|
|
331
|
+
:operation => :"CardDesignsApi.update_card_design",
|
|
332
|
+
:header_params => header_params,
|
|
333
|
+
:query_params => query_params,
|
|
334
|
+
:form_params => form_params,
|
|
335
|
+
:body => post_body,
|
|
336
|
+
:auth_names => auth_names,
|
|
337
|
+
:return_type => return_type
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
data, status_code, headers = @api_client.call_api(:PUT, local_var_path, new_options)
|
|
341
|
+
if @api_client.config.debugging
|
|
342
|
+
@api_client.config.logger.debug "API called: CardDesignsApi#update_card_design\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
|
|
343
|
+
end
|
|
344
|
+
return data, status_code, headers
|
|
345
|
+
end
|
|
346
|
+
end
|
|
347
|
+
end
|