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.
Files changed (197) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -0
  3. data/README.md +222 -316
  4. data/bin/post-generate +3 -1
  5. data/doorflow.gemspec +1 -1
  6. data/lib/doorflow/client/credentials_proxy.rb +6 -9
  7. data/lib/doorflow/client/element_sessions_proxy.rb +91 -0
  8. data/lib/doorflow/client.rb +13 -0
  9. data/lib/doorflow/errors/doorflow_error.rb +1 -1
  10. data/lib/doorflow/resources/credential.rb +4 -3
  11. data/lib/doorflow/resources/element_session.rb +28 -0
  12. data/lib/doorflow/webhooks/handler.rb +6 -6
  13. data/lib/doorflow/webhooks/signature_verifier.rb +8 -5
  14. data/lib/doorflow-api/api/accounts_api.rb +1 -1
  15. data/lib/doorflow-api/api/admission_requests_api.rb +2 -2
  16. data/lib/doorflow-api/api/card_designs_api.rb +347 -0
  17. data/lib/doorflow-api/api/card_template_types_api.rb +350 -0
  18. data/lib/doorflow-api/api/card_templates_api.rb +811 -0
  19. data/lib/doorflow-api/api/channels_api.rb +11 -11
  20. data/lib/doorflow-api/api/credential_types_api.rb +1 -1
  21. data/lib/doorflow-api/api/credentials_api.rb +6 -6
  22. data/lib/doorflow-api/api/element_sessions_api.rb +90 -0
  23. data/lib/doorflow-api/api/events_api.rb +2 -2
  24. data/lib/doorflow-api/api/group_reservations_api.rb +68 -5
  25. data/lib/doorflow-api/api/groups_api.rb +1 -1
  26. data/lib/doorflow-api/api/notification_rules_api.rb +7 -7
  27. data/lib/doorflow-api/api/oauth_api.rb +1 -1
  28. data/lib/doorflow-api/api/people_api.rb +7 -7
  29. data/lib/doorflow-api/api/reservations_api.rb +5 -5
  30. data/lib/doorflow-api/api/roles_api.rb +1 -1
  31. data/lib/doorflow-api/api/sites_api.rb +1 -1
  32. data/lib/doorflow-api/api/sync_api.rb +4 -4
  33. data/lib/doorflow-api/api_client.rb +8 -4
  34. data/lib/doorflow-api/api_error.rb +9 -14
  35. data/lib/doorflow-api/api_model_base.rb +1 -1
  36. data/lib/doorflow-api/configuration.rb +1 -1
  37. data/lib/doorflow-api/models/account.rb +1 -1
  38. data/lib/doorflow-api/models/account_passport.rb +1 -1
  39. data/lib/doorflow-api/models/account_reseller.rb +1 -1
  40. data/lib/doorflow-api/models/account_sync.rb +1 -1
  41. data/lib/doorflow-api/models/account_user.rb +1 -1
  42. data/lib/doorflow-api/models/admission_request.rb +1 -1
  43. data/lib/doorflow-api/models/admission_request_door_controller.rb +1 -1
  44. data/lib/doorflow-api/models/admission_request_person.rb +1 -1
  45. data/lib/doorflow-api/models/admit_channel202_response.rb +1 -1
  46. data/lib/doorflow-api/models/admit_person202_response.rb +1 -1
  47. data/lib/doorflow-api/models/admit_person403_response.rb +1 -1
  48. data/lib/doorflow-api/models/admit_person_request.rb +1 -1
  49. data/lib/doorflow-api/models/auto_unlock_channel400_response.rb +1 -1
  50. data/lib/doorflow-api/models/auto_unlock_channel_request.rb +1 -1
  51. data/lib/doorflow-api/models/card_design.rb +243 -0
  52. data/lib/doorflow-api/models/card_design_image_back.rb +179 -0
  53. data/lib/doorflow-api/models/card_design_image_front.rb +179 -0
  54. data/lib/doorflow-api/models/card_design_input.rb +181 -0
  55. data/lib/doorflow-api/models/card_template.rb +475 -0
  56. data/lib/doorflow-api/models/card_template_input.rb +147 -0
  57. data/lib/doorflow-api/models/card_template_input_card_template.rb +347 -0
  58. data/lib/doorflow-api/models/card_template_type.rb +321 -0
  59. data/lib/doorflow-api/models/card_template_type_input.rb +147 -0
  60. data/lib/doorflow-api/models/card_template_type_input_card_template_type.rb +251 -0
  61. data/lib/doorflow-api/models/card_template_type_input_card_template_type_non_printable_zones_inner.rb +183 -0
  62. data/lib/doorflow-api/models/card_template_type_non_printable_zones_inner.rb +188 -0
  63. data/lib/doorflow-api/models/channel.rb +1 -1
  64. data/lib/doorflow-api/models/channel_auto_unlock.rb +1 -1
  65. data/lib/doorflow-api/models/channel_lockdown.rb +1 -1
  66. data/lib/doorflow-api/models/channel_lockdown_aux_lockdown.rb +1 -1
  67. data/lib/doorflow-api/models/channel_lockdown_card_lockdown.rb +1 -1
  68. data/lib/doorflow-api/models/channel_lockdown_rex_lockdown.rb +1 -1
  69. data/lib/doorflow-api/models/channel_mode.rb +1 -1
  70. data/lib/doorflow-api/models/channel_sync.rb +5 -2
  71. data/lib/doorflow-api/models/{create_credential422_response.rb → create_card_design422_response.rb} +5 -5
  72. data/lib/doorflow-api/models/{create_credential422_response_errors.rb → create_card_design422_response_errors.rb} +4 -4
  73. data/lib/doorflow-api/models/credential.rb +4 -4
  74. data/lib/doorflow-api/models/credential_input.rb +1 -1
  75. data/lib/doorflow-api/models/credential_input_person_credential.rb +1 -1
  76. data/lib/doorflow-api/models/credential_type.rb +1 -1
  77. data/lib/doorflow-api/models/credential_update_input.rb +1 -1
  78. data/lib/doorflow-api/models/credential_update_input_person_credential.rb +1 -1
  79. data/lib/doorflow-api/models/{delete_group_reservation200_response.rb → delete_card_design200_response.rb} +4 -4
  80. data/lib/doorflow-api/models/delete_card_template_type409_response.rb +147 -0
  81. data/lib/doorflow-api/models/element_session.rb +192 -0
  82. data/lib/doorflow-api/models/element_session_config.rb +265 -0
  83. data/lib/doorflow-api/models/element_session_error.rb +199 -0
  84. data/lib/doorflow-api/models/element_session_input.rb +271 -0
  85. data/lib/doorflow-api/models/element_session_member.rb +186 -0
  86. data/lib/doorflow-api/models/error.rb +1 -1
  87. data/lib/doorflow-api/models/event.rb +1 -1
  88. data/lib/doorflow-api/models/get_access_token200_response.rb +1 -1
  89. data/lib/doorflow-api/models/get_access_token400_response.rb +1 -1
  90. data/lib/doorflow-api/models/get_access_token401_response.rb +1 -1
  91. data/lib/doorflow-api/models/get_admission_request401_response.rb +1 -1
  92. data/lib/doorflow-api/models/get_admission_request403_response.rb +1 -1
  93. data/lib/doorflow-api/models/get_admission_request404_response.rb +1 -1
  94. data/lib/doorflow-api/models/get_admission_request500_response.rb +1 -1
  95. data/lib/doorflow-api/models/get_token_info200_response.rb +1 -1
  96. data/lib/doorflow-api/models/get_token_info200_response_application.rb +1 -1
  97. data/lib/doorflow-api/models/get_token_info401_response.rb +1 -1
  98. data/lib/doorflow-api/models/group.rb +1 -1
  99. data/lib/doorflow-api/models/group_reservation.rb +1 -1
  100. data/lib/doorflow-api/models/group_reservation_input.rb +1 -1
  101. data/lib/doorflow-api/models/group_reservation_input_group_reservation.rb +1 -1
  102. data/lib/doorflow-api/models/initiate_sync429_response.rb +1 -1
  103. data/lib/doorflow-api/models/linked_file.rb +217 -0
  104. data/lib/doorflow-api/models/list_events400_response.rb +1 -1
  105. data/lib/doorflow-api/models/lockdown_channel_request.rb +1 -1
  106. data/lib/doorflow-api/models/notification_rule.rb +1 -1
  107. data/lib/doorflow-api/models/notification_rule_actions_inner.rb +1 -1
  108. data/lib/doorflow-api/models/notification_rule_conditions_inner.rb +1 -1
  109. data/lib/doorflow-api/models/notification_rule_events_inner.rb +1 -1
  110. data/lib/doorflow-api/models/notification_rule_input.rb +1 -1
  111. data/lib/doorflow-api/models/person.rb +30 -8
  112. data/lib/doorflow-api/models/person_input.rb +1 -1
  113. data/lib/doorflow-api/models/reservation.rb +1 -1
  114. data/lib/doorflow-api/models/reservation_input.rb +1 -1
  115. data/lib/doorflow-api/models/revoke_token403_response.rb +1 -1
  116. data/lib/doorflow-api/models/role.rb +1 -1
  117. data/lib/doorflow-api/models/site.rb +1 -1
  118. data/lib/doorflow-api/models/site_site_ips_inner.rb +1 -1
  119. data/lib/doorflow-api/models/unlock_channel_request.rb +1 -1
  120. data/lib/doorflow-api/version.rb +2 -2
  121. data/lib/doorflow-api.rb +28 -9
  122. data/lib/doorflow.rb +8 -2
  123. metadata +45 -154
  124. data/spec/api/admission_requests_api_spec.rb +0 -47
  125. data/spec/api/channels_api_spec.rb +0 -174
  126. data/spec/api/credential_types_api_spec.rb +0 -49
  127. data/spec/api/group_reservations_api_spec.rb +0 -75
  128. data/spec/api/oauth_api_spec.rb +0 -97
  129. data/spec/doorflow/client_spec.rb +0 -109
  130. data/spec/doorflow_spec.rb +0 -22
  131. data/spec/fixtures/vcr_cassettes/channel/list.yml +0 -70
  132. data/spec/fixtures/vcr_cassettes/channel/retrieve.yml +0 -131
  133. data/spec/fixtures/vcr_cassettes/person/auto_pagination.yml +0 -87
  134. data/spec/fixtures/vcr_cassettes/person/create.yml +0 -64
  135. data/spec/fixtures/vcr_cassettes/person/delete.yml +0 -125
  136. data/spec/fixtures/vcr_cassettes/person/list.yml +0 -90
  137. data/spec/fixtures/vcr_cassettes/person/not_found.yml +0 -62
  138. data/spec/fixtures/vcr_cassettes/person/retrieve.yml +0 -136
  139. data/spec/fixtures/vcr_cassettes/person/update.yml +0 -260
  140. data/spec/fixtures/vcr_cassettes/person/validation_error.yml +0 -62
  141. data/spec/integration/channel_spec.rb +0 -88
  142. data/spec/integration/person_spec.rb +0 -99
  143. data/spec/models/account_passport_spec.rb +0 -42
  144. data/spec/models/account_reseller_spec.rb +0 -60
  145. data/spec/models/account_sync_spec.rb +0 -52
  146. data/spec/models/account_user_spec.rb +0 -54
  147. data/spec/models/admission_request_door_controller_spec.rb +0 -42
  148. data/spec/models/admission_request_person_spec.rb +0 -42
  149. data/spec/models/admission_request_spec.rb +0 -82
  150. data/spec/models/admit_channel202_response_spec.rb +0 -46
  151. data/spec/models/admit_person202_response_spec.rb +0 -46
  152. data/spec/models/admit_person403_response_spec.rb +0 -42
  153. data/spec/models/admit_person_request_spec.rb +0 -36
  154. data/spec/models/auto_unlock_channel400_response_spec.rb +0 -42
  155. data/spec/models/auto_unlock_channel_request_spec.rb +0 -36
  156. data/spec/models/channel_auto_unlock_spec.rb +0 -42
  157. data/spec/models/channel_lockdown_aux_lockdown_spec.rb +0 -36
  158. data/spec/models/channel_lockdown_card_lockdown_spec.rb +0 -36
  159. data/spec/models/channel_lockdown_rex_lockdown_spec.rb +0 -36
  160. data/spec/models/channel_lockdown_spec.rb +0 -54
  161. data/spec/models/channel_mode_spec.rb +0 -52
  162. data/spec/models/channel_sync_spec.rb +0 -46
  163. data/spec/models/create_credential422_response_errors_spec.rb +0 -48
  164. data/spec/models/create_credential422_response_spec.rb +0 -42
  165. data/spec/models/credential_input_person_credential_spec.rb +0 -48
  166. data/spec/models/credential_input_spec.rb +0 -36
  167. data/spec/models/credential_spec.rb +0 -86
  168. data/spec/models/credential_update_input_person_credential_spec.rb +0 -36
  169. data/spec/models/credential_update_input_spec.rb +0 -36
  170. data/spec/models/delete_group_reservation200_response_spec.rb +0 -36
  171. data/spec/models/error_spec.rb +0 -42
  172. data/spec/models/get_access_token200_response_spec.rb +0 -66
  173. data/spec/models/get_access_token400_response_spec.rb +0 -46
  174. data/spec/models/get_access_token401_response_spec.rb +0 -42
  175. data/spec/models/get_admission_request401_response_spec.rb +0 -42
  176. data/spec/models/get_admission_request403_response_spec.rb +0 -42
  177. data/spec/models/get_admission_request404_response_spec.rb +0 -42
  178. data/spec/models/get_admission_request500_response_spec.rb +0 -42
  179. data/spec/models/get_token_info200_response_application_spec.rb +0 -36
  180. data/spec/models/get_token_info200_response_spec.rb +0 -66
  181. data/spec/models/get_token_info401_response_spec.rb +0 -42
  182. data/spec/models/group_reservation_input_group_reservation_spec.rb +0 -54
  183. data/spec/models/group_reservation_input_spec.rb +0 -36
  184. data/spec/models/group_reservation_spec.rb +0 -82
  185. data/spec/models/initiate_sync429_response_spec.rb +0 -52
  186. data/spec/models/list_events400_response_spec.rb +0 -42
  187. data/spec/models/lockdown_channel_request_spec.rb +0 -48
  188. data/spec/models/notification_rule_actions_inner_spec.rb +0 -48
  189. data/spec/models/notification_rule_conditions_inner_spec.rb +0 -48
  190. data/spec/models/notification_rule_events_inner_spec.rb +0 -42
  191. data/spec/models/notification_rule_input_spec.rb +0 -60
  192. data/spec/models/person_input_spec.rb +0 -180
  193. data/spec/models/reservation_input_spec.rb +0 -60
  194. data/spec/models/revoke_token403_response_spec.rb +0 -42
  195. data/spec/models/site_site_ips_inner_spec.rb +0 -36
  196. data/spec/models/unlock_channel_request_spec.rb +0 -36
  197. 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 [String, Integer, nil] Person ID (may be required by API)
