zoho_hub 0.1.29 → 0.2.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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -2
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +4 -0
  5. data/.ruby-version +1 -1
  6. data/.travis.yml +5 -2
  7. data/README.md +91 -7
  8. data/bin/console +5 -6
  9. data/bin/read +44 -0
  10. data/bin/setup +0 -2
  11. data/bin/zoho_hub +62 -0
  12. data/cache/.git_keep +0 -0
  13. data/lib/zoho_hub/auth.rb +37 -47
  14. data/lib/zoho_hub/base_record.rb +122 -0
  15. data/lib/zoho_hub/configuration.rb +3 -4
  16. data/lib/zoho_hub/connection.rb +10 -17
  17. data/lib/zoho_hub/{records → deprecated_and_only_for_reference_records}/account.rb +0 -0
  18. data/lib/zoho_hub/{records → deprecated_and_only_for_reference_records}/campaign.rb +0 -0
  19. data/lib/zoho_hub/{records → deprecated_and_only_for_reference_records}/contact.rb +2 -4
  20. data/lib/zoho_hub/deprecated_and_only_for_reference_records/funder.rb +9 -0
  21. data/lib/zoho_hub/{records → deprecated_and_only_for_reference_records}/potential.rb +1 -14
  22. data/lib/zoho_hub/deprecated_and_only_for_reference_records/product.rb +9 -0
  23. data/lib/zoho_hub/deprecated_and_only_for_reference_records/quote.rb +34 -0
  24. data/lib/zoho_hub/errors.rb +0 -3
  25. data/lib/zoho_hub/module_builder.rb +61 -0
  26. data/lib/zoho_hub/oauth_callback_server.rb +26 -0
  27. data/lib/zoho_hub/response.rb +1 -7
  28. data/lib/zoho_hub/settings/field.rb +33 -0
  29. data/lib/zoho_hub/settings/module.rb +49 -0
  30. data/lib/zoho_hub/string_utils.rb +34 -0
  31. data/lib/zoho_hub/version.rb +1 -1
  32. data/lib/zoho_hub/views/variables.erb +72 -0
  33. data/lib/zoho_hub/with_attributes.rb +74 -0
  34. data/lib/zoho_hub/with_connection.rb +36 -0
  35. data/lib/zoho_hub.rb +20 -21
  36. data/zoho_hub.gemspec +21 -17
  37. metadata +104 -80
  38. data/lib/zoho_hub/records/adverse_criteria.rb +0 -43
  39. data/lib/zoho_hub/records/attachment.rb +0 -104
  40. data/lib/zoho_hub/records/base_record.rb +0 -189
  41. data/lib/zoho_hub/records/credit_score.rb +0 -36
  42. data/lib/zoho_hub/records/product.rb +0 -35
  43. data/lib/zoho_hub/records/quote.rb +0 -42
  44. data/lib/zoho_hub/records/vendor.rb +0 -34
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8c0b66c76f28dcdef377d2aa2b8747ba5dc5b78864278bf7e2c33067233abb49
4
- data.tar.gz: 6521445a8b48fea2334bbb0e58e722cbed45576ffbd2515a26d2ac3e7bfc7c84
3
+ metadata.gz: bb0b0886637feb21a98d0a73f40cb3571a0ec2507dfd45b7eec9fd348b365276
4
+ data.tar.gz: 70638084911ec64dc02095d4cf085453ca13ba4ea28a3c983c79e235a1a5911e
5
5
  SHA512:
