calendlyr 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +7 -8
  3. data/CHANGELOG.md +2 -2
  4. data/README.md +46 -127
  5. data/calendlyr.gemspec +0 -1
  6. data/docs/resources/activity_log/list_activity_log_entries.md +34 -0
  7. data/docs/resources/availabilities/availability_rule.md +5 -0
  8. data/docs/resources/availabilities/user_availability_schedule.md +50 -0
  9. data/docs/resources/availabilities/user_busy_time.md +28 -0
  10. data/docs/resources/data_compliance.md +19 -0
  11. data/docs/resources/event_types/available_time.md +21 -0
  12. data/docs/resources/event_types/event_type.md +55 -0
  13. data/docs/resources/event_types/membership.md +29 -0
  14. data/docs/resources/event_types/profile.md +13 -0
  15. data/docs/resources/events/cancellation.md +18 -0
  16. data/docs/resources/events/event.md +62 -0
  17. data/docs/resources/events/guest.md +5 -0
  18. data/docs/resources/events/invitee.md +28 -0
  19. data/docs/resources/events/invitee_no_show.md +49 -0
  20. data/docs/resources/groups/group.md +56 -0
  21. data/docs/resources/groups/relationship.md +54 -0
  22. data/docs/resources/organizations/invitation.md +65 -0
  23. data/docs/resources/organizations/membership.md +58 -0
  24. data/docs/resources/organizations/organization.md +149 -0
  25. data/docs/resources/pagination.md +21 -0
  26. data/docs/resources/routing_forms/routing_form.md +48 -0
  27. data/docs/resources/routing_forms/submission.md +40 -0
  28. data/docs/resources/scheduling_link.md +26 -0
  29. data/docs/resources/share.md +28 -0
  30. data/docs/resources/user.md +111 -0
  31. data/docs/resources/webhooks/invitee_payload.md +42 -0
  32. data/docs/resources/webhooks/payload.md +5 -0
  33. data/docs/resources/webhooks/subscription.md +96 -0
  34. data/lib/calendlyr/client.rb +18 -2
  35. data/lib/calendlyr/collection.rb +2 -2
  36. data/lib/calendlyr/error.rb +42 -1
  37. data/lib/calendlyr/object.rb +6 -2
  38. data/lib/calendlyr/objects/activity_log.rb +11 -0
  39. data/lib/calendlyr/objects/availabilities/rule.rb +4 -0
  40. data/lib/calendlyr/objects/availabilities/user_busy_time.rb +7 -0
  41. data/lib/calendlyr/objects/availabilities/user_schedule.rb +13 -0
  42. data/lib/calendlyr/objects/event.rb +11 -0
  43. data/lib/calendlyr/objects/event_type.rb +15 -0
  44. data/lib/calendlyr/objects/event_types/available_time.rb +4 -0
  45. data/lib/calendlyr/objects/event_types/membership.rb +11 -0
  46. data/lib/calendlyr/objects/event_types/profile.rb +7 -0
  47. data/lib/calendlyr/objects/events/cancellation.rb +4 -0
  48. data/lib/calendlyr/objects/events/guest.rb +4 -0
  49. data/lib/calendlyr/objects/events/invitee.rb +11 -0
  50. data/lib/calendlyr/objects/events/invitee_no_show.rb +7 -0
  51. data/lib/calendlyr/objects/group.rb +15 -0
  52. data/lib/calendlyr/objects/groups/relationship.rb +15 -0
  53. data/lib/calendlyr/objects/organization.rb +67 -0
  54. data/lib/calendlyr/objects/organizations/invitation.rb +15 -0
  55. data/lib/calendlyr/objects/organizations/membership.rb +15 -0
  56. data/lib/calendlyr/objects/routing_form.rb +11 -0
  57. data/lib/calendlyr/objects/routing_forms/submission.rb +7 -0
  58. data/lib/calendlyr/objects/scheduling_link.rb +9 -0
  59. data/lib/calendlyr/objects/share.rb +9 -0
  60. data/lib/calendlyr/objects/user.rb +31 -0
  61. data/lib/calendlyr/objects/webhooks/invitee_payload.rb +15 -0
  62. data/lib/calendlyr/objects/webhooks/payload.rb +4 -0
  63. data/lib/calendlyr/objects/webhooks/subscription.rb +23 -0
  64. data/lib/calendlyr/resource.rb +2 -2
  65. data/lib/calendlyr/resources/availability.rb +19 -0
  66. data/lib/calendlyr/resources/data_compliance.rb +4 -0
  67. data/lib/calendlyr/resources/event.rb +40 -0
  68. data/lib/calendlyr/resources/event_type.rb +28 -0
  69. data/lib/calendlyr/resources/group.rb +22 -0
  70. data/lib/calendlyr/resources/organization.rb +40 -0
  71. data/lib/calendlyr/resources/outgoing_communication.rb +8 -0
  72. data/lib/calendlyr/resources/routing_form.rb +22 -0
  73. data/lib/calendlyr/resources/{scheduling_links.rb → scheduling_link.rb} +2 -2
  74. data/lib/calendlyr/resources/share.rb +8 -0
  75. data/lib/calendlyr/resources/user.rb +11 -0
  76. data/lib/calendlyr/resources/webhook.rb +25 -0
  77. data/lib/calendlyr/version.rb +1 -1
  78. data/lib/calendlyr.rb +70 -18
  79. data/test/calendlyr/objects/activity_log_test.rb +26 -0
  80. data/test/calendlyr/objects/availabilities/rule_test.rb +24 -0
  81. data/test/calendlyr/objects/availabilities/user_busy_time_test.rb +21 -0
  82. data/test/calendlyr/objects/availabilities/user_schedule_test.rb +26 -0
  83. data/test/calendlyr/objects/event_test.rb +32 -0
  84. data/test/calendlyr/objects/event_type_test.rb +43 -0
  85. data/test/calendlyr/objects/event_types/available_time_test.rb +20 -0
  86. data/test/calendlyr/objects/event_types/membership_test.rb +32 -0
  87. data/test/calendlyr/objects/event_types/profile_test.rb +23 -0
  88. data/test/calendlyr/objects/events/cancellation_test.rb +16 -0
  89. data/test/calendlyr/objects/events/guest_test.rb +16 -0
  90. data/test/calendlyr/objects/events/invitee_no_show_test.rb +23 -0
  91. data/test/calendlyr/objects/events/invitee_test.rb +35 -0
  92. data/test/calendlyr/objects/group_test.rb +40 -0
  93. data/test/calendlyr/objects/groups/relationship_test.rb +43 -0
  94. data/test/calendlyr/objects/organization_test.rb +157 -0
  95. data/test/calendlyr/objects/organizations/invitation_test.rb +34 -0
  96. data/test/calendlyr/objects/organizations/membership_test.rb +38 -0
  97. data/test/calendlyr/objects/routing_form_test.rb +26 -0
  98. data/test/calendlyr/objects/routing_forms/submission_test.rb +22 -0
  99. data/test/calendlyr/objects/scheduling_link_test.rb +17 -0
  100. data/test/calendlyr/objects/share_test.rb +19 -0
  101. data/test/calendlyr/objects/user_test.rb +81 -0
  102. data/test/calendlyr/objects/webhooks/invite_payload_test.rb +42 -0
  103. data/test/calendlyr/objects/webhooks/payload_test.rb +16 -0
  104. data/test/calendlyr/objects/webhooks/subscription_test.rb +42 -0
  105. data/test/calendlyr/resource_test.rb +12 -3
  106. data/test/calendlyr/resources/availabilities/user_busy_times_test.rb +31 -0
  107. data/test/calendlyr/resources/availabilities/user_schedules_test.rb +37 -0
  108. data/test/calendlyr/resources/data_compliance_test.rb +11 -0
  109. data/test/calendlyr/resources/event_types/membership_test.rb +22 -0
  110. data/test/calendlyr/resources/event_types_test.rb +55 -10
  111. data/test/calendlyr/resources/events/invitee_test.rb +31 -0
  112. data/test/calendlyr/resources/events_test.rb +22 -10
  113. data/test/calendlyr/resources/groups_test.rb +26 -0
  114. data/test/calendlyr/resources/organizations_test.rb +36 -100
  115. data/test/calendlyr/resources/outgoing_communications_test.rb +16 -0
  116. data/test/calendlyr/resources/scheduling_links_test.rb +1 -1
  117. data/test/calendlyr/resources/users_test.rb +9 -33
  118. data/test/calendlyr/resources/webhooks_test.rb +22 -13
  119. data/test/fixtures/activity_log/list.json +38 -0
  120. data/test/fixtures/availabilities/user_busy_times_list.json +39 -0
  121. data/test/fixtures/availabilities/user_schedules_list.json +93 -0
  122. data/test/fixtures/availabilities/user_schedules_retrieve.json +22 -0
  123. data/test/fixtures/data_compliance/delete_scheduled_event_data.json +1 -0
  124. data/test/fixtures/event_invitees/list.json +6 -6
  125. data/test/fixtures/event_invitees/retrieve.json +3 -3
  126. data/test/fixtures/event_type_available_times/list.json +22 -0
  127. data/test/fixtures/event_type_hosts/list.json +76 -0
  128. data/test/fixtures/event_types/create_one_off.json +45 -0
  129. data/test/fixtures/event_types/list.json +18 -4
  130. data/test/fixtures/event_types/retrieve.json +13 -2
  131. data/test/fixtures/events/cancel_invitee.json +8 -0
  132. data/test/fixtures/events/create_invitee_no_show.json +7 -0
  133. data/test/fixtures/events/delete_invitee_no_show.json +1 -0
  134. data/test/fixtures/events/retrieve_invitee_no_show.json +7 -0
  135. data/test/fixtures/group_relationships/list.json +83 -0
  136. data/test/fixtures/group_relationships/retrieve.json +29 -0
  137. data/test/fixtures/groups/list.json +19 -0
  138. data/test/fixtures/groups/retrieve.json +9 -0
  139. data/test/fixtures/objects/activity_log.json +24 -0
  140. data/test/fixtures/objects/availabilities/rule.json +10 -0
  141. data/test/fixtures/objects/availabilities/user_busy_time.json +10 -0
  142. data/test/fixtures/objects/availabilities/user_schedule.json +69 -0
  143. data/test/fixtures/objects/availability_rule.json +10 -0
  144. data/test/fixtures/objects/event.json +36 -0
  145. data/test/fixtures/objects/event_type.json +91 -0
  146. data/test/fixtures/objects/event_type_host.json +65 -0
  147. data/test/fixtures/objects/event_types/available_time.json +6 -0
  148. data/test/fixtures/objects/event_types/membership.json +65 -0
  149. data/test/fixtures/objects/event_types/profile.json +5 -0
  150. data/test/fixtures/objects/events/cancellation.json +6 -0
  151. data/test/fixtures/objects/events/guest.json +5 -0
  152. data/test/fixtures/objects/events/invitee.json +46 -0
  153. data/test/fixtures/objects/events/invitee_no_show.json +5 -0
  154. data/test/fixtures/objects/group.json +7 -0
  155. data/test/fixtures/objects/groups/relationship.json +27 -0
  156. data/test/fixtures/objects/organization.json +8 -0
  157. data/test/fixtures/objects/organizations/invitation.json +10 -0
  158. data/test/fixtures/objects/organizations/membership.json +18 -0
  159. data/test/fixtures/objects/routing_form.json +28 -0
  160. data/test/fixtures/objects/routing_forms/submission.json +27 -0
  161. data/test/fixtures/objects/scheduling_links/event_type.json +5 -0
  162. data/test/fixtures/objects/share.json +43 -0
  163. data/test/fixtures/objects/user.json +13 -0
  164. data/test/fixtures/objects/webhooks/invite_payload.json +83 -0
  165. data/test/fixtures/objects/webhooks/payload.json +66 -0
  166. data/test/fixtures/objects/webhooks/subscription.json +15 -0
  167. data/test/fixtures/organization_memberships/list.json +29 -0
  168. data/test/fixtures/organization_memberships/retrieve.json +20 -0
  169. data/test/fixtures/organizations/list_invitations.json +4 -4
  170. data/test/fixtures/organizations/list_memberships.json +12 -9
  171. data/test/fixtures/organizations/retrieve_invitation.json +3 -3
  172. data/test/fixtures/organizations/retrieve_membership.json +3 -3
  173. data/test/fixtures/outgoing_communications/list.json +26 -0
  174. data/test/fixtures/resources/401.json +2 -2
  175. data/test/fixtures/resources/403.json +1 -1
  176. data/test/fixtures/resources/403_payment_required.json +4 -0
  177. data/test/fixtures/resources/424.json +4 -0
  178. data/test/fixtures/routing_forms/list.json +39 -0
  179. data/test/fixtures/routing_forms/list_routing_form_submission.json +38 -0
  180. data/test/fixtures/routing_forms/retrieve.json +30 -0
  181. data/test/fixtures/routing_forms/retrieve_routing_form_submission.json +29 -0
  182. data/test/fixtures/shares/create.json +45 -0
  183. data/test/fixtures/user_availability_schedules/list.json +93 -0
  184. data/test/fixtures/user_availability_schedules/retrieve.json +22 -0
  185. data/test/fixtures/user_busy_times/list.json +39 -0
  186. data/test/fixtures/users/reload.json +5 -4
  187. data/test/fixtures/users/retrieve.json +5 -4
  188. data/test/fixtures/webhooks/create.json +4 -4
  189. data/test/fixtures/webhooks/list.json +4 -4
  190. data/test/fixtures/webhooks/retrieve.json +4 -4
  191. data/test/fixtures/webhooks/sample.json +105 -0
  192. metadata +159 -62
  193. data/lib/calendlyr/objects/event_invitees.rb +0 -4
  194. data/lib/calendlyr/objects/event_types.rb +0 -4
  195. data/lib/calendlyr/objects/events.rb +0 -4
  196. data/lib/calendlyr/objects/invitations.rb +0 -11
  197. data/lib/calendlyr/objects/memberships.rb +0 -7
  198. data/lib/calendlyr/objects/organizations.rb +0 -35
  199. data/lib/calendlyr/objects/scheduling_links.rb +0 -4
  200. data/lib/calendlyr/objects/users.rb +0 -19
  201. data/lib/calendlyr/objects/webhooks.rb +0 -11
  202. data/lib/calendlyr/resources/event_invitees.rb +0 -12
  203. data/lib/calendlyr/resources/event_types.rb +0 -12
  204. data/lib/calendlyr/resources/events.rb +0 -12
  205. data/lib/calendlyr/resources/organizations.rb +0 -33
  206. data/lib/calendlyr/resources/users.rb +0 -11
  207. data/lib/calendlyr/resources/webhooks.rb +0 -21
  208. data/test/calendlyr/resources/event_invitees_test.rb +0 -29
  209. data/test/fixtures/resources/409.json +0 -4
