doorflow 1.0.1 → 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 (194) 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-api/api/accounts_api.rb +1 -1
  7. data/lib/doorflow-api/api/admission_requests_api.rb +2 -2
  8. data/lib/doorflow-api/api/card_designs_api.rb +347 -0
  9. data/lib/doorflow-api/api/card_template_types_api.rb +350 -0
  10. data/lib/doorflow-api/api/card_templates_api.rb +811 -0
  11. data/lib/doorflow-api/api/channels_api.rb +11 -11
  12. data/lib/doorflow-api/api/credential_types_api.rb +1 -1
  13. data/lib/doorflow-api/api/credentials_api.rb +6 -6
  14. data/lib/doorflow-api/api/element_sessions_api.rb +90 -0
  15. data/lib/doorflow-api/api/events_api.rb +2 -2
  16. data/lib/doorflow-api/api/group_reservations_api.rb +68 -5
  17. data/lib/doorflow-api/api/groups_api.rb +1 -1
  18. data/lib/doorflow-api/api/notification_rules_api.rb +7 -7
  19. data/lib/doorflow-api/api/oauth_api.rb +1 -1
  20. data/lib/doorflow-api/api/people_api.rb +7 -7
  21. data/lib/doorflow-api/api/reservations_api.rb +5 -5
  22. data/lib/doorflow-api/api/roles_api.rb +1 -1
  23. data/lib/doorflow-api/api/sites_api.rb +1 -1
  24. data/lib/doorflow-api/api/sync_api.rb +4 -4
  25. data/lib/doorflow-api/api_client.rb +8 -4
  26. data/lib/doorflow-api/api_error.rb +9 -14
  27. data/lib/doorflow-api/api_model_base.rb +1 -1
  28. data/lib/doorflow-api/configuration.rb +1 -1
  29. data/lib/doorflow-api/models/account.rb +1 -1
  30. data/lib/doorflow-api/models/account_passport.rb +1 -1
  31. data/lib/doorflow-api/models/account_reseller.rb +1 -1
  32. data/lib/doorflow-api/models/account_sync.rb +1 -1
  33. data/lib/doorflow-api/models/account_user.rb +1 -1
  34. data/lib/doorflow-api/models/admission_request.rb +1 -1
  35. data/lib/doorflow-api/models/admission_request_door_controller.rb +1 -1
  36. data/lib/doorflow-api/models/admission_request_person.rb +1 -1
  37. data/lib/doorflow-api/models/admit_channel202_response.rb +1 -1
  38. data/lib/doorflow-api/models/admit_person202_response.rb +1 -1
  39. data/lib/doorflow-api/models/admit_person403_response.rb +1 -1
  40. data/lib/doorflow-api/models/admit_person_request.rb +1 -1
  41. data/lib/doorflow-api/models/auto_unlock_channel400_response.rb +1 -1
  42. data/lib/doorflow-api/models/auto_unlock_channel_request.rb +1 -1
  43. data/lib/doorflow-api/models/card_design.rb +243 -0
  44. data/lib/doorflow-api/models/card_design_image_back.rb +179 -0
  45. data/lib/doorflow-api/models/card_design_image_front.rb +179 -0
  46. data/lib/doorflow-api/models/card_design_input.rb +181 -0
  47. data/lib/doorflow-api/models/card_template.rb +475 -0
  48. data/lib/doorflow-api/models/card_template_input.rb +147 -0
  49. data/lib/doorflow-api/models/card_template_input_card_template.rb +347 -0
  50. data/lib/doorflow-api/models/card_template_type.rb +321 -0
  51. data/lib/doorflow-api/models/card_template_type_input.rb +147 -0
  52. data/lib/doorflow-api/models/card_template_type_input_card_template_type.rb +251 -0
  53. data/lib/doorflow-api/models/card_template_type_input_card_template_type_non_printable_zones_inner.rb +183 -0
  54. data/lib/doorflow-api/models/card_template_type_non_printable_zones_inner.rb +188 -0
  55. data/lib/doorflow-api/models/channel.rb +1 -1
  56. data/lib/doorflow-api/models/channel_auto_unlock.rb +1 -1
  57. data/lib/doorflow-api/models/channel_lockdown.rb +1 -1
  58. data/lib/doorflow-api/models/channel_lockdown_aux_lockdown.rb +1 -1
  59. data/lib/doorflow-api/models/channel_lockdown_card_lockdown.rb +1 -1
  60. data/lib/doorflow-api/models/channel_lockdown_rex_lockdown.rb +1 -1
  61. data/lib/doorflow-api/models/channel_mode.rb +1 -1
  62. data/lib/doorflow-api/models/channel_sync.rb +5 -2
  63. data/lib/doorflow-api/models/{create_credential422_response.rb → create_card_design422_response.rb} +5 -5
  64. data/lib/doorflow-api/models/{create_credential422_response_errors.rb → create_card_design422_response_errors.rb} +4 -4
  65. data/lib/doorflow-api/models/credential.rb +4 -4
  66. data/lib/doorflow-api/models/credential_input.rb +1 -1
  67. data/lib/doorflow-api/models/credential_input_person_credential.rb +1 -1
  68. data/lib/doorflow-api/models/credential_type.rb +1 -1
  69. data/lib/doorflow-api/models/credential_update_input.rb +1 -1
  70. data/lib/doorflow-api/models/credential_update_input_person_credential.rb +1 -1
  71. data/lib/doorflow-api/models/{delete_group_reservation200_response.rb → delete_card_design200_response.rb} +4 -4
  72. data/lib/doorflow-api/models/delete_card_template_type409_response.rb +147 -0
  73. data/lib/doorflow-api/models/element_session.rb +192 -0
  74. data/lib/doorflow-api/models/element_session_config.rb +265 -0
  75. data/lib/doorflow-api/models/element_session_error.rb +199 -0
  76. data/lib/doorflow-api/models/element_session_input.rb +271 -0
  77. data/lib/doorflow-api/models/element_session_member.rb +186 -0
  78. data/lib/doorflow-api/models/error.rb +1 -1
  79. data/lib/doorflow-api/models/event.rb +1 -1
  80. data/lib/doorflow-api/models/get_access_token200_response.rb +1 -1
  81. data/lib/doorflow-api/models/get_access_token400_response.rb +1 -1
  82. data/lib/doorflow-api/models/get_access_token401_response.rb +1 -1
  83. data/lib/doorflow-api/models/get_admission_request401_response.rb +1 -1
  84. data/lib/doorflow-api/models/get_admission_request403_response.rb +1 -1
  85. data/lib/doorflow-api/models/get_admission_request404_response.rb +1 -1
  86. data/lib/doorflow-api/models/get_admission_request500_response.rb +1 -1
  87. data/lib/doorflow-api/models/get_token_info200_response.rb +1 -1
  88. data/lib/doorflow-api/models/get_token_info200_response_application.rb +1 -1
  89. data/lib/doorflow-api/models/get_token_info401_response.rb +1 -1
  90. data/lib/doorflow-api/models/group.rb +1 -1
  91. data/lib/doorflow-api/models/group_reservation.rb +1 -1
  92. data/lib/doorflow-api/models/group_reservation_input.rb +1 -1
  93. data/lib/doorflow-api/models/group_reservation_input_group_reservation.rb +1 -1
  94. data/lib/doorflow-api/models/initiate_sync429_response.rb +1 -1
  95. data/lib/doorflow-api/models/linked_file.rb +217 -0
  96. data/lib/doorflow-api/models/list_events400_response.rb +1 -1
  97. data/lib/doorflow-api/models/lockdown_channel_request.rb +1 -1
  98. data/lib/doorflow-api/models/notification_rule.rb +1 -1
  99. data/lib/doorflow-api/models/notification_rule_actions_inner.rb +1 -1
  100. data/lib/doorflow-api/models/notification_rule_conditions_inner.rb +1 -1
  101. data/lib/doorflow-api/models/notification_rule_events_inner.rb +1 -1
  102. data/lib/doorflow-api/models/notification_rule_input.rb +1 -1
  103. data/lib/doorflow-api/models/person.rb +30 -8
  104. data/lib/doorflow-api/models/person_input.rb +1 -1
  105. data/lib/doorflow-api/models/reservation.rb +1 -1
  106. data/lib/doorflow-api/models/reservation_input.rb +1 -1
  107. data/lib/doorflow-api/models/revoke_token403_response.rb +1 -1
  108. data/lib/doorflow-api/models/role.rb +1 -1
  109. data/lib/doorflow-api/models/site.rb +1 -1
  110. data/lib/doorflow-api/models/site_site_ips_inner.rb +1 -1
  111. data/lib/doorflow-api/models/unlock_channel_request.rb +1 -1
  112. data/lib/doorflow-api/version.rb +2 -2
  113. data/lib/doorflow-api.rb +28 -9
  114. data/lib/doorflow.rb +7 -2
  115. metadata +43 -164
  116. data/spec/api/admission_requests_api_spec.rb +0 -47
  117. data/spec/api/channels_api_spec.rb +0 -174
  118. data/spec/api/credential_types_api_spec.rb +0 -49
  119. data/spec/api/group_reservations_api_spec.rb +0 -75
  120. data/spec/api/oauth_api_spec.rb +0 -97
  121. data/spec/doorflow/client_spec.rb +0 -109
  122. data/spec/doorflow/webhooks/event_spec.rb +0 -117
  123. data/spec/doorflow/webhooks/handler_spec.rb +0 -154
  124. data/spec/doorflow/webhooks/signature_verifier_spec.rb +0 -210
  125. data/spec/doorflow/webhooks/support.rb +0 -18
  126. data/spec/doorflow_spec.rb +0 -22
  127. data/spec/fixtures/vcr_cassettes/channel/list.yml +0 -70
  128. data/spec/fixtures/vcr_cassettes/channel/retrieve.yml +0 -131
  129. data/spec/fixtures/vcr_cassettes/person/auto_pagination.yml +0 -87
  130. data/spec/fixtures/vcr_cassettes/person/create.yml +0 -64
  131. data/spec/fixtures/vcr_cassettes/person/delete.yml +0 -125
  132. data/spec/fixtures/vcr_cassettes/person/list.yml +0 -90
  133. data/spec/fixtures/vcr_cassettes/person/not_found.yml +0 -62
  134. data/spec/fixtures/vcr_cassettes/person/retrieve.yml +0 -136
  135. data/spec/fixtures/vcr_cassettes/person/update.yml +0 -260
  136. data/spec/fixtures/vcr_cassettes/person/validation_error.yml +0 -62
  137. data/spec/integration/channel_spec.rb +0 -88
  138. data/spec/integration/person_spec.rb +0 -99
  139. data/spec/models/account_passport_spec.rb +0 -42
  140. data/spec/models/account_reseller_spec.rb +0 -60
  141. data/spec/models/account_sync_spec.rb +0 -52
  142. data/spec/models/account_user_spec.rb +0 -54
  143. data/spec/models/admission_request_door_controller_spec.rb +0 -42
  144. data/spec/models/admission_request_person_spec.rb +0 -42
  145. data/spec/models/admission_request_spec.rb +0 -82
  146. data/spec/models/admit_channel202_response_spec.rb +0 -46
  147. data/spec/models/admit_person202_response_spec.rb +0 -46
  148. data/spec/models/admit_person403_response_spec.rb +0 -42
  149. data/spec/models/admit_person_request_spec.rb +0 -36
  150. data/spec/models/auto_unlock_channel400_response_spec.rb +0 -42
  151. data/spec/models/auto_unlock_channel_request_spec.rb +0 -36
  152. data/spec/models/channel_auto_unlock_spec.rb +0 -42
  153. data/spec/models/channel_lockdown_aux_lockdown_spec.rb +0 -36
  154. data/spec/models/channel_lockdown_card_lockdown_spec.rb +0 -36
  155. data/spec/models/channel_lockdown_rex_lockdown_spec.rb +0 -36
  156. data/spec/models/channel_lockdown_spec.rb +0 -54
  157. data/spec/models/channel_mode_spec.rb +0 -52
  158. data/spec/models/channel_sync_spec.rb +0 -46
  159. data/spec/models/create_credential422_response_errors_spec.rb +0 -48
  160. data/spec/models/create_credential422_response_spec.rb +0 -42
  161. data/spec/models/credential_input_person_credential_spec.rb +0 -48
  162. data/spec/models/credential_input_spec.rb +0 -36
  163. data/spec/models/credential_spec.rb +0 -86
  164. data/spec/models/credential_update_input_person_credential_spec.rb +0 -36
  165. data/spec/models/credential_update_input_spec.rb +0 -36
  166. data/spec/models/delete_group_reservation200_response_spec.rb +0 -36
  167. data/spec/models/error_spec.rb +0 -42
  168. data/spec/models/get_access_token200_response_spec.rb +0 -66
  169. data/spec/models/get_access_token400_response_spec.rb +0 -46
  170. data/spec/models/get_access_token401_response_spec.rb +0 -42
  171. data/spec/models/get_admission_request401_response_spec.rb +0 -42
  172. data/spec/models/get_admission_request403_response_spec.rb +0 -42
  173. data/spec/models/get_admission_request404_response_spec.rb +0 -42
  174. data/spec/models/get_admission_request500_response_spec.rb +0 -42
  175. data/spec/models/get_token_info200_response_application_spec.rb +0 -36
  176. data/spec/models/get_token_info200_response_spec.rb +0 -66
  177. data/spec/models/get_token_info401_response_spec.rb +0 -42
  178. data/spec/models/group_reservation_input_group_reservation_spec.rb +0 -54
  179. data/spec/models/group_reservation_input_spec.rb +0 -36
  180. data/spec/models/group_reservation_spec.rb +0 -82
  181. data/spec/models/initiate_sync429_response_spec.rb +0 -52
  182. data/spec/models/list_events400_response_spec.rb +0 -42
  183. data/spec/models/lockdown_channel_request_spec.rb +0 -48
  184. data/spec/models/notification_rule_actions_inner_spec.rb +0 -48
  185. data/spec/models/notification_rule_conditions_inner_spec.rb +0 -48
  186. data/spec/models/notification_rule_events_inner_spec.rb +0 -42
  187. data/spec/models/notification_rule_input_spec.rb +0 -60
  188. data/spec/models/person_input_spec.rb +0 -180
  189. data/spec/models/reservation_input_spec.rb +0 -60
  190. data/spec/models/revoke_token403_response_spec.rb +0 -42
  191. data/spec/models/site_site_ips_inner_spec.rb +0 -36
  192. data/spec/models/unlock_channel_request_spec.rb +0 -36
  193. data/spec/resources/credential_bugs_spec.rb +0 -115
  194. data/spec/spec_helper.rb +0 -160
