calendlyr 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +34 -0
  3. data/.gitignore +25 -0
  4. data/CHANGELOG.md +32 -0
  5. data/Gemfile +8 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +159 -0
  8. data/Rakefile +10 -0
  9. data/bin/console +13 -0
  10. data/bin/setup +8 -0
  11. data/bin/test +6 -0
  12. data/calendly.gemspec +27 -0
  13. data/lib/calendly/client.rb +57 -0
  14. data/lib/calendly/collection.rb +31 -0
  15. data/lib/calendly/error.rb +4 -0
  16. data/lib/calendly/object.rb +27 -0
  17. data/lib/calendly/objects/event_invitees.rb +4 -0
  18. data/lib/calendly/objects/event_types.rb +4 -0
  19. data/lib/calendly/objects/events.rb +4 -0
  20. data/lib/calendly/objects/invitations.rb +11 -0
  21. data/lib/calendly/objects/memberships.rb +7 -0
  22. data/lib/calendly/objects/organizations.rb +27 -0
  23. data/lib/calendly/objects/scheduling_links.rb +4 -0
  24. data/lib/calendly/objects/users.rb +19 -0
  25. data/lib/calendly/objects/webhooks.rb +11 -0
  26. data/lib/calendly/resource.rb +73 -0
  27. data/lib/calendly/resources/data_compliance.rb +7 -0
  28. data/lib/calendly/resources/event_invitees.rb +12 -0
  29. data/lib/calendly/resources/event_types.rb +12 -0
  30. data/lib/calendly/resources/events.rb +12 -0
  31. data/lib/calendly/resources/organizations.rb +33 -0
  32. data/lib/calendly/resources/scheduling_links.rb +8 -0
  33. data/lib/calendly/resources/users.rb +11 -0
  34. data/lib/calendly/resources/webhooks.rb +21 -0
  35. data/lib/calendly/version.rb +3 -0
  36. data/lib/calendly.rb +35 -0
  37. data/test/calendly/client_test.rb +8 -0
  38. data/test/calendly/object_test.rb +21 -0
  39. data/test/calendly/resources/data_compliance.rb +13 -0
  40. data/test/calendly/resources/event_invitees_test.rb +29 -0
  41. data/test/calendly/resources/event_types_test.rb +31 -0
  42. data/test/calendly/resources/events_test.rb +29 -0
  43. data/test/calendly/resources/organizations_test.rb +140 -0
  44. data/test/calendly/resources/scheduling_links.rb +12 -0
  45. data/test/calendly/resources/users_test.rb +79 -0
  46. data/test/calendly/resources/webhooks_test.rb +42 -0
  47. data/test/calendly_test.rb +7 -0
  48. data/test/fixtures/data_compliance/delete_invitee_data.json +1 -0
  49. data/test/fixtures/event_invitees/list.json +58 -0
  50. data/test/fixtures/event_invitees/retrieve.json +38 -0
  51. data/test/fixtures/event_types/list.json +88 -0
  52. data/test/fixtures/event_types/retrieve.json +82 -0
  53. data/test/fixtures/events/list.json +39 -0
  54. data/test/fixtures/events/retrieve.json +33 -0
  55. data/test/fixtures/organizations/invite.json +9 -0
  56. data/test/fixtures/organizations/list_invitations.json +18 -0
  57. data/test/fixtures/organizations/list_memberships.json +26 -0
  58. data/test/fixtures/organizations/remove_user.json +1 -0
  59. data/test/fixtures/organizations/retrieve_invitation.json +12 -0
  60. data/test/fixtures/organizations/retrieve_membership.json +20 -0
  61. data/test/fixtures/organizations/revoke_invitation.json +1 -0
  62. data/test/fixtures/scheduling_links/create.json +7 -0
  63. data/test/fixtures/users/retrieve.json +14 -0
  64. data/test/fixtures/webhooks/create.json +17 -0
  65. data/test/fixtures/webhooks/delete.json +1 -0
  66. data/test/fixtures/webhooks/list.json +23 -0
  67. data/test/fixtures/webhooks/retrieve.json +17 -0
  68. data/test/test_helper.rb +27 -0
  69. metadata +230 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1154b32aa1af6668b71d74fb9af0e8bd695b53c21fc49d6ed45fbee180bd5a74