@@ -0,0 +1,9 @@
1
+ module Calendlyr
2
+ class Share < Object
3
+ def associated_scheduling_links
4
+ scheduling_links.map do |scheduling_link|
5
+ SchedulingLink.new(scheduling_link.to_h.merge(client: client))
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,31 @@
1
+ module Calendlyr
2
+ class User < Object
3
+ def organization
4
+ Organization.new({"uri" => current_organization}.merge(client: client))
5
+ end
6
+
7
+ def availability_schedules(**params)
8
+ client.availability.list_user_schedules(**params.merge(user: uri))
9
+ end
10
+
11
+ def event_types(**params)
12
+ client.event_types.list(**params.merge(user: uri))
13
+ end
14
+
15
+ def events(**params)
16
+ client.events.list(**params.merge(user: uri, organization: current_organization))
17
+ end
18
+
19
+ def membership(uuid:)
20
+ organization.membership(uuid: uuid)
21
+ end
22
+
23
+ def memberships(**params)
24
+ organization.memberships(**params.merge(user: uri))
25
+ end
26
+
27
+ def busy_times(start_time:, end_time:, **params)
28
+ client.availability.list_user_busy_times(**params.merge(user: uri, start_time: start_time, end_time: end_time))
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ module Calendlyr
2
+ class Webhooks::InviteePayload < Object
3
+ def associated_event
4
+ client.events.retrieve(uuid: get_slug(event))
5
+ end
6
+
7
+ def associated_routing_form_submission
8
+ client.routing_forms.retrieve_submission(uuid: get_slug(routing_form_submission))
9
+ end
10
+
11
+ def associated_invitee_no_show
12
+ client.events.retrieve_invitee_no_show(uuid: get_slug(no_show.uri))
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ module Calendlyr
2
+ class Webhooks::Payload < Object
3
+ end
4
+ end
@@ -0,0 +1,23 @@
1
+ module Calendlyr
2
+ class Webhooks::Subscription < Object
3
+ def associated_organization
4
+ Organization.new({"uri" => organization}.merge(client: client))
5
+ end
6
+
7
+ def associated_user
8
+ client.users.retrieve(uuid: get_slug(user))
9
+ end
10
+
11
+ def associated_creator
12
+ client.users.retrieve(uuid: get_slug(creator))
13
+ end
14
+
15
+ def active?
16
+ state == "active"
17
+ end
18
+
19
+ def disabled?
20
+ state == "disabled"
21
+ end
22
+ end
23
+ end
@@ -7,7 +7,7 @@ module Calendlyr
7
7
  class Resource