@@ -1,62 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: get
5
- uri: https://api.doorflow.com/api/3/people/nonexistent_id_12345
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: 404
23
- message: Not Found
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
- - '95'
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
- - Origin
41
- X-Cache:
42
- - miss
43
- X-Content-Type-Options:
44
- - nosniff
45
- X-Download-Options:
46
- - noopen
47
- X-Frame-Options:
48
- - ALLOWALL
49
- X-Permitted-Cross-Domain-Policies:
50
- - none
51
- X-Request-Id:
52
- - 4f5ee1ae8c727f11e64420344dc18368
53
- X-Runtime:
54
- - '0.014988'
55
- X-Xss-Protection:
56
- - 1; mode=block
57
- body:
58
- encoding: UTF-8
59
- string: '{"error":"The resource you requested could not be found, please check
60
- your url and try again."}'
61
- recorded_at: Thu, 05 Feb 2026 19:05:51 GMT
62
- recorded_with: VCR 6.4.0
@@ -1,136 +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
- - a0fac87e86b3756dc296566d4d397646
62
- X-Runtime:
63
- - '0.095131'
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:48 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
- - 5d52b6c3d690848154fefb9f32540893
127
- X-Runtime:
128
- - '0.048389'
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:48 GMT
136
- recorded_with: VCR 6.4.0
@@ -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