60
+ # @param person_id [Integer] Person ID (required by the API)
60
61
  # @return [Boolean] true if successful
61
- def delete(id, person_id: nil)
62
- if person_id
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
@@ -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'
@@ -52,7 +52,7 @@ module DoorFlow
52
52
  # Format error for display
53
53
  # @return [String]
54
54
  def to_s
55
- parts = [message]
55
+ parts = [super]
56
56
  parts << "HTTP #{status}" if status
57
57
  parts << "Code: #{code}" if code
58
58
  parts << "Request ID: #{request_id}" if request_id
@@ -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['X-DoorFlow-Signature'],
31
- # timestamp: request.headers['X-DoorFlow-Timestamp']
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] X-DoorFlow-Signature header
86
- # @param timestamp [String] X-DoorFlow-Timestamp header
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, 'X-DoorFlow-Signature'),
112
- timestamp: extract_header(request, 'X-DoorFlow-Timestamp')
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['X-DoorFlow-Signature'],
24
- # timestamp: request.headers['X-DoorFlow-Timestamp'],
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] X-DoorFlow-Signature header value
40
- # @param timestamp [String] X-DoorFlow-Timestamp header value
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[:events] || []
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.18.0-SNAPSHOT
9
+ Generator version: 7.24.0
10
10
 
11
11
  =end
12
12
 
@@ -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.18.0-SNAPSHOT
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('{' + 'id' + '}', CGI.escape(id.to_s))
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&#39;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