8
8
  attr_reader :client
9
9
 
10
- ERROR_CODES = %w[400 401 403 404 409 500]
10
+ ERROR_CODES = %w[400 401 403 404 424 500]
11
11
 
12
12
  def initialize(client)
13
13
  @client = client
@@ -52,7 +52,7 @@ module Calendlyr
52
52
 
53
53
  body = JSON.parse(response.read_body)
54
54
  if ERROR_CODES.include? response.code
55
- raise Error, "[Error #{response.code}] #{body["title"]}. #{body["message"]}"
55
+ raise ResponseErrorHandler.new(response.code, body).error
56
56
  else
57
57
  body
58
58
  end
@@ -0,0 +1,19 @@
1
+ module Calendlyr
2
+ class AvailabilityResource < Resource
3
+ # User Busy Time
4
+ def list_user_busy_times(user:, start_time:, end_time:, **params)
5
+ response = get_request("user_busy_times", params: {user: user, start_time: start_time, end_time: end_time}.merge(params).compact)
6
+ Collection.from_response(response, type: Availabilities::UserBusyTime, client: client)
7
+ end
8
+
9
+ # User Schedule
10
+ def list_user_schedules(user:, **params)
11
+ response = get_request("user_availability_schedules", params: {user: user}.merge(params).compact)
12
+ Collection.from_response(response, type: Availabilities::UserSchedule, client: client)
13
+ end
14
+
15
+ def retrieve_user_schedule(uuid:)
16
+ Availabilities::UserSchedule.new get_request("user_availability_schedules/#{uuid}").dig("resource").merge(client: client)
17
+ end
18
+ end
19
+ end
@@ -3,5 +3,9 @@ module Calendlyr
3
3
  def delete_invitee_data(emails:)
