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
@@ -1,260 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: get
5
- uri: https://api.doorflow.com/api/3/people?per_page=1
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers:
10
- Content-Type:
11
- - application/json
12
- User-Agent:
13
- - doorflow-ruby/1.0.0
14
- Accept:
15
- - application/json
16
- Authorization:
17
- - "<ACCESS_TOKEN>"
18
- Accept-Encoding:
19
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
20
- response:
21
- status:
22
- code: 200
23
- message: OK
24
- headers:
25
- Date:
26
- - Thu, 05 Feb 2026 19:05:48 GMT
27
- Content-Type:
28
- - application/json; charset=utf-8
29
- Content-Length:
30
- - '1133'
31
- Connection:
32
- - keep-alive
33
- Cache-Control:
34
- - max-age=0, private, must-revalidate
35
- Etag:
36
- - W/"0fc99b05bf03337d3799164a42f5ca8c"
37
- Link:
38
- - <https://api.doorflow.com/api/3/people?page=14&per_page=1>; rel="last", <https://api.doorflow.com/api/3/people?page=2&per_page=1>;
39
- rel="next"
40
- Referrer-Policy:
41
- - strict-origin-when-cross-origin
42
- Strict-Transport-Security:
43
- - max-age=31536000; includeSubDomains
44
- Vary:
45
- - Origin
46
- X-Cache:
47
- - miss
48
- X-Content-Type-Options:
49
- - nosniff
50
- X-Download-Options:
51
- - noopen
52
- X-Frame-Options:
53
- - ALLOWALL
54
- X-Page:
55
- - '1'
56
- X-Per-Page:
57
- - '1'
58
- X-Permitted-Cross-Domain-Policies:
59
- - none
60
- X-Request-Id:
61
- - c86bbbc447efcccfd135c30ab4f9c583
62
- X-Runtime:
63
- - '0.052149'
64
- X-Total-Results:
65
- - '14'
66
- X-Xss-Protection:
67
- - 1; mode=block
68
- body:
69
- encoding: ASCII-8BIT
70
- string: '[{"id":833760,"first_name":"Benjamin","last_name":"Carter","salutation":"","job_title":"","email":"","organisation_id":"","system_id":null,"department":"","enabled":true,"valid_from":null,"valid_to":null,"credentials_number":"","key_fob_number":"","pin":"5641","mobile":"","image_url":"https://doorguard-us-production.s3.amazonaws.com/person/images/833760/medium/0556a7e006d9b99b417598589c987df5f57a11b5.png?1723200983","image_thumbnail_url":"https://doorguard-us-production.s3.amazonaws.com/person/images/833760/thumb/40c3a8b597c01692cc7ebe5c7b08098cc7ef6ef4.png?1723200983","telephone":null,"notes":"Updated
71
- at 2026-02-05 15:52:28 +0000","barcode":"","custom_1":"","custom_2":"","custom_3":"","custom_4":"","custom_5":"","created_at":"2024-08-09T11:56:22+01:00","updated_at":"2026-02-05T15:52:28+00:00","groups":[],"roles":[],"credentials":[{"id":"wmsd1rM","credential_type_id":852,"label":"Credentials
72
- number","person_id":833760,"value":""},{"id":"6ps3Ob9","credential_type_id":854,"label":"Pin","person_id":833760,"value":"5641"},{"id":"qKsXq1N","credential_type_id":853,"label":"Key
73
- fob number","person_id":833760,"value":""}]}]'
74
- recorded_at: Thu, 05 Feb 2026 19:05:48 GMT
75
- - request:
76
- method: get
77
- uri: https://api.doorflow.com/api/3/people/833760
78
- body:
79
- encoding: US-ASCII
80
- string: ''
81
- headers:
82
- Content-Type:
83
- - application/json
84
- User-Agent:
85
- - doorflow-ruby/1.0.0
86
- Accept:
87
- - application/json
88
- Authorization:
89
- - "<ACCESS_TOKEN>"
90
- Accept-Encoding:
91
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
92
- response:
93
- status:
94
- code: 200
95
- message: OK
96
- headers:
97
- Date:
98
- - Thu, 05 Feb 2026 19:05:49 GMT
99
- Content-Type:
100
- - application/json; charset=utf-8
101
- Content-Length:
102
- - '827'
103
- Connection:
104
- - keep-alive
105
- Cache-Control:
106
- - max-age=0, private, must-revalidate
107
- Etag:
108
- - W/"64b71d631c8d265506386fb3e3c3c4e5"
109
- Referrer-Policy:
110
- - strict-origin-when-cross-origin
111
- Strict-Transport-Security:
112
- - max-age=31536000; includeSubDomains
113
- Vary:
114
- - Origin
115
- X-Cache:
116
- - miss
117
- X-Content-Type-Options:
118
- - nosniff
119
- X-Download-Options:
120
- - noopen
121
- X-Frame-Options:
122
- - ALLOWALL
123
- X-Permitted-Cross-Domain-Policies:
124
- - none
125
- X-Request-Id:
126
- - c94da2dd660f2eb5bcde094c173be394
127
- X-Runtime:
128
- - '0.039132'
129
- X-Xss-Protection:
130
- - 1; mode=block
131
- body:
132
- encoding: UTF-8
133
- string: '{"id":833760,"first_name":"Benjamin","last_name":"Carter","salutation":"","job_title":"","email":"","organisation_id":"","system_id":null,"department":"","enabled":true,"valid_from":null,"valid_to":null,"credentials_number":"","key_fob_number":"","pin":"5641","mobile":"","image_url":"https://doorguard-us-production.s3.amazonaws.com/person/images/833760/medium/0556a7e006d9b99b417598589c987df5f57a11b5.png?1723200983","image_thumbnail_url":"https://doorguard-us-production.s3.amazonaws.com/person/images/833760/thumb/40c3a8b597c01692cc7ebe5c7b08098cc7ef6ef4.png?1723200983","telephone":null,"notes":"Updated
134
- at 2026-02-05 15:52:28 +0000","barcode":"","custom_1":"","custom_2":"","custom_3":"","custom_4":"","custom_5":"","created_at":"2024-08-09T11:56:22+01:00","updated_at":"2026-02-05T15:52:28+00:00","groups":[],"roles":[]}'
135
- recorded_at: Thu, 05 Feb 2026 19:05:49 GMT
136
- - request:
137
- method: put
138
- uri: https://api.doorflow.com/api/3/people/833760
139
- body:
140
- encoding: UTF-8
141
- string: '{"notes":"Updated at 2026-02-05 19:05:49 +0000"}'
142
- headers:
143
- Content-Type:
144
- - application/json
145
- User-Agent:
146
- - doorflow-ruby/1.0.0
147
- Accept:
148
- - application/json
149
- Authorization:
150
- - "<ACCESS_TOKEN>"
151
- Accept-Encoding:
152
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
153
- response:
154
- status:
155
- code: 201
156
- message: Created
157
- headers:
158
- Date:
159
- - Thu, 05 Feb 2026 19:05:49 GMT
160
- Content-Type:
161
- - application/json; charset=utf-8
162
- Content-Length:
163
- - '899'
164
- Connection:
165
- - keep-alive
166
- Cache-Control:
167
- - max-age=0, private, must-revalidate
168
- Etag:
169
- - W/"75a7755522db64c2d177fc0783065ea6"
170
- Referrer-Policy:
171
- - strict-origin-when-cross-origin
172
- Strict-Transport-Security:
173
- - max-age=31536000; includeSubDomains
174
- Vary:
175
- - Accept-Encoding
176
- - Origin
177
- X-Cache:
178
- - bypass
179
- X-Content-Type-Options:
180
- - nosniff
181
- X-Download-Options:
182
- - noopen
183
- X-Frame-Options:
184
- - ALLOWALL
185
- X-Permitted-Cross-Domain-Policies:
186
- - none
187
- X-Request-Id:
188
- - b03caf84cc1d124ccf6716fdd79c002b
189
- X-Runtime:
190
- - '0.077053'
191
- X-Xss-Protection:
192
- - 1; mode=block
193
- body:
194
- encoding: UTF-8
195
- string: '{"id":833760,"account_id":549,"first_name":"Benjamin","last_name":"Carter","salutation":"","job_title":"","email":"","organisation_id":"","system_id":null,"department":"","enabled":true,"valid_from":null,"valid_to":null,"credentials_number":"","key_fob_number":"","pin":"5641","mobile":"","magstripe_card_identifier":null,"image_url":"https://doorguard-us-production.s3.amazonaws.com/person/images/833760/medium/0556a7e006d9b99b417598589c987df5f57a11b5.png?1723200983","image_thumbnail_url":"https://doorguard-us-production.s3.amazonaws.com/person/images/833760/thumb/40c3a8b597c01692cc7ebe5c7b08098cc7ef6ef4.png?1723200983","telephone":null,"notes":"Updated
196
- at 2026-02-05 19:05:49 +0000","barcode":"","custom_1":"","custom_2":"","custom_3":"","custom_4":"","custom_5":"","created_at":"2024-08-09T11:56:22+01:00","updated_at":"2026-02-05T19:05:49+00:00","passport_token":null,"groups":[],"roles":[]}'
197
- recorded_at: Thu, 05 Feb 2026 19:05:49 GMT
198
- - request:
199
- method: put
200
- uri: https://api.doorflow.com/api/3/people/833760
201
- body:
202
- encoding: UTF-8
203
- string: '{"notes":"Updated at 2026-02-05 15:52:28 +0000"}'
204
- headers:
205
- Content-Type:
206
- - application/json
207
- User-Agent:
208
- - doorflow-ruby/1.0.0
209
- Accept:
210
- - application/json
211
- Authorization:
212
- - "<ACCESS_TOKEN>"
213
- Accept-Encoding:
214
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
215
- response:
216
- status:
217
- code: 201
218
- message: Created
219
- headers:
220
- Date:
221
- - Thu, 05 Feb 2026 19:05:50 GMT
222
- Content-Type:
223
- - application/json; charset=utf-8
224
- Content-Length:
225
- - '899'
226
- Connection:
227
- - keep-alive
228
- Cache-Control:
229
- - max-age=0, private, must-revalidate
230
- Etag:
231
- - W/"88f2a4a569d1cdd37cab731401cb919e"
232
- Referrer-Policy:
233
- - strict-origin-when-cross-origin
234
- Strict-Transport-Security:
235
- - max-age=31536000; includeSubDomains
236
- Vary:
237
- - Accept-Encoding
238
- - Origin
239
- X-Cache:
240
- - bypass
241
- X-Content-Type-Options:
242
- - nosniff
243
- X-Download-Options:
244
- - noopen
245
- X-Frame-Options:
246
- - ALLOWALL
247
- X-Permitted-Cross-Domain-Policies:
248
- - none
249
- X-Request-Id:
250
- - 30175dfcdb767ab44e1f9b405f01ca80
251
- X-Runtime:
252
- - '0.070406'
253
- X-Xss-Protection:
254
- - 1; mode=block
255
- body:
256
- encoding: UTF-8
257
- string: '{"id":833760,"account_id":549,"first_name":"Benjamin","last_name":"Carter","salutation":"","job_title":"","email":"","organisation_id":"","system_id":null,"department":"","enabled":true,"valid_from":null,"valid_to":null,"credentials_number":"","key_fob_number":"","pin":"5641","mobile":"","magstripe_card_identifier":null,"image_url":"https://doorguard-us-production.s3.amazonaws.com/person/images/833760/medium/0556a7e006d9b99b417598589c987df5f57a11b5.png?1723200983","image_thumbnail_url":"https://doorguard-us-production.s3.amazonaws.com/person/images/833760/thumb/40c3a8b597c01692cc7ebe5c7b08098cc7ef6ef4.png?1723200983","telephone":null,"notes":"Updated
258
- at 2026-02-05 15:52:28 +0000","barcode":"","custom_1":"","custom_2":"","custom_3":"","custom_4":"","custom_5":"","created_at":"2024-08-09T11:56:22+01:00","updated_at":"2026-02-05T19:05:50+00:00","passport_token":null,"groups":[],"roles":[]}'
259
- recorded_at: Thu, 05 Feb 2026 19:05:50 GMT
260
- recorded_with: VCR 6.4.0
@@ -1,62 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: post
5
- uri: https://api.doorflow.com/api/3/people
6
- body:
7
- encoding: UTF-8
8
- string: '{"email":"invalid-email-format"}'
9
- headers:
10
- Content-Type:
11
- - application/json
12
- User-Agent:
13
- - doorflow-ruby/1.0.0
14
- Accept:
15
- - application/json
16
- Authorization:
17
- - "<ACCESS_TOKEN>"
18
- Accept-Encoding:
19
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
20
- response:
21
- status:
22
- code: 422
23
- message: Unprocessable Entity
24
- headers:
25
- Date:
26
- - Thu, 05 Feb 2026 19:05:51 GMT
27
- Content-Type:
28
- - application/json; charset=utf-8
29
- Content-Length:
30
- - '64'
31
- Connection:
32
- - keep-alive
33
- Cache-Control:
34
- - no-cache
35
- Referrer-Policy:
36
- - strict-origin-when-cross-origin
37
- Strict-Transport-Security:
38
- - max-age=31536000; includeSubDomains
39
- Vary:
40
- - Accept-Encoding
41
- - Origin
42
- X-Cache:
43
- - bypass
44
- X-Content-Type-Options:
45
- - nosniff
46
- X-Download-Options:
47
- - noopen
48
- X-Frame-Options:
49
- - ALLOWALL
50
- X-Permitted-Cross-Domain-Policies:
51
- - none
52
- X-Request-Id:
53
- - 58351f2d0091a4d11fb17dddfd286e5a
54
- X-Runtime:
55
- - '0.023882'
56
- X-Xss-Protection:
57
- - 1; mode=block
58
- body:
59
- encoding: UTF-8
60
- string: '{"first_name":["can''t be blank"],"last_name":["can''t be blank"]}'
61
- recorded_at: Thu, 05 Feb 2026 19:05:51 GMT
62
- recorded_with: VCR 6.4.0
@@ -1,88 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe 'Channel Integration', :vcr do
4
- before do
5
- DoorFlow.access_token = ENV['DOORFLOW_ACCESS_TOKEN'] || 'test_access_token'
6
- DoorFlow.api_base = ENV['DOORFLOW_API_BASE'] || 'https://api.doorflow.com'
7
- end
8
-
9
- describe 'Channel operations' do
10
- it 'lists channels', vcr: { cassette_name: 'channel/list' } do
11
- channels = DoorFlow::ChannelResource.list
12
-
13
- expect(channels).to be_a(DoorFlow::ListObject)
14
- expect(channels.data).to be_an(Array)
15
- expect(channels.data.first).to be_a(DoorFlow::Resources::Channel) if channels.data.any?
16
- end
17
-
18
- it 'retrieves a channel', vcr: { cassette_name: 'channel/retrieve' } do
19
- # First list to get a real channel ID
20
- channels = DoorFlow::ChannelResource.list(per_page: 1)
21
- skip 'No channels in account' if channels.data.empty?
22
-
23
- channel_id = channels.data.first.id
24
- begin
25
- channel = DoorFlow::ChannelResource.retrieve(channel_id)
26
- expect(channel).to be_a(DoorFlow::Resources::Channel)
27
- expect(channel.id).to eq(channel_id)
28
- rescue DoorFlow::ApiError => e
29
- # Some accounts may have list permission but not individual retrieve permission
30
- skip "Cannot retrieve channel (API returned #{e.code})" if e.code == 404
31
- raise
32
- end
33
- end
34
- end
35
-
36
- # Note: Door control operations require write permissions (account.channel scope)
37
- # These tests are skipped when running with readonly access
38
- describe 'Door control operations', skip: 'Requires account.channel write scope' do
39
- let(:channel) do
40
- channels = DoorFlow::ChannelResource.list(per_page: 1)
41
- skip 'No channels in account' if channels.data.empty?
42
- DoorFlow::ChannelResource.retrieve(channels.data.first.id)
43
- end
44
-
45
- it 'unlocks a channel', vcr: { cassette_name: 'channel/unlock' } do
46
- result = channel.unlock(duration: 5)
47
- expect(result).to be_a(DoorFlow::Resources::Channel)
48
- end
49
-
50
- it 'admits any person through channel', vcr: { cassette_name: 'channel/admit' } do
51
- result = channel.admit
52
- expect(result).to be_a(DoorFlow::Resources::Channel)
53
- end
54
-
55
- it 'enables lockdown mode', vcr: { cassette_name: 'channel/lockdown' } do
56
- result = channel.lockdown(card_lockdown: true, rex_lockdown: true)
57
- expect(result).to be_a(DoorFlow::Resources::Channel)
58
- end
59
-
60
- it 'disables lockdown mode', vcr: { cassette_name: 'channel/unlockdown' } do
61
- result = channel.unlockdown
62
- expect(result).to be_a(DoorFlow::Resources::Channel)
63
- end
64
-
65
- it 'returns channel to normal mode', vcr: { cassette_name: 'channel/normal' } do
66
- result = channel.normal
67
- expect(result).to be_a(DoorFlow::Resources::Channel)
68
- end
69
- end
70
-
71
- describe 'Encryption key operations', skip: 'Requires account.channel write scope' do
72
- let(:channel) do
73
- channels = DoorFlow::ChannelResource.list(per_page: 1)
74
- skip 'No channels in account' if channels.data.empty?
75
- DoorFlow::ChannelResource.retrieve(channels.data.first.id)
76
- end
77
-
78
- it 'regenerates encryption key', vcr: { cassette_name: 'channel/regenerate_key' } do
79
- result = channel.regenerate_encryption_key
80
- expect(result).to be_a(DoorFlow::Resources::Channel)
81
- end
82
-
83
- it 'removes encryption key', vcr: { cassette_name: 'channel/remove_key' } do
84
- result = channel.remove_encryption_key
85
- expect(result).to be_a(DoorFlow::Resources::Channel)
86
- end
87
- end
88
- end
@@ -1,99 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe 'Person Integration', :vcr do
4
- before do
5
- DoorFlow.access_token = ENV['DOORFLOW_ACCESS_TOKEN'] || 'test_access_token'
6
- DoorFlow.api_base = ENV['DOORFLOW_API_BASE'] || 'https://api.doorflow.com'
7
- end
8
-
9
- describe 'Person CRUD operations' do
10
- it 'creates a person', vcr: { cassette_name: 'person/create' } do
11
- person = DoorFlow::PersonResource.create(
12
- first_name: 'Test',
13
- last_name: 'User',
14
- email: "test.user.#{Time.now.to_i}@example.com"
15
- )
16
-
17
- expect(person).to be_a(DoorFlow::Resources::Person)
18
- expect(person.id).not_to be_nil
19
- expect(person.attributes[:first_name]).to eq('Test')
20
- expect(person.attributes[:last_name]).to eq('User')
21
- end
22
-
23
- it 'lists people', vcr: { cassette_name: 'person/list' } do
24
- people = DoorFlow::PersonResource.list(per_page: 10)
25
-
26
- expect(people).to be_a(DoorFlow::ListObject)
27
- expect(people.data).to be_an(Array)
28
- expect(people.data.first).to be_a(DoorFlow::Resources::Person) if people.data.any?
29
- end
30
-
31
- it 'retrieves a person', vcr: { cassette_name: 'person/retrieve' } do
32
- # First list to get a real person ID
33
- people = DoorFlow::PersonResource.list(per_page: 1)
34
- skip 'No people in account' if people.data.empty?
35
-
36
- person_id = people.data.first.id
37
- person = DoorFlow::PersonResource.retrieve(person_id)
38
-
39
- expect(person).to be_a(DoorFlow::Resources::Person)
40
- expect(person.id).to eq(person_id)
41
- end
42
-
43
- it 'updates a person', vcr: { cassette_name: 'person/update' } do
44
- # First list to get a real person ID
45
- people = DoorFlow::PersonResource.list(per_page: 1)
46
- skip 'No people in account' if people.data.empty?
47
-
48
- person = DoorFlow::PersonResource.retrieve(people.data.first.id)
49
- new_notes = "Updated at #{Time.now}"
50
-
51
- updated_person = person.update(notes: new_notes)
52
-
53
- expect(updated_person).to be_a(DoorFlow::Resources::Person)
54
- expect(updated_person.id).to eq(person.id)
55
- # Note: With VCR canned responses, we can't verify the exact notes value
56
- # since the response is from a previous recording
57
- end
58
-
59
- it 'deletes a person', vcr: { cassette_name: 'person/delete' } do
60
- # Create a person to delete
61
- person = DoorFlow::PersonResource.create(
62
- first_name: 'Delete',
63
- last_name: 'Me',
64
- email: "delete.me.#{Time.now.to_i}@example.com"
65
- )
66
-
67
- result = person.delete
68
- expect(result).to be true
69
- end
70
- end
71
-
72
- describe 'Auto-pagination' do
73
- it 'automatically fetches all pages', vcr: { cassette_name: 'person/auto_pagination' } do
74
- emails = []
75
-
76
- DoorFlow::PersonResource.list.auto_paging_each do |person|
77
- emails << person.attributes[:email]
78
- break if emails.size >= 5 # Limit for testing
79
- end
80
-
81
- expect(emails).to be_an(Array)
82
- # May be empty if no people in account
83
- end
84
- end
85
-
86
- describe 'Error handling' do
87
- it 'handles not found errors', vcr: { cassette_name: 'person/not_found' } do
88
- expect {
89
- DoorFlow::PersonResource.retrieve('nonexistent_id_12345')
90
- }.to raise_error(DoorFlow::ApiError)
91
- end
92
-
93
- it 'handles validation errors', vcr: { cassette_name: 'person/validation_error' } do
94
- expect {
95
- DoorFlow::PersonResource.create(email: 'invalid-email-format')
96
- }.to raise_error(DoorFlow::ApiError)
97
- end
98
- end
99
- end
@@ -1,42 +0,0 @@
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.18.0-SNAPSHOT
10
-
11
- =end
12
-
13
- require 'spec_helper'
14
- require 'json'
15
- require 'date'
16
-
17
- # Unit tests for DoorFlow::AccountPassport
18
- # Automatically generated by openapi-generator (https://openapi-generator.tech)
19
- # Please update as you see appropriate
20
- describe DoorFlow::AccountPassport do
21
- #let(:instance) { DoorFlow::AccountPassport.new }
22
-
23
- describe 'test an instance of AccountPassport' do
24
- it 'should create an instance of AccountPassport' do
25
- # uncomment below to test the instance creation
26
- #expect(instance).to be_instance_of(DoorFlow::AccountPassport)
27
- end
28
- end
29
-
30
- describe 'test attribute "remote_unlock_enabled"' do
31
- it 'should work' do
32
- # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
33
- end
34
- end
35
-
36
- describe 'test attribute "hid_mobile_access"' do
37
- it 'should work' do
38
- # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
39
- end
40
- end
41
-
42
- end
@@ -1,60 +0,0 @@
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.18.0-SNAPSHOT
10
-
11
- =end
12
-
13
- require 'spec_helper'
14
- require 'json'
15
- require 'date'
16
-
17
- # Unit tests for DoorFlow::AccountReseller
18
- # Automatically generated by openapi-generator (https://openapi-generator.tech)
19
- # Please update as you see appropriate
20
- describe DoorFlow::AccountReseller do
21
- #let(:instance) { DoorFlow::AccountReseller.new }
22
-
23
- describe 'test an instance of AccountReseller' do
24
- it 'should create an instance of AccountReseller' do
25
- # uncomment below to test the instance creation
26
- #expect(instance).to be_instance_of(DoorFlow::AccountReseller)
27
- end
28
- end
29
-
30
- describe 'test attribute "id"' do
31
- it 'should work' do
32
- # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
33
- end
34
- end
35
-
36
- describe 'test attribute "name"' do
37
- it 'should work' do
38
- # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
39
- end
40
- end
41
-
42
- describe 'test attribute "support_contact"' do
43
- it 'should work' do
44
- # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
45
- end
46
- end
47
-
48
- describe 'test attribute "support_email"' do
49
- it 'should work' do
50
- # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
51
- end
52
- end
53
-
54
- describe 'test attribute "support_telephone"' do
55
- it 'should work' do
56
- # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
57
- end
58
- end
59
-
60
- end
@@ -1,52 +0,0 @@
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.18.0-SNAPSHOT
10
-
11
- =end
12
-
13
- require 'spec_helper'
14
- require 'json'
15
- require 'date'
16
-
17
- # Unit tests for DoorFlow::AccountSync
18
- # Automatically generated by openapi-generator (https://openapi-generator.tech)
19
- # Please update as you see appropriate
20
- describe DoorFlow::AccountSync do
21
- #let(:instance) { DoorFlow::AccountSync.new }
22
-
23
- describe 'test an instance of AccountSync' do
24
- it 'should create an instance of AccountSync' do
25
- # uncomment below to test the instance creation
26
- #expect(instance).to be_instance_of(DoorFlow::AccountSync)
27
- end
28
- end
29
-
30
- describe 'test attribute "status"' do
31
- it 'should work' do
32
- # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
33
- # validator = Petstore::EnumTest::EnumAttributeValidator.new('String', ["complete", "failing", "syncing", "pending"])
34
- # validator.allowable_values.each do |value|
35
- # expect { instance.status = value }.not_to raise_error
36
- # end
37
- end
38
- end
39
-
40
- describe 'test attribute "last_sync"' do
41
- it 'should work' do
42
- # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
43
- end
44
- end
45
-
46
- describe 'test attribute "description"' do
47
- it 'should work' do
48
- # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
49
- end
50
- end
51
-
52
- end