4
+ data.tar.gz: bb85f5220261459ebf3fd4304fa207be57ac6b5a8226202d9ac2816064b3229e
5
+ SHA512:
6
+ metadata.gz: a4f4ccb083646d19c45599294ba2684b302960cbff32d6eac1ab8c6f02f1ce76f570b96057638b11623e4d4dcde3baa8e11dbfb905ce2fb93d3c71ac0fa353c8
7
+ data.tar.gz: 86566019597243e8e84a1a48f1540e8e8cbbc14b8641ba9a816c62ce8267e446ab7ddb596ddeb1a94464d2536059f0ee975a2d1c4b39b9eb6a269b17ded2182e
@@ -0,0 +1,34 @@
1
+ name: Tests
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - "*"
7
+ push:
8
+ branches:
9
+ - master
10
+ jobs:
11
+ tests:
12
+ runs-on: ubuntu-latest
13
+ strategy:
14
+ matrix:
15
+ ruby: ["2.4", "2.5", "2.6", "2.7", "3.0"]
16
+
17
+ steps:
18
+ - uses: actions/checkout@master
19
+
20
+ - name: Set up Ruby
21
+ uses: ruby/setup-ruby@v1
22
+ with:
23
+ ruby-version: ${{ matrix.ruby }}
24
+ bundler: default
25
+ bundler-cache: true
26
+
27
+ - name: StandardRb check
28
+ run: bundle exec standardrb
29
+
30
+ - name: Run tests
31
+ run: |
32
+ bundle exec rake test
33
+ env:
34
+ CODECOV_TOKEN: ${{secrets.CODECOV_TOKEN}}
data/.gitignore ADDED
@@ -0,0 +1,25 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
23
+ vendor
24
+ .idea/
25
+ bin/my_console
data/CHANGELOG.md ADDED
@@ -0,0 +1,32 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [0.3.3]
6
+ * Fix - Error when trying to send an invitation through the organization
7
+ * More testing = More coverage
8
+
9
+ ## [0.3.2]
10
+ * Minor fixes
11
+
12
+ ## [0.3.0]
13
+ * No runtime dependencies
14
+ * Minor fixes
15
+
16
+ ## [0.2.0]
17
+ * Support for ruby 3.0
18
+ * Minor fixes
19
+
20
+ ## [0.1.1]
21
+ * Changed required ruby version from `>= 2.3.0` to `>= 2.4.0`
22
+ * Minitest
23
+ * Minor fixes
24
+
25
+ ## 0.1.0
26
+ * Birthday!
27
+
28
+ [0.3.3]: https://github.com/araluce/calendly.rb/compare/v0.3.2...v0.3.3
29
+ [0.3.2]: https://github.com/araluce/calendly.rb/compare/v0.3.0...v0.3.2
30
+ [0.3.0]: https://github.com/araluce/calendly.rb/compare/v0.2.0...v0.3.0
31
+ [0.2.0]: https://github.com/araluce/calendly.rb/compare/v0.1.1...v0.2.0
32
+ [0.1.1]: https://github.com/araluce/calendly.rb/compare/v0.1.0...v0.1.1
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in calendly.gemspec
4
+ gemspec
5
+
6
+ gem "rake", "~> 12.0"
7
+ gem "minitest", "~> 5.0"
8
+ gem "standard"
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2021 araluce
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,159 @@
1
+ [![](https://img.shields.io/github/license/araluce/calendly.rb)](https://github.com/araluce/calendly.rb/blob/master/LICENSE.txt)
2
+ ![](https://github.com/araluce/calendly.rb/actions/workflows/ci.yml/badge.svg)
3
+ [![codecov](https://codecov.io/gh/araluce/calendly.rb/branch/master/graph/badge.svg?token=YSUU4PHM6Y)](https://codecov.io/gh/araluce/calendly.rb)
4
+ [![GitHub version](https://badge.fury.io/gh/araluce%2Fcalendly.rb.svg)](https://badge.fury.io/gh/araluce%2Fcalendly.rb)
5
+
6
+ # Calendly API Rubygem
7
+
8
+ Easy and complete rubygem for [Calendly](https://calendly.com/). Currently supports [API v2](https://calendly.stoplight.io/docs/api-docs).
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'calendlyr', github: "araluce/calendly.rb"
16
+ ```
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install calendlyr
25
+
26
+ ## Usage
27
+
28
+ To access the API, you'll need to create a `Calendly::Client` and pass in your API key. You can generate your Personal Access Token at [https://calendly.com/integrations/api_webhooks](https://calendly.com/integrations/api_webhooks)
29
+
30
+ ```ruby
31
+ client = Calendly::Client.new(api_key: ENV["CALENDLY_API_KEY"])
32
+ ```
33
+
34
+ The client then gives you access to each of the resources.
35
+
36
+ ## Resources
37
+
38
+ The gem maps as closely as we can to the Calendly API so you can easily convert API examples to gem code.
39
+
40
+ Responses are created as objects like `Calendly::Event`. Having types like `Calendly::User` is handy for understanding what type of object you're working with. They're built using OpenStruct so you can easily access data in a Ruby-ish way.
41
+
42
+ ##### Pagination
43
+
44
+ `collection` endpoints return pages of results. The result object will have a `data` key to access the results, as well as pagination like `next_page` for retrieving the next pages. You may also specify the
45
+
46
+ ```ruby
47
+ results = client.me.events(count: 5)
48
+ #=> Calendly::Collection
49
+
50
+ results.count
51
+ #=> 5
52
+
53
+ results.data
54
+ #=> [#<Calendly::Event>, #<Calendly::Event>]
55
+
56
+ results.next_page_token
57
+ #=> "KfKBetd7bS0wsFINjYky9mp8ZJXv76aL"
58
+
59
+ # Retrieve the next page
60
+ client.me.events(count: 5, next_page_token: results.next_page_token)
61
+ #=> Calendly::Collection
62
+ ```
63
+
64
+ ### Users
65
+ ```ruby
66
+ client.me
67
+ client.users.me
68
+ client.retrieve(user_uuid: "uuid")
69
+
70
+ client.organization
71
+ #=> #<Calendly::Organization>
72
+
73
+ client.me.event_types
74
+ #=> Calendly::Collection @data=[#<Calendly::EventType>, #<Calendly::EventType>]
75
+
76
+ client.me.events
77
+ #=> Calendly::Collection @data=[#<Calendly::Event>, #<Calendly::Event>]
78
+
79
+ client.me.memberships
80
+ #=> Calendly::Collection @data=[#<Calendly::MemberShip>, #<Calendly::MemberShip>]
81
+ ```
82
+
83
+ ### Event Types
84
+ ````ruby
85
+ client.event_types.list user_uri: "user_uri", organization_uri: "organization_uri"
86
+ client.event_types.retrieve event_type_uuid: "id"
87
+ ````
88
+
89
+ ### Events
90
+ ````ruby
91
+ client.events.list user_uri: "user_uri", organization_uri: "organization_uri"
92
+ client.events.retrieve event_uuid: "event_uuid"
93
+ ````
94
+
95
+ ### Event Invitees
96
+ ````ruby
97
+ client.event_invitees.list event_uuid: "event_uuid"
98
+ client.event_invitees.retrieve event_uuid: "event_uuid", invitee_uuid: "invitee_uuid"
99
+ ````
100
+
101
+ ### Scheduling Links
102
+ ````ruby
103
+ client.scheduling_links.create owner_uri: "owner_uri", max_event_count: 1, owner_type: "EventType"
104
+ ````
105
+
106
+ ### Organizations
107
+ ````ruby
108
+ # Create invitation
109
+ client.organizations.invite(organization_uuid: "organization_uuid", email: "test@test.com")
110
+ client.organization.invite(email: "test@test.com")
111
+ # List invitations
112
+ client.organizations.list_invitations(organization_uuid: "organization_uuid")
113
+ client.organization.list_invitations
114
+ # Get invitation
115
+ client.organizations.retrieve_invitation(organization_uuid: "organization_uuid", invitation_uuid: "invitation_uuid")
116
+ client.organization.invitation(invitation_uuid: "invitation_uuid")
117
+ #Revoke invitation
118
+ client.organizations.revoke_invitation(organization_uuid: "organization_uuid", invitation_uuid: "organization_uuid")
119
+ client.organization.revoke_invitation(invitation_uuid: "organization_uuid")
120
+ invitation = client.organization.invitation(invitation_uuid: "invitation_uuid")
121
+ invitation.revoke
122
+
123
+ # List memberships
124
+ client.organizations.list_memberships
125
+ client.organization.memberships
126
+ # Get membership
127
+ client.organizations.retrieve_membership(membership_uuid: "membership_uuid")
128
+ # Remove membership
129
+ client.organizations.remove_user(membership_uuid: "membership_uuid")
130
+
131
+ client.organization.events
132
+ ````
133
+
134
+ ### Webhooks
135
+ ```ruby
136
+ client.webhooks.list(organization_uri: "organization_uri", scope: "scope")
137
+ client.webhooks.create(resource_uri: "resource_uri", events: ["invitee.canceled", "invitee.created"], organization_uri: "organization_uri", scope: "scope")
138
+ client.webhooks.retrieve(webhook_uuid: "webhook_uuid")
139
+ client.webhooks.delete(webhook_uuid: "webhook_uuid")
140
+ ```
141
+
142
+ ### Data Compliance
143
+ ```ruby
144
+ client.data_compliance.delete_invitee_data
145
+ ```
146
+
147
+ ## Contributing
148
+
149
+ 1. Fork it ( https://github.com/araluce/calendly.rb/fork )
150
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
151
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
152
+ 4. Push to the branch (`git push origin my-new-feature`)
153
+ 5. Create a new Pull Request
154
+
155
+ When adding resources, add to the list of resources in lib/calendly.rb. Additionally, write a spec and add it to the list in the README.
156
+
157
+ ## Thanks
158
+
159
+ Thanks [@excid3](https://github.com/excid3) and his [Vultr.rb](https://github.com/excid3/vultr.rb) rubygem project.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task default: :test
data/bin/console ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "calendly"
5
+
6
+ client = Calendly::Client.new(api_key: ENV["CALENDLY_API_KEY"])
7
+
8
+ puts
9
+ puts "We've created a 'client' variable as a Calendly::Client using ENV['CALENDLY_API_KEY'] as the API key."
10
+ puts
11
+
12
+ require "irb"
13
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/bin/test ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle exec rake test
data/calendly.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ require "./lib/calendly/version"
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "calendlyr"
5
+ spec.version = Calendly::VERSION
6
+ spec.authors = ["araluce"]
7
+ spec.email = ["araluce11@gmail.com"]
8
+
9
+ spec.summary = "Ruby bindings for Calendly API."
10
+ spec.description = "Ruby bindings for Calendly API. Calendly APIs can be found here: https://calendly.stoplight.io/docs/api-docs/"
11
+ spec.homepage = "https://github.com/araluce/calendly.rb"
12
+ spec.license = "MIT"
13
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
14
+ spec.metadata["homepage_uri"] = spec.homepage
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "rake", "~> 12.0"
22
+ spec.add_development_dependency "minitest", "~> 5.0"
23
+ spec.add_development_dependency "standard"
24
+ spec.add_development_dependency "webmock", "~> 3.14.0"
25
+ spec.add_development_dependency "codecov"
26
+ spec.add_development_dependency "simplecov"
27
+ end
@@ -0,0 +1,57 @@
1
+ module Calendly
2
+ class Client
3
+ BASE_URL = "https://api.calendly.com"
4
+
5
+ attr_reader :api_key
6
+
7
+ def initialize(api_key:)
8
+ @api_key = api_key
9
+ raise Error, "Add an api_key to use Calendly. Calendly::Client.new(api_key: 'your_api_key')" unless api_key
10
+ end
11
+
12
+ def me
13
+ users.me
14
+ end
15
+
16
+ def organization
17
+ me.organization
18
+ end
19
+
20
+ def users
21
+ UserResource.new(self)
22
+ end
23
+
24
+ def organizations
25
+ OrganizationResource.new(self)
26
+ end
27
+
28
+ def event_types
29
+ EventTypeResource.new(self)
30
+ end
31
+
32
+ def events
33
+ EventResource.new(self)
34
+ end
35
+
36
+ def event_invitees
37
+ EventInviteeResource.new(self)
38
+ end
39
+
40
+ def scheduling_links
41
+ SchedulingLinkResource.new(self)
42
+ end
43
+
44
+ def webhooks
45
+ WebhookResource.new(self)
46
+ end
47
+
48
+ def data_compliance
49
+ DataComplianceResource.new(self)
50
+ end
51
+
52
+ # Avoid returning #<Calendly::Client @api_key="api_key" ...>
53
+ def inspect
54
+ "#<Calendly::Client>"
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,31 @@
1
+ module Calendly
2
+ class Collection
3
+ attr_reader :data, :count, :next_page, :next_page_token, :client
4
+
5
+ def self.from_response(response, key:, type:, client:)
6
+ new(
7
+ data: response[key].map { |attrs| type.new(attrs.merge(client: client)) },
8
+ count: response.dig("pagination", "count"),
9
+ next_page: response.dig("pagination", "next_page"),
10
+ client: client
11
+ )
12
+ end
13
+
14
+ def initialize(data:, count:, next_page:, client:)
15
+ @data = data
16
+ @count = count
17
+ @next_page = next_page
18
+ @next_page_token = get_params(next_page)["page_token"]&.first
19
+ @client = client
20
+ end
21
+
22
+ private
23
+
24
+ def get_params(url)
25
+ return {} unless url
26
+
27
+ uri = URI.parse(url)
28
+ CGI.parse(uri.query)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,4 @@
1
+ module Calendly
2
+ class Error < StandardError
3
+ end
4
+ end
@@ -0,0 +1,27 @@
1
+ require "ostruct"
2
+
3
+ module Calendly
4
+ class Object < OpenStruct
5
+ def initialize(attributes)
6
+ super to_ostruct(attributes.merge(uuid: extract_uuid(attributes)))
7
+ end
8
+
9
+ def to_ostruct(obj)
10
+ if obj.is_a?(Hash)
11
+ OpenStruct.new(obj.map { |key, val| [key, to_ostruct(val)] }.to_h)
12
+ elsif obj.is_a?(Array)
13
+ obj.map { |o| to_ostruct(o) }
14
+ else # Assumed to be a primitive value
15
+ obj
16
+ end
17
+ end
18
+
19
+ def extract_uuid(attrs)
20
+ attrs["uri"] ? get_slug(attrs["uri"]) : nil
21
+ end
22
+
23
+ def get_slug(path)
24
+ path.split("/").last
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,4 @@
1
+ module Calendly
2
+ class EventInvitee < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Calendly
2
+ class EventType < Object
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Calendly
2
+ class Event < Object
3
+ end
4
+ end
@@ -0,0 +1,11 @@
1
+ module Calendly
2
+ class Invitation < Object
3
+ def associated_organization
4
+ @associated_organization ||= Organization.new({"uri" => organization}.merge(client: client))
5
+ end
6
+
7
+ def revoke
8
+ associated_organization.revoke_invitation invitation_uuid: uuid
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ module Calendly
2
+ class Membership < Object
3
+ def associated_user
4
+ client.users.retrieve user_uuid: get_slug(user.uri)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,27 @@
1
+ module Calendly
2
+ class Organization < Object
3
+ def invite_user(email:)
4
+ client.organizations.invite organization_uuid: uuid, email: email
5
+ end
6
+
7
+ def list_invitations(**params)
8
+ client.organizations.list_invitations organization_uuid: uuid, **params
9
+ end
10
+
11
+ def revoke_invitation(invitation_uuid:)
12
+ client.organizations.revoke_invitation(organization_uuid: uuid, invitation_uuid: invitation_uuid)
13
+ end
14
+
15
+ def invitation(invitation_uuid:)
16
+ client.organizations.retrieve_invitation(organization_uuid: uuid, invitation_uuid: invitation_uuid)
17
+ end
18
+
19
+ def events(user_uri: nil, **params)
20
+ client.events.list user_uri: user_uri, organization_uri: uri, **params
21
+ end
22
+
23
+ def memberships(user_uri: nil, **params)
24
+ client.organizations.list_memberships user_uri: user_uri, organization_uri: uri, **params
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,4 @@
1
+ module Calendly
2
+ class SchedulingLink < Object
3
+ end
4
+ end
@@ -0,0 +1,19 @@
1
+ module Calendly
2
+ class User < Object
3
+ def organization
4
+ @organization ||= Organization.new({"uri" => current_organization}.merge(client: client))
5
+ end
6
+
7
+ def event_types(**params)
8
+ client.event_types.list user_uri: uri, organization_uri: current_organization, **params
9
+ end
10
+
11
+ def events(**params)
12
+ client.events.list user_uri: uri, organization_uri: current_organization, **params
13
+ end
14
+
15
+ def memberships(organization_uri: nil, **params)
16
+ client.organizations.list_memberships user_uri: uri, organization_uri: organization_uri, **params
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ module Calendly
2
+ class Webhook < Object
3
+ def associated_user
4
+ client.users.retrieve(user_uuid: get_slug(user))
5
+ end
6
+
7
+ def associated_organization
8
+ @associated_organization ||= Organization.new({"uri" => organization}.merge(client: client))
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,73 @@
1
+ module Calendly
2
+ class Resource
3
+ attr_reader :client
4
+
5
+ def initialize(client)
6
+ @client = client
7
+ end
8
+
9
+ private
10
+
11
+ def get_request(url, params: {})
12
+ handle_response request(url, Net::HTTP::Get, params: params)
13
+ end
14
+
15
+ def post_request(url, body:)
16
+ handle_response request(url, Net::HTTP::Post, body: body)
17
+ end
18
+
19
+ def patch_request(url, body:)
20
+ handle_response request(url, Net::HTTP::Patch, body: body)
21
+ end
22
+
23
+ def put_request(url, body)
24
+ handle_response request(url, Net::HTTP::Put, body: body)
25
+ end
26
+
27
+ def delete_request(url, params: {})
28
+ handle_response request(url, Net::HTTP::Delete, params: params)
29
+ end
30
+
31
+ def request(url, req_type, body: {}, params: {}, base_url: Client::BASE_URL)
32
+ uri = URI("#{base_url}/#{url}")
33
+
34
+ if params.any?
35
+ params = URI.decode_www_form(uri.query || "") + params.to_a
36
+ uri.query = URI.encode_www_form params
37
+ end
38
+
39
+ http = Net::HTTP.new(uri.host, uri.port)
40
+ http.use_ssl = true
41
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
42
+
43
+ request = req_type.new(uri)
44
+ request["Content-Type"] = "application/json"
45
+ request["Authorization"] = "Bearer #{client.api_key}"
46
+ request.body = body.to_json if body.any?
47
+
48
+ http.request(request)
49
+ end
50
+
51
+ def handle_response(response)
52
+ body = JSON.parse(response.read_body)
53
+ case response.code
54
+ when 400
55
+ raise Error, "#{body["title"]}. #{body["message"]}"
56
+ when 401
57
+ raise Error, "#{body["title"]}. #{body["message"]}"
58
+ when 403
59
+ raise Error, "#{body["title"]}. #{body["message"]}"
60
+ when 404
61
+ raise Error, "#{body["title"]}. #{body["message"]}"
62
+ when 429
63
+ raise Error, "#{body["title"]}. #{body["message"]}"
64
+ when 500
65
+ raise Error, "#{body["title"]}. #{body["message"]}"
66
+ when 503
67
+ raise Error, "#{body["title"]}. #{body["message"]}"
68
+ else
69
+ body
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,7 @@
1
+ module Calendly
2
+ class DataComplianceResource < Resource
3
+ def delete_invitee_data(emails:)
4
+ post_request("data_compliance/deletion/invitees", body: {emails: emails})
5
+ end
6
+ end
7
+ end