4
4
  post_request("data_compliance/deletion/invitees", body: {emails: emails})
5
5
  end
6
+
7
+ def delete_scheduled_event_data(start_time:, end_time:)
8
+ post_request("data_compliance/deletion/events", body: {start_time: start_time, end_time: end_time})
9
+ end
6
10
  end
7
11
  end
@@ -0,0 +1,40 @@
1
+ module Calendlyr
2
+ class EventResource < Resource
3
+ def list(**params)
4
+ response = get_request("scheduled_events", params: params)
5
+ Collection.from_response(response, type: Event, client: client)
6
+ end
7
+
8
+ def retrieve(uuid:)
9
+ Event.new get_request("scheduled_events/#{uuid}").dig("resource").merge(client: client)
10
+ end
11
+
12
+ def cancel(uuid:, reason: nil)
13
+ Events::Cancellation.new post_request("scheduled_events/#{uuid}/cancellation", body: {reason: reason}).dig("resource").merge(client: client)
14
+ end
15
+
16
+ # Invitee
17
+ def list_invitees(uuid:, **params)
18
+ response = get_request("scheduled_events/#{uuid}/invitees", params: params)
19
+ Collection.from_response(response, type: Events::Invitee, client: client)
20
+ end
21
+
22
+ def retrieve_invitee(event_uuid:, invitee_uuid:)
23
+ Events::Invitee.new get_request("scheduled_events/#{event_uuid}/invitees/#{invitee_uuid}").dig("resource").merge(client: client)
24
+ end
25
+
26
+ # Invitee No Show
27
+ def retrieve_invitee_no_show(uuid:)
28
+ Events::InviteeNoShow.new get_request("invitee_no_shows/#{uuid}").dig("resource").merge(client: client)
29
+ end
30
+
31
+ def create_invitee_no_show(invitee:)
32
+ body = {invitee: invitee}
33
+ Events::InviteeNoShow.new post_request("invitee_no_shows", body: body).dig("resource").merge(client: client)
34
+ end
35
+
36
+ def delete_invitee_no_show(uuid:)
37
+ delete_request("invitee_no_shows/#{uuid}")
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,28 @@
1
+ module Calendlyr
2
+ class EventTypeResource < Resource
3
+ def list(**params)
4
+ response = get_request("event_types", params: params)
5
+ Collection.from_response(response, type: EventType, client: client)
6
+ end
7
+
8
+ def retrieve(uuid:)
9
+ EventType.new get_request("event_types/#{uuid}").dig("resource").merge(client: client)
10
+ end
11
+
12
+ def create_one_off(name:, host:, duration:, date_setting:, location:, **params)
13
+ body = {name: name, host: host, duration: duration, date_setting: date_setting, location: location}.merge(params)
14
+ EventType.new post_request("one_off_event_types", body: body).dig("resource").merge(client: client)
15
+ end
16
+
17
+ def list_memberships(event_type:, **params)
18
+ response = get_request("event_type_memberships", params: {event_type: event_type}.merge(params))
19
+ Collection.from_response(response, type: EventTypes::Membership, client: client)
20
+ end
21
+
22
+ # Available Times
23
+ def list_available_times(event_type:, start_time:, end_time:, **params)
24
+ response = get_request("event_type_available_times", params: {event_type: event_type, start_time: start_time, end_time: end_time}.merge(params))
25
+ Collection.from_response(response, type: EventTypes::AvailableTime, client: client)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,22 @@
1
+ module Calendlyr
2
+ class GroupResource < Resource
3
+ def list(organization:, **params)
4
+ response = get_request("groups", params: params.merge(organization: organization))
5
+ Collection.from_response(response, type: Group, client: client)
6
+ end
7
+
8
+ def retrieve(uuid:)
9
+ Group.new get_request("groups/#{uuid}").dig("resource").merge(client: client)
10
+ end
11
+
12
+ # Relationships
13
+ def list_relationships(**params)
14
+ response = get_request("group_relationships", params: params)
15
+ Collection.from_response(response, type: Groups::Relationship, client: client)
16
+ end
17
+
18
+ def retrieve_relationship(uuid:)
19
+ Groups::Relationship.new get_request("group_relationships/#{uuid}").dig("resource").merge(client: client)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,40 @@
1
+ module Calendlyr
2
+ class OrganizationResource < Resource
3
+ def activity_log(organization: nil, **params)
4
+ response = get_request("activity_log_entries", params: {organization: organization}.merge(params).compact)
5
+ Collection.from_response(response, type: ActivityLog, client: client)
6
+ end
7
+
8
+ # Memberships
9
+ def list_memberships(**params)
10
+ response = get_request("organization_memberships", params: params)
11
+ Collection.from_response(response, type: Organizations::Membership, client: client)
12
+ end
13
+
14
+ def retrieve_membership(uuid:)
15
+ Organizations::Membership.new(get_request("organization_memberships/#{uuid}").dig("resource").merge(client: client))
16
+ end
17
+
18
+ def remove_user(uuid:)
19
+ delete_request("organization_memberships/#{uuid}")
20
+ end
21
+
22
+ # Invitations
23
+ def list_invitations(uuid:, **params)
24
+ response = get_request("organizations/#{uuid}/invitations", params: params)
25
+ Collection.from_response(response, type: Organizations::Invitation, client: client)
26
+ end
27
+
28
+ def retrieve_invitation(org_uuid:, uuid:)
29
+ Organizations::Invitation.new get_request("organizations/#{org_uuid}/invitations/#{uuid}").dig("resource").merge(client: client)
30
+ end
31
+
32
+ def invite(organization_uuid:, email:)
33
+ Organizations::Invitation.new post_request("organizations/#{organization_uuid}/invitations", body: {email: email}).dig("resource").merge(client: client)
34
+ end
35
+
36
+ def revoke_invitation(org_uuid:, uuid:)
37
+ delete_request("organizations/#{org_uuid}/invitations/#{uuid}")
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,8 @@
1
+ module Calendlyr
2
+ class OutgoingCommunicationResource < Resource
3
+ def list(**params)
4
+ response = get_request("outgoing_communications", params: params)
5
+ Collection.from_response(response, type: Object, client: client)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,22 @@
1
+ module Calendlyr
2
+ class RoutingFormResource < Resource
3
+ def list(organization:, **params)
4
+ response = get_request("routing_forms", params: {organization: organization}.merge(params))
5
+ Collection.from_response(response, type: RoutingForm, client: client)
6
+ end
7
+
8
+ def retrieve(uuid:)
9
+ RoutingForm.new(get_request("routing_forms/#{uuid}").dig("resource").merge(client: client))
10
+ end
11
+
12
+ # Routing Form Submission
13
+ def list_submissions(form:, **params)
14
+ response = get_request("routing_form_submissions", params: {form: form}.merge(params))
15
+ Collection.from_response(response, type: RoutingForms::Submission, client: client)
16
+ end
17
+
18
+ def retrieve_submission(uuid:)
19
+ RoutingForms::Submission.new get_request("routing_form_submissions/#{uuid}").dig("resource").merge(client: client)
20
+ end
21
+ end
22
+ end
@@ -1,7 +1,7 @@
1
1
  module Calendlyr