6
- metadata.gz: d9840d0c83c4f18591eababff051b1e42f1dbdfffb5641ac2e075bade45736d7af6d3f43f6153ca3fbf4033ee4a2fdfb180d81a6675e112520250355da881fa0
7
- data.tar.gz: 57ca1b772ed065f8d3f7377ba3be41905616ad4c812b9e6cc5dc6b57ae3a90aad6bfec417e6b24d373ec1b0e6e099258ad9187cb8ce731cb4e065a2cb8d44dc3
6
+ metadata.gz: c5fc255597ced5c966a59b0db9de72ab6a67defca6c1a62e5e168f37bc70326f2c1cccd5cf3ab44369a94372277ca42c671965e50d742b315b26126882f1af72
7
+ data.tar.gz: 89fbe288d53b9ebf9c76f8229981deffcacc9d6fe484b6187f654430eb097c7e1b57719dafcc953cafbfafeec7f1d765c87794697b3d283b168cbd2c9f35ff03
data/.gitignore CHANGED
@@ -7,9 +7,8 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ /cache/*
10
11
  Gemfile.lock
11
- /cache/
12
- .DS_Store
13
12
 
14
13
  # rspec failure tracking
15
14
  .rspec_status
data/.rspec CHANGED
@@ -1,3 +1,4 @@
1
1
  --format documentation
2
2
  --color
3
3
  --require spec_helper
4
+ --order rand
data/.rubocop.yml CHANGED
@@ -7,6 +7,10 @@ AllCops:
7
7
  Style/Documentation:
8
8
  Enabled: false
9
9
 
10
+ # Safe navigation is not available in older ruby versions
11
+ Style/SafeNavigation:
12
+ Enabled: false
13
+
10
14
  # A good line length is 100 chars
11
15
  Metrics/LineLength:
12
16
  Max: 100
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.7.2
1
+ 2.5.3
data/.travis.yml CHANGED
@@ -1,5 +1,8 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.5.0
5
- before_install: gem install bundler -v 2.0.1
4
+ - 2.1.10
5
+ - 2.2.10
6
+ - 2.3.7
7
+ - 2.4.4
8
+ - 2.5.3
data/README.md CHANGED
@@ -1,6 +1,16 @@
1
1
  # ZohoHub
2
2
 
3
- https://www.zoho.com/crm/help/api-diff/
3
+ [![Build Status](https://travis-ci.com/rikas/zoho_hub.svg?branch=master)](https://travis-ci.com/rikas/zoho_hub)
4
+ [![Gem Version](https://badge.fury.io/rb/zoho_hub.svg)](https://badge.fury.io/rb/zoho_hub)
5
+
6
+ Simple wrapper around Zoho CRM version2, using [OAuth 2.0 protocol](https://www.zoho.com/crm/help/api/v2/#OAuth2_0)
7
+ for authentication.
8
+
9
+ This gem reads your Module configuration and builds the corresponding classes for you, using some
10
+ reflection mechanisms. You should then be able to use simple classes with an API close to
11
+ ActiveRecord, to do CRUD operations.
12
+
13
+ **NOTE: this gem is WIP, please try to use it and open an issue if you run into limitations / problems**
4
14
 
5
15
  ## Installation
6
16
 
@@ -18,9 +28,86 @@ Or install it yourself as:
18
28
 
19
29
  $ gem install zoho_hub
20
30
 
21
- ## Usage
31
+ ## Setup process
32
+
33
+ ### 1. Register your application
34
+
35
+ If you want to access your Zoho CRM account from your application you first need to create your
36
+ application as described here: https://www.zoho.com/crm/help/api/v2/#oauth-request.
37
+
38
+ **TODO TODO - explain "Authorized redirect URIs"**
39
+
40
+ This will give you a **Client ID** and a **secret**, that you'll use in the next step.
41
+
42
+ ### 2. Configure ZohoHub with your credentials
43
+
44
+ You need to have a configuration block like the one below (in rails add a `zoho_hub.rb` in your
45
+ `config/initializers` dir):
46
+
47
+ ```ruby
48
+ ZohoHub.configure do |config|
49
+ config.client_id = 'YOUR_ZOHO_CLIENT_ID' # obtained in 1.
50
+ config.secret = 'YOUR_ZOHO_SECRET' # obtained in 1.
51
+ config.redirect_uri = 'YOUR_ZOHO_OAUTH_REDIRECT_URL'
52
+ # config.debug = true # this will be VERY verbose, but helps to identify bugs / problems
53
+ end
54
+ ```
55
+
56
+ **Note:** if you don't know what the `redirect_url` is then **TODO TODO TODO TODO TODO**
57
+
58
+ ### 2. Authorization request
59
+
60
+ In order to access data in Zoho CRM you need to authorize ZohoHub to access your account. To do so
61
+ you have to request a specific URL with the right **scope** and **access_type**.
62
+
63
+ To get the right URL you can use this simple line of code:
64
+
65
+ ```ruby
66
+ ZohoHub::Auth.auth_url
67
+ # => "https://accounts.zoho.eu/oauth/v2/auth?access_type=offline&client_id=&redirect_uri=&response_type=code&scope=ZohoCRM.modules.custom.all,ZohoCRM.settings.all,ZohoCRM.modules.contacts.all,ZohoCRM.modules.all"
68
+ ```
69
+
70
+ If you request this generated URL you should see a screen like this one, where you have to click on "Accept":
71
+
72
+ ![](https://duaw26jehqd4r.cloudfront.net/items/1h1i3C1N0k0i02092F0S/Screen%20Shot%202018-11-25%20at%2019.18.38.png)
73
+
74
+ You can change the default scope (what data can be accessed by your application). This is the list
75
+ provided as the default scope:
76
+
77
+ ```
78
+ ZohoCRM.modules.custom.all
79
+ ZohoCRM.settings.all
80
+ ZohoCRM.modules.contacts.all
81
+ ZohoCRM.modules.all
82
+ ```
83
+
84
+ To get the URL for a different scope you can provide a `scope` argument:
85
+
86
+ ```ruby
87
+ ZohoHub::Auth.auth_url(scope: ['ZohoCRM.modules.custom.all', 'ZohoCRM.modules.all'])
88
+ # => "https://accounts.zoho.eu/oauth/v2/auth?access_type=offline&client_id=&redirect_uri=&response_type=code&scope=ZohoCRM.modules.custom.all,ZohoCRM.modules.all"
89
+ ```
90
+
91
+ #### 2.1 Offline access
92
+
93
+ By design the access tokens returned by the OAuth flow expire after a period of time (1 hour by
94
+ default), as a safety mechanism. This means that any application that wants to work with a user's
95
+ data needs the user to have recently gone through the OAuth flow, aka be online.
96
+
97
+ When you request offline access the Zoho API returns a refresh token. Refresh tokens give your
98
+ application the ability to request data on behalf of the user when the user is not present and in
99
+ front of your application.
100
+
101
+ **By default `ZohoHub::Auth.auth_url` will request offline access**
102
+
103
+ You can force "online" access by using `#auth_url` with a `access_type` argument:
104
+
105
+ ```ruby
106
+ ZohoHub::Auth.auth_url(access_type: 'online')
107
+ # => "https://accounts.zoho.eu/oauth/v2/auth?access_type=online&client_id=&redirect_uri=&response_type=code&scope=ZohoCRM.modules.custom.all,ZohoCRM.settings.all,ZohoCRM.modules.contacts.all,ZohoCRM.modules.all"
108
+ ```
22
109
 
23
- TODO: Write usage instructions here
110
+ ## 3. Generate Access Token
24
111
 
25
112
  ## Development
26
113
 
@@ -28,10 +115,7 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
28
115
  the tests. You can also run `bin/console` for an interactive prompt that will allow you to
29
116
  experiment.
30
117
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new
32
- version, update the version number in `version.rb`, and then run `bundle exec rake release`, which
33
- will create a git tag for the version, push git commits and tags, and push the `.gem` file
34
- to [rubygems.org](https://rubygems.org).
118
+ To install this gem onto your local machine, run `bundle exec rake install`.
35
119
 
36
120
  ## Contributing
37
121
 
data/bin/console CHANGED
@@ -8,16 +8,15 @@ require 'dotenv'
8
8
  Dotenv.load
9
9
 
10
10
  ZohoHub.configure do |config|
11
- config.client_id = ENV['ZOHO_CLIENT_ID']
12
- config.secret = ENV['ZOHO_SECRET']
13
- config.redirect_uri = ENV['ZOHO_OAUTH_REDIRECT_URL']
14
- config.debug = true
11
+ config.client_id = ENV['ZOHO_CLIENT_ID']
12
+ config.secret = ENV['ZOHO_SECRET']
13
+ config.debug = ENV['ZOHO_DEBUG'] || false
15
14
  end
16
15
 
16
+ # We assume that we already have a refresh token, to make things easier here.
17
+ puts 'Refreshing token...'
17
18
  token_params = ZohoHub::Auth.refresh_token(ENV['ZOHO_REFRESH_TOKEN'])
18
19
  ZohoHub.setup_connection(token_params)
19
20
 
20
- self.send(:include, ZohoHub)
21
-
22
21
  require 'pry'
23
22
  Pry.start
data/bin/read ADDED
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'zoho_hub'
6
+ require 'zoho_hub/settings/module'
7
+ require 'zoho_hub/records/base_record'
8
+
9
+ require 'dotenv'
10
+ Dotenv.load
11
+
12
+ ZohoHub.configure do |config|
13
+ config.client_id = ENV['ZOHO_CLIENT_ID']
14
+ config.secret = ENV['ZOHO_SECRET']
15
+ config.redirect_uri = ENV['ZOHO_OAUTH_REDIRECT_URL']
16
+ end
17
+
18
+ token_params = ZohoHub::Auth.refresh_token(ENV['ZOHO_REFRESH_TOKEN'])
19
+ ZohoHub.setup_connection(token_params)
20
+
21
+ puts "Reading modules for client ID: #{ENV['ZOHO_CLIENT_ID']}..."
22
+
23
+ modules_hashes = ZohoHub::Settings::Module.all_json
24
+
25
+ puts "Found #{modules_hashes.size} modules"
26
+
27
+ modules_hashes.each do |hash|
28
+ puts "- Writing configuration for #{hash[:plural_label]}"
29
+
30
+ file_name = File.join(ZohoHub.root, 'cache', 'modules', "#{hash[:api_name]}.json")
31
+
32
+ File.open(file_name, 'w') do |file|
33
+ file.write(JSON.pretty_generate(hash))
34
+ end
35
+
36
+ next unless hash[:api_supported]
37
+
38
+ fields_array = ZohoHub::Settings::Field.all_json_for(hash[:api_name])
39
+ file_name = File.join(ZohoHub.root, 'cache', 'fields', "#{hash[:api_name]}.json")
40
+
41
+ File.open(file_name, 'w') do |file|
42
+ file.write(JSON.pretty_generate(fields_array))
43
+ end
44
+ end
data/bin/setup CHANGED
@@ -4,5 +4,3 @@ IFS=$'\n\t'
4
4
  set -vx
5
5
 
6
6
  bundle install
7
-
8
- # Do any other automated setup that you need to do here
data/bin/zoho_hub ADDED
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+
6
+ require 'zoho_hub'
7
+ require 'zoho_hub/auth'
8
+ require 'zoho_hub/oauth_callback_server'
9
+
10
+ require 'launchy'
11
+ require 'optparse'
12
+
13
+ default_port = ZohoHub::OauthCallbackServer.settings.port
14
+
15
+ options = {}
16
+ parser = OptionParser.new do |op|
17
+ op.banner = 'Usage: zoho_hub -c CLIENT_ID -s SECRET [options]'
18
+
19
+ op.on('-c', '--client-id=client_id', 'The Zoho client ID') do |client|
20
+ options[:client_id] = client
21
+ end
22
+
23
+ op.on('-s', '--secret=secret', 'The Zoho secret') do |secret|
24
+ options[:secret] = secret
25
+ end
26
+
27
+ op.on('-p', '--port=port', "The port for your callback (default #{default_port})") do |port|
28
+ options[:port] = port
29
+ end
30
+
31
+ op.on_tail('--version', 'Show version') do
32
+ puts "ZohoHub #{ZohoHub::VERSION}"
33
+ exit
34
+ end
35
+ end
36
+
37
+ parser.parse!
38
+
39
+ abort(parser.help) if options[:client_id].nil? || options[:secret].nil?
40
+
41
+ callback_path = ZohoHub::OauthCallbackServer::CALLBACK_PATH
42
+
43
+ ZohoHub::OauthCallbackServer.set(:port, options[:port]) if options[:port]
44
+
45
+ bind_port = ZohoHub::OauthCallbackServer.settings.port
46
+ bind_address = ZohoHub::OauthCallbackServer.settings.bind
47
+
48
+ callback_url = "http://#{bind_address}:#{bind_port}/#{callback_path}"
49
+
50
+ puts "Callback URL: #{callback_url}"
51
+
52
+ ZohoHub.configure do |config|
53
+ config.client_id = options[:client_id]
54
+ config.secret = options[:secret]
55
+ config.redirect_uri = callback_url
56
+ config.debug = true
57
+ end
58
+
59
+ # Open the URL in the browser
60
+ url = ZohoHub::Auth.auth_url
61
+ puts "REQUESTING: #{url}"
62
+ Launchy.open(url)
data/cache/.git_keep ADDED
File without changes
data/lib/zoho_hub/auth.rb CHANGED
@@ -6,11 +6,12 @@ require 'faraday_middleware'
6
6
  require 'addressable'
7
7
 
8
8
  module ZohoHub
9
+ # Class that takes care of authentication using Oauth2 workflow as described here:
10
+ # https://www.zoho.com/crm/help/api/v2/#oauth-request.
9
11
  class Auth
10
12
  extend Forwardable
11
13
 
12
14
  TOKEN_PATH = '/oauth/v2/token'
13
- REVOKE_TOKEN_PATH = '/oauth/v2/token/revoke'
14
15
  AUTH_PATH = '/oauth/v2/auth'
15
16
 
16
17
  DEFAULT_SCOPES = %w[
@@ -22,22 +23,30 @@ module ZohoHub
22
23
 
23
24
  DEFAULT_ACCESS_TYPE = 'offline'
24
25
 
25
- def_delegators :@configuration, :redirect_uri, :client_id, :secret
26
+ def_delegators :@configuration, :redirect_uri, :client_id, :secret, :api_domain
26
27
 
27
- def initialize(access_type: nil, scopes: nil)
28
+ def initialize(access_type: DEFAULT_ACCESS_TYPE, scopes: DEFAULT_SCOPES)
28
29
  @configuration = ZohoHub.configuration
29
- @access_type = access_type || ZohoHub.configuration.access_type
30
- @scopes = scopes || DEFAULT_SCOPES
30
+ @access_type = access_type
31
+ @scopes = scopes
31
32
  end
32
33
 
33
- def self.auth_url
34
- new.auth_url
34
+ def token_full_uri
35
+ Addressable::URI.join(api_domain, TOKEN_PATH)
36
+ end
37
+
38
+ def auth_full_uri
39
+ Addressable::URI.join(api_domain, AUTH_PATH)
40
+ end
41
+
42
+ def self.auth_url(access_type: DEFAULT_ACCESS_TYPE, scopes: DEFAULT_SCOPES)
43
+ new(access_type: access_type, scopes: scopes).auth_url
35
44
  end
36
45
 
37
46
  def auth_url
38
47
  uri = auth_full_uri
39
48
 
40
- query = {
49
+ uri.query_values = {
41
50
  client_id: client_id,
42
51
  scope: @scopes.join(','),
43
52
  access_type: @access_type,
@@ -45,27 +54,21 @@ module ZohoHub
45
54
  response_type: 'code'
46
55
  }
47
56
 
48
- # The consent page must be presented otherwise we don't get the refresh token back.
49
- query[:prompt] = 'consent' if @access_type == DEFAULT_ACCESS_TYPE
50
-
51
- uri.query_values = query
52
-
53
57
  Addressable::URI.unencode(uri.to_s)
54
58
  end
55
59
 
56
- def auth_full_uri
57
- Addressable::URI.join(@configuration.base_url, AUTH_PATH)
58
- end
59
-
60
- def self.refresh_token(refresh_token)
61
- new.refresh_token(refresh_token)
62
- end
60
+ def token_url(grant_token)
61
+ uri = token_full_uri
63
62
 
64
- def refresh_token(refresh_token)
65
- result = Faraday.post(refresh_url(refresh_token))
63
+ uri.query_values = {
64
+ client_id: client_id,
65
+ client_secret: secret,
66
+ code: grant_token,
67
+ redirect_uri: redirect_uri,
68
+ grant_type: 'authorization_code'
69
+ }
66
70
 
67
- json = parse(result.body)
68
- json.merge(refresh_token: refresh_token)
71
+ Addressable::URI.unencode(uri.to_s)
69
72
  end
70
73
 
71
74
  def refresh_url(refresh_token)
@@ -81,16 +84,19 @@ module ZohoHub
81
84
  Addressable::URI.unencode(uri.to_s)
82
85
  end
83
86
 
84
- def parse(body)
85
- MultiJson.load(body, symbolize_keys: true)
87
+ def self.refresh_token(refresh_token)
88
+ new.refresh_token(refresh_token)
86
89
  end
87
90
 
88
- def token_full_uri
89
- Addressable::URI.join(@configuration.base_url, TOKEN_PATH)
91
+ def refresh_token(refresh_token)
92
+ result = Faraday.post(refresh_url(refresh_token))
93
+
94
+ json = parse(result.body)
95
+ json.merge(refresh_token: refresh_token)
90
96
  end
91
97
 
92
98
  def revoke_refresh_token(refresh_token)
93
- uri = revoke_token_full_uri
99
+ uri = token_full_uri
94
100
 
95
101
  uri.query_values = { token: refresh_token }
96
102
 
@@ -101,10 +107,6 @@ module ZohoHub
101
107
  parse(result.body)
102
108
  end
103
109
 
104
- def revoke_token_full_uri
105
- Addressable::URI.join(@configuration.base_url, REVOKE_TOKEN_PATH)
106
- end
107
-
108
110
  def self.get_token(grant_token)
109
111
  new.get_token(grant_token)
110
112
  end
@@ -115,20 +117,8 @@ module ZohoHub
115
117
  parse(result.body)
116
118
  end
117
119
 
118
- def token_url(grant_token)
119
- uri = token_full_uri
120
-
121
- query = {
122
- client_id: client_id,
123
- client_secret: secret,
124
- code: grant_token,
125
- redirect_uri: redirect_uri,
126
- grant_type: 'authorization_code'
127
- }
128
-
129
- uri.query_values = query
130
-
131
- Addressable::URI.unencode(uri.to_s)
120
+ def parse(body)
121
+ MultiJson.load(body, symbolize_keys: true)
132
122
  end
133
123
  end
134
124
  end
@@ -0,0 +1,122 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'zoho_hub/response'
4
+ require 'zoho_hub/with_connection'
5
+ require 'zoho_hub/with_attributes'
6
+ require 'zoho_hub/string_utils'
7
+
8
+ module ZohoHub
9
+ class BaseRecord
10
+ include WithConnection
11
+ include WithAttributes
12
+
13
+ # Default nnumber of records when fetching all.
14
+ DEFAULT_RECORDS_PER_PAGE = 200
15
+
16
+ # Default page number when fetching all.
17
+ DEFAULT_PAGE = 1
18
+
19
+ # Minimum number of records to fetch when fetching all.
20
+ MIN_RECORDS = 2
21
+
22
+ class << self
23
+ def request_path(name = nil)
24
+ @request_path = name if name
25
+ @request_path ||= StringUtils.pluralize(StringUtils.demodulize(to_s))
26
+ @request_path
27
+ end
28
+
29
+ def find(id)
30
+ body = get(File.join(request_path, id.to_s))
31
+ response = build_response(body)
32
+
33
+ if response.empty?
34
+ raise RecordNotFound, "Couldn't find #{request_path.singularize} with 'id'=#{id}"
35
+ end
36
+
37
+ new(response.data)
38
+ end
39
+
40
+ def where(params)
41
+ path = File.join(request_path, 'search')
42
+
43
+ response = get(path, params)
44
+ data = response[:data]
45
+
46
+ data.map { |info| new(info) }
47
+ end
48
+
49
+ def find_by(params)
50
+ records = where(params)
51
+ records.first
52
+ end
53
+
54
+ def create(params)
55
+ new(params).save
56
+ end
57
+
58
+ def all(options = {})
59
+ options[:page] ||= DEFAULT_PAGE
60
+ options[:per_page] ||= DEFAULT_RECORDS_PER_PAGE
61
+ options[:per_page] = MIN_RECORDS if options[:per_page] < MIN_RECORDS
62
+
63
+ body = get(request_path, options)
64
+ response = build_response(body)
65
+
66
+ data = response.nil? ? [] : response.data
67
+
68
+ data.map { |json| new(json) }
69
+ end
70
+
71
+ def exists?(id)
72
+ !find(id).nil?
73
+ rescue RecordNotFound
74
+ false
75
+ end
76
+
77
+ alias exist? exists?
78
+
79
+ def build_response(body)
80
+ response = Response.new(body)
81
+
82
+ raise InvalidTokenError, response.msg if response.invalid_token?
83
+ raise RecordInvalid, response.msg if response.invalid_data?
84
+
85
+ response
86
+ end
87
+ end
88
+
89
+ def save
90
+ body = if new_record? # create new record
91
+ post(self.class.request_path, data: [to_params])
92
+ else # update existing record
93
+ path = File.join(self.class.request_path, id)
94
+ put(path, data: [to_params])
95
+ end
96
+
97
+ response = build_response(body)
98
+
99
+ response.data.dig(:details, :id)
100
+ end
101
+
102
+ def new_record?
103
+ !id
104
+ end
105
+
106
+ def to_params
107
+ params = {}
108
+
109
+ attributes.each do |attr|
110
+ key = attr_to_zoho_key(attr)
111
+
112
+ params[key] = send(attr)
113
+ end
114
+
115
+ params
116
+ end
117
+
118
+ def build_response(body)
119
+ self.class.build_response(body)
120
+ end
121
+ end
122
+ end
@@ -2,17 +2,16 @@
2
2
 
3
3
  module ZohoHub
4
4
  class Configuration
5
- attr_accessor :client_id, :secret, :redirect_uri, :base_url, :access_type
5
+ attr_accessor :client_id, :secret, :redirect_uri, :api_domain
6
6
  attr_writer :debug
7
7
 
8
- DEFAULT_BASE_URL = 'https://accounts.zoho.eu'
8
+ DEFAULT_API_DOMAIN = 'https://accounts.zoho.eu'
9
9
 
10
10
  def initialize
11
11
  @client_id = ''
12
12
  @secret = ''
13
13
  @redirect_uri = ''
14
- @base_url = DEFAULT_BASE_URL
15
- @access_type = Auth::DEFAULT_ACCESS_TYPE
14
+ @api_domain = DEFAULT_API_DOMAIN
16
15
  end
17
16
 
18
17
  def debug?
@@ -22,43 +22,37 @@ module ZohoHub
22
22
  def initialize(access_token:, api_domain: DEFAULT_DOMAIN, expires_in: 3600, refresh_token: nil)
23
23
  @access_token = access_token
24
24
  @expires_in = expires_in
25
- @api_domain = api_domain || DEFAULT_DOMAIN
25
+ @api_domain = api_domain
26
26
  @refresh_token ||= refresh_token # do not overwrite if it's already set
27
27
  end
28
28
 
29
- def get(path, params = {}, &block)
29
+ def get(path, params = {})
30
30
  log "GET #{path} with #{params}"
31
31
 
32
- response = with_refresh do
33
- adapter(&block).get(path, params)
34
- end
32
+ response = with_refresh { adapter.get(path, params) }
35
33
  response.body
36
34
  end
37
35
 
38
- def post(path, params = {}, &block)
36
+ def post(path, params = {})
39
37
  log "POST #{path} with #{params}"
40
38
 
41
- response = with_refresh do
42
- adapter(&block).post(path, params)
43
- end
39
+ response = with_refresh { adapter.post(path, params) }
44
40
  response.body
45
41
  end
46
42
 
47
- def put(path, params = {}, &block)
43
+ def put(path, params = {})
48
44
  log "PUT #{path} with #{params}"
49
45
 
50
- response = with_refresh do
51
- adapter(&block).put(path, params)
52
- end
46
+ response = with_refresh { adapter.put(path, params) }
53
47
  response.body
54
48
  end
55
49
 
56
50
  def access_token?
57
- @access_token.present?
51
+ @access_token
58
52
  end
59
53
 
60
54
  def refresh_token?
61
- @refresh_token.present?
55
+ @refresh_token
62
56
  end
63
57
 
64
58
  def log(text)
@@ -79,7 +73,7 @@ module ZohoHub
79
73
  log "Refreshing outdated token... #{@access_token}"
80
74
  params = ZohoHub::Auth.refresh_token(@refresh_token)
81
75
 
82
- @on_refresh_cb.call(params) if @on_refresh_cb.present?
76
+ @on_refresh_cb.call(params) if @on_refresh_cb
83
77
 
84
78
  @access_token = params[:access_token]
85
79
 
@@ -104,7 +98,6 @@ module ZohoHub
104
98
  Faraday.new(url: base_url) do |conn|
105
99
  conn.headers = authorization_header if access_token?
106
100
  conn.use FaradayMiddleware::ParseJson
107
- yield conn if block_given?
108
101
  conn.response :json, parser_options: { symbolize_names: true }
109
102
  conn.response :logger if ZohoHub.configuration.debug?
110
103
  conn.adapter Faraday.default_adapter