2
2
  class SchedulingLinkResource < Resource
3
- def create(owner_uri:, max_event_count:, owner_type: "EventType")
4
- body = {owner: owner_uri, max_event_count: max_event_count, owner_type: owner_type}
3
+ def create(owner:, max_event_count:, owner_type: "EventType")
4
+ body = {owner: owner, max_event_count: max_event_count, owner_type: owner_type}
5
5
  SchedulingLink.new post_request("scheduling_links", body: body).dig("resource").merge(client: client)
6
6
  end
7
7
  end
@@ -0,0 +1,8 @@
1
+ module Calendlyr
2
+ class ShareResource < Resource
3
+ def create(event_type:, **params)
4
+ body = {event_type: event_type}.merge(params)
5
+ Share.new post_request("shares", body: body).dig("resource").merge(client: client)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ module Calendlyr
2
+ class UserResource < Resource
3
+ def me
4
+ retrieve(uuid: "me")
5
+ end
6
+
7
+ def retrieve(uuid:)
8
+ User.new get_request("users/#{uuid}").dig("resource").merge(client: client)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,25 @@
1
+ module Calendlyr
2
+ class WebhookResource < Resource
3
+ def list(organization:, scope:, **params)
4
+ response = get_request("webhook_subscriptions", params: params.merge(organization: organization, scope: scope).compact)
5
+ Collection.from_response(response, type: Webhooks::Subscription, client: client)
6
+ end
7
+
8
+ def create(url:, events:, organization:, scope:, **params)
9
+ body = params.merge(url: url, events: events, organization: organization, scope: scope)
10
+ Webhooks::Subscription.new post_request("webhook_subscriptions", body: body).dig("resource").merge(client: client)
11
+ end
12
+
13
+ def retrieve(webhook_uuid:)
14
+ Webhooks::Subscription.new get_request("webhook_subscriptions/#{webhook_uuid}").dig("resource").merge(client: client)
15
+ end
16
+
17
+ def delete(webhook_uuid:)
18
+ delete_request("webhook_subscriptions/#{webhook_uuid}")
19
+ end
20
+
21
+ def sample_webhook_data(event:, organization:, scope:, **params)
22
+ Object.new get_request("sample_webhook_data", params: params.merge(event: event, organization: organization, scope: scope)).merge(client: client)
23
+ end
24
+ end
25
+ end
@@ -1,3 +1,3 @@
1
1
  module Calendlyr
2
- VERSION = "0.6.0"
2
+ VERSION = "0.7.0"
3
3
  end
data/lib/calendlyr.rb CHANGED
@@ -3,28 +3,80 @@ require "calendlyr/version"
3
3
  module Calendlyr
4
4
  autoload :Client, "calendlyr/client"
5
5
  autoload :Collection, "calendlyr/collection"
6
- autoload :Error, "calendlyr/error"
7
- autoload :Resource, "calendlyr/resource"
8
6
  autoload :Object, "calendlyr/object"
7
+ autoload :Resource, "calendlyr/resource"
8
+
9
+ # Errors
10
+ autoload :BadRequest, "calendlyr/error"
11
+ autoload :Error, "calendlyr/error"
12
+ autoload :ExternalCalendarEror, "calendlyr/error"
13
+ autoload :InternalServerError, "calendlyr/error"
14
+ autoload :NotFound, "calendlyr/error"
15
+ autoload :PaymentRequired, "calendlyr/error"
16
+ autoload :PermissionDenied, "calendlyr/error"
17
+ autoload :ResponseErrorHandler, "calendlyr/error"
18
+ autoload :Unauthenticated, "calendlyr/error"
9
19
 
10
20
  # High-level categories of Calendly API calls
11
- autoload :UserResource, "calendlyr/resources/users"
12
- autoload :EventTypeResource, "calendlyr/resources/event_types"
13
- autoload :OrganizationResource, "calendlyr/resources/organizations"
14
- autoload :EventResource, "calendlyr/resources/events"
15
- autoload :EventInviteeResource, "calendlyr/resources/event_invitees"
16
- autoload :SchedulingLinkResource, "calendlyr/resources/scheduling_links"
17
- autoload :WebhookResource, "calendlyr/resources/webhooks"
21
+ autoload :AvailabilityResource, "calendlyr/resources/availability"
18
22
  autoload :DataComplianceResource, "calendlyr/resources/data_compliance"
23
+ autoload :EventResource, "calendlyr/resources/event"
24
+ autoload :EventTypeResource, "calendlyr/resources/event_type"
25
+ autoload :GroupResource, "calendlyr/resources/group"
26
+ autoload :OrganizationResource, "calendlyr/resources/organization"
27
+ autoload :OutgoingCommunicationResource, "calendlyr/resources/outgoing_communication"
28
+ autoload :RoutingFormResource, "calendlyr/resources/routing_form"
29
+ autoload :SchedulingLinkResource, "calendlyr/resources/scheduling_link"
30
+ autoload :ShareResource, "calendlyr/resources/share"
31
+ autoload :UserResource, "calendlyr/resources/user"
32
+ autoload :WebhookResource, "calendlyr/resources/webhook"
19
33
 
20
34
  # Classes used to return a nicer object wrapping the response data
21
- autoload :User, "calendlyr/objects/users"
22
- autoload :EventType, "calendlyr/objects/event_types"
23
- autoload :Event, "calendlyr/objects/events"
24
- autoload :Organization, "calendlyr/objects/organizations"
25
- autoload :Invitation, "calendlyr/objects/invitations"
26
- autoload :EventInvitee, "calendlyr/objects/event_invitees"
27
- autoload :SchedulingLink, "calendlyr/objects/scheduling_links"
28
- autoload :Membership, "calendlyr/objects/memberships"
29
- autoload :Webhook, "calendlyr/objects/webhooks"
35
+ autoload :ActivityLog, "calendlyr/objects/activity_log"
36
+ autoload :Event, "calendlyr/objects/event"
37
+ autoload :EventType, "calendlyr/objects/event_type"
38
+ autoload :Group, "calendlyr/objects/group"
39
+ autoload :Organization, "calendlyr/objects/organization"
40
+ autoload :RoutingForm, "calendlyr/objects/routing_form"
41
+ autoload :SchedulingLink, "calendlyr/objects/scheduling_link"
42
+ autoload :Share, "calendlyr/objects/share"
43
+ autoload :User, "calendlyr/objects/user"
44
+
45
+ module Availabilities
46
+ autoload :Rule, "calendlyr/objects/availabilities/rule"
47
+ autoload :UserSchedule, "calendlyr/objects/availabilities/user_schedule"
48
+ autoload :UserBusyTime, "calendlyr/objects/availabilities/user_busy_time"
49
+ end
50
+
51
+ module Events
52
+ autoload :Cancellation, "calendlyr/objects/events/cancellation"
53
+ autoload :Guest, "calendlyr/objects/events/guest"
54
+ autoload :Invitee, "calendlyr/objects/events/invitee"
55
+ autoload :InviteeNoShow, "calendlyr/objects/events/invitee_no_show"
56
+ end
57
+
58
+ module EventTypes
59
+ autoload :AvailableTime, "calendlyr/objects/event_types/available_time"
60
+ autoload :Membership, "calendlyr/objects/event_types/membership"
61
+ autoload :Profile, "calendlyr/objects/event_types/profile"
62
+ end
63
+
64
+ module Groups
65
+ autoload :Relationship, "calendlyr/objects/groups/relationship"
66
+ end
67
+
68
+ module Organizations
69
+ autoload :Invitation, "calendlyr/objects/organizations/invitation"
70
+ autoload :Membership, "calendlyr/objects/organizations/membership"
71
+ end
72
+
73
+ module RoutingForms
74
+ autoload :Submission, "calendlyr/objects/routing_forms/submission"
75
+ end
76
+
77
+ module Webhooks
78
+ autoload :Subscription, "calendlyr/objects/webhooks/subscription"
79
+ autoload :InviteePayload, "calendlyr/objects/webhooks/invitee_payload"
80
+ autoload :Payload, "calendlyr/objects/webhooks/payload"
81
+ end
30
82
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class ActivityLogObjectTest < Minitest::Test
6
+ def setup
7
+ json = JSON.parse(fixture_file("objects/activity_log")).merge(client: client)
8
+ @activity_log = Calendlyr::ActivityLog.new(json)
9
+
10
+ user_uuid = "SDLKJENFJKD123"
11
+ response = {body: fixture_file("users/retrieve"), status: 200}
12
+ stub(path: "users/#{user_uuid}", response: response)
13
+ end
14
+
15
+ def test_associated_organization
16
+ organization = @activity_log.associated_organization
17
+
18
+ assert_equal Calendlyr::Organization, organization.class
19
+ end
20
+
21
+ def test_associated_actor
22
+ user = @activity_log.associated_actor
23
+
24
+ assert_equal "John Doe", user.name
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ module Availabilities
6
+ class RuleObjectTest < Minitest::Test
7
+ def setup
8
+ json = JSON.parse(fixture_file("objects/availabilities/rule")).merge(client: client)
9
+ @rule = Calendlyr::Availabilities::Rule.new(json)
10
+ end
11
+
12
+ def test_type
13
+ assert_equal "wday", @rule.type
14
+ end
15
+
16
+ def test_intervals
17
+ assert_equal 1, @rule.intervals.size
18
+ end
19
+
20
+ def test_wday
21
+ assert_equal "sunday", @rule.wday
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+ module Availabilities
5
+ class UserBusyTimeObjectTest < Minitest::Test
6
+ def setup
7
+ response = {body: fixture_file("events/retrieve"), status: 200}
8
+ stub(path: "scheduled_events/abc123", response: response)
9
+ json = JSON.parse(fixture_file("objects/availabilities/user_busy_time")).merge(client: client)
10
+ @user_busy_time = Calendlyr::Availabilities::UserBusyTime.new(json)
11
+ end
12
+
13
+ def test_associated_event
14
+ assert_equal Calendlyr::Event, @user_busy_time.associated_event.class
15
+ end
16
+
17
+ def test_type
18
+ assert_equal "calendly", @user_busy_time.type
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ module Availabilities
6
+ class UserScheduleObjectTest < Minitest::Test
7
+ def setup
8
+ stub(path: "users/abc123", response: {body: fixture_file("users/retrieve"), status: 200})
9
+ json = JSON.parse(fixture_file("objects/availabilities/user_schedule")).merge(client: client)
10
+ @user_availability_schedule = Calendlyr::Availabilities::UserSchedule.new(json)
11
+ end
12
+
13
+ def test_associated_user
14
+ assert_equal Calendlyr::User, @user_availability_schedule.associated_user.class
15
+ end
16
+
17
+ def test_availability_schedule
18
+ assert_equal "America\\/New_York", @user_availability_schedule.timezone
19
+ end
20
+
21
+ def test_availability_rules
22
+ assert_equal 7, @user_availability_schedule.availability_rules.count
23
+ assert_equal Calendlyr::Availabilities::Rule, @user_availability_schedule.availability_rules.first.class
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class EventObjectTest < Minitest::Test
6
+ def setup
7
+ json = JSON.parse(fixture_file("objects/event")).merge(client: client)
8
+ @event = Calendlyr::Event.new(json)
9
+
10
+ user_uuid = "GBGBDCAADAEDCRZ2"
11
+ response = {body: fixture_file("users/retrieve"), status: 200}
12
+ stub(path: "users/#{user_uuid}", response: response)
13
+ end
14
+
15
+ def test_memberships
16
+ memberships = @event.memberships
17
+
18
+ assert_equal 1, memberships.count
19
+ assert_equal "John Doe", memberships.first.name
20
+ assert_instance_of Calendlyr::User, memberships.first
21
+ end
22
+
23
+ def test_cancel
24
+ response = {body: fixture_file("events/cancel_invitee"), status: 201}
25
+ stub(method: :post, path: "scheduled_events/#{@event.uuid}/cancellation", response: response)
26
+
27
+ cancellation = @event.cancel(reason: "I'm busy")
28
+
29
+ assert_instance_of Calendlyr::Events::Cancellation, cancellation
30
+ assert_equal "string", cancellation.reason
31
+ end
32
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class EventTypeObjectTest < Minitest::Test
6
+ def setup
7
+ json = JSON.parse(fixture_file("objects/event_type")).merge(client: client)
8
+ @event_type = Calendlyr::EventType.new(json)
9
+
10
+ event_type_uri = "https://api.calendly.com/event_types/AAAAAAAAAAAAAAAA"
11
+ @start_time = "2020-01-02T20:00:00.000000Z"
12
+ @end_time = "2020-01-07T24:00:00.000000Z"
13
+
14
+ response = {body: fixture_file("event_type_available_times/list"), status: 200}
15
+ stub(path: "event_type_available_times?event_type=#{event_type_uri}&start_time=#{@start_time}&end_time=#{@end_time}", response: response)
16
+
17
+ event_type_uri = "https://api.calendly.com/event_types/AAAAAAAAAAAAAAAA"
18
+ response = {body: fixture_file("shares/create"), status: 201}
19
+ stub(method: :post, path: "shares", body: {event_type: event_type_uri}, response: response)
20
+ end
21
+
22
+ def test_associated_profile
23
+ profile = @event_type.associated_profile
24
+
25
+ assert_equal Calendlyr::EventTypes::Profile, profile.class
26
+ assert_equal "Tamara Jones", profile.name
27
+ end
28
+
29
+ def test_create_share
30
+ share = @event_type.create_share
31
+
32
+ assert_instance_of Calendlyr::Share, share
33
+ assert_equal 1, share.scheduling_links.size
34
+ end
35
+
36
+ def test_available_times
37
+ available_times = @event_type.available_times(start_time: @start_time, end_time: @end_time)
38
+
39
+ assert 3, available_times.data.size
40
+ assert "available", available_times.data.first.status
41
+ assert_instance_of Calendlyr::EventTypes::AvailableTime, available_times.data.first
42
+ end
43
+ end