suitecrm-ruby 1.0.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.
@@ -0,0 +1,7 @@
1
+ class SuiteCRM::ApiException < StandardError
2
+ def initialize(e = nil)
3
+ puts "API error: #{e.inspect}"
4
+ super e
5
+ set_backtrace e.backtrace if e
6
+ end
7
+ end
@@ -0,0 +1,17 @@
1
+ module SuiteCRM
2
+ class Configuration
3
+ attr_accessor :client_id
4
+ attr_accessor :client_secret
5
+ attr_accessor :api_url
6
+ attr_accessor :token_url
7
+ attr_accessor :version
8
+
9
+ def initialize
10
+ @client_id = nil
11
+ @client_secret = nil
12
+ @api_url = nil
13
+ @token_url = nil
14
+ @version = "V8"
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,109 @@
1
+ require "openssl"
2
+ require "faraday"
3
+ require "json"
4
+ require "jwt"
5
+
6
+ class SuiteCRM::Connection
7
+ class << self
8
+ def post(endpoint, params)
9
+ begin
10
+ response = connection.post do |req|
11
+ req.url endpoint
12
+ req.headers["Content-Type"] = "application/json"
13
+ req.body = params.to_json
14
+ end
15
+ rescue => e
16
+ raise SuiteCRM::ApiException.new(e)
17
+ end
18
+ JSON.parse(response.body)
19
+ end
20
+
21
+ def get(endpoint, params)
22
+ begin
23
+ response = connection.get do |req|
24
+ req.url endpoint
25
+ req.headers["Content-Type"] = "application/json"
26
+ req.body = params.to_json
27
+ end
28
+ rescue => e
29
+ raise SuiteCRM::ApiException.new(e)
30
+ end
31
+ JSON.parse(response.body)
32
+ end
33
+
34
+ def patch(endpoint, params)
35
+ begin
36
+ response = connection.patch do |req|
37
+ req.url endpoint
38
+ req.headers["Content-Type"] = "application/json"
39
+ req.body = params.to_json
40
+ end
41
+ rescue => e
42
+ raise SuiteCRM::ApiException.new(e)
43
+ end
44
+ JSON.parse(response.body)
45
+ end
46
+
47
+ def delete(endpoint)
48
+ begin
49
+ response = connection.delete do |req|
50
+ req.url endpoint
51
+ req.headers["Content-Type"] = "application/json"
52
+ end
53
+ rescue => e
54
+ raise SuiteCRM::ApiException.new(e)
55
+ end
56
+ JSON.parse(response.body)
57
+ end
58
+
59
+ private
60
+
61
+ def connection
62
+ set_token
63
+ Faraday.new(url: @api_url) do |faraday|
64
+ faraday.request :url_encoded
65
+ faraday.options.timeout = 5
66
+ faraday.options.open_timeout = 5
67
+ faraday.headers["Authorization"] = @api_token
68
+ faraday.adapter Faraday.default_adapter
69
+ end
70
+ end
71
+
72
+ def set_token
73
+ if @api_token.nil?
74
+ @api_client_id = SuiteCRM.configuration.client_id
75
+ @api_client_secret = SuiteCRM.configuration.client_secret
76
+ @api_url = SuiteCRM.configuration.api_url
77
+ @token_url = SuiteCRM.configuration.token_url
78
+ @api_token = retrieve_token
79
+ end
80
+
81
+ ## Tests to see if token has expired
82
+ t = @api_token.reverse.chomp("Bearer ".reverse).reverse
83
+ decoded_token = JWT.decode t, nil, false
84
+ token_exp = decoded_token[0]["exp"]
85
+ leeway = 60
86
+ now = Time.now.to_i
87
+ token_window = token_exp - leeway
88
+ refresh_token = !(token_window > now)
89
+
90
+ if refresh_token == true
91
+ ## Makes a call to get a new token
92
+ @api_token = retrieve_token
93
+ end
94
+ end
95
+
96
+ def retrieve_token
97
+ response = Faraday.post(
98
+ @token_url,
99
+ {
100
+ grant_type: "client_credentials",
101
+ client_id: @api_client_id,
102
+ client_secret: @api_client_secret
103
+ }.to_json,
104
+ "Content-Type" => "application/json"
105
+ )
106
+ @api_token = "Bearer " + JSON.parse(response.body)["access_token"]
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,7 @@
1
+ class SuiteCRM::Meta
2
+ class << self
3
+ def get
4
+ SuiteCRM::Connection.get "meta/modules", {}
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ class SuiteCRM::Module
2
+ class << self
3
+ def get(name, id, params = {})
4
+ SuiteCRM::Connection.get "module/#{name}/#{id}", params
5
+ end
6
+
7
+ def create(params)
8
+ SuiteCRM::Connection.post "module", params
9
+ end
10
+
11
+ def update(params)
12
+ SuiteCRM::Connection.patch "module", params
13
+ end
14
+
15
+ def delete(name, id)
16
+ SuiteCRM::Connection.delete "module/#{name}/#{id}"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,7 @@
1
+ class SuiteCRM::Modules
2
+ class << self
3
+ def get(name, params = {})
4
+ SuiteCRM::Connection.get "module/#{name}", params
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ class SuiteCRM::Relationship
2
+ class << self
3
+ def get(name, id, related)
4
+ SuiteCRM::Connection.get "module/#{name}/#{id}/relationships/#{related}", {}
5
+ end
6
+
7
+ def create(name, id, params)
8
+ SuiteCRM::Connection.post "module/#{name}/#{id}/relationships", params
9
+ end
10
+
11
+ def delete(name, id, related, related_id)
12
+ SuiteCRM::Connection.delete "module/#{name}/#{id}/relationships/#{related}/#{related_id}"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ module SuiteCRM
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,38 @@
1
+ require_relative "lib/suitecrm/version"
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "suitecrm-ruby"
5
+ spec.version = SuiteCRM::VERSION
6
+ spec.authors = ["Dino Simone"]
7
+ spec.email = ["dino@simone.is"]
8
+
9
+ spec.summary = "Ruby client for SuiteCRM's V8 API"
10
+ spec.description = "Implements basic functionality needed to create and find records in SuiteCRM."
11
+ spec.homepage = "https://github.com/dinosimone/suitecrm-ruby"
12
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
13
+
14
+ # spec.metadata["homepage_uri"] = spec.homepage
15
+ # spec.metadata["source_code_uri"] = "TODO: Put your gem"s public repo URL here."
16
+ # spec.metadata["changelog_uri"] = "TODO: Put your gem"s CHANGELOG.md URL here."
17
+
18
+ # Specify which files should be added to the gem when it is released.
19
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
20
+ spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
21
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
22
+ end
23
+ spec.bindir = "exe"
24
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
+ spec.require_paths = ["lib"]
26
+
27
+ spec.add_runtime_dependency "faraday", "~> 1.5", ">= 1.5.1"
28
+ spec.add_runtime_dependency "mime-types", "~> 3.3", ">= 3.3.1"
29
+ spec.add_runtime_dependency "jwt", "~> 2.2", ">= 2.2.3"
30
+ spec.add_runtime_dependency "openssl", "~> 2.2"
31
+ spec.add_runtime_dependency "json", "~> 2.5", ">= 2.5.1"
32
+
33
+ spec.add_development_dependency "rake", "~> 13.0", ">= 13.0.6"
34
+ spec.add_development_dependency "rspec", "~> 3.10"
35
+ spec.add_development_dependency "vcr", "~> 6.0"
36
+ spec.add_development_dependency "webmock", "~> 3.13"
37
+ spec.add_development_dependency "factory_bot", "~> 4.8", ">= 4.8.2"
38
+ end
metadata ADDED
@@ -0,0 +1,243 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: suitecrm-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Dino Simone
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-07-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.5'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.5.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.5'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.5.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: mime-types
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '3.3'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 3.3.1
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '3.3'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 3.3.1
53
+ - !ruby/object:Gem::Dependency
54
+ name: jwt
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '2.2'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 2.2.3
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '2.2'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 2.2.3
73
+ - !ruby/object:Gem::Dependency
74
+ name: openssl
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '2.2'
80
+ type: :runtime
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: '2.2'
87
+ - !ruby/object:Gem::Dependency
88
+ name: json
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '2.5'
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 2.5.1
97
+ type: :runtime
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.5'
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: 2.5.1
107
+ - !ruby/object:Gem::Dependency
108
+ name: rake
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '13.0'
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 13.0.6
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '13.0'
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: 13.0.6
127
+ - !ruby/object:Gem::Dependency
128
+ name: rspec
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '3.10'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: '3.10'
141
+ - !ruby/object:Gem::Dependency
142
+ name: vcr
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: '6.0'
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - "~>"
153
+ - !ruby/object:Gem::Version
154
+ version: '6.0'
155
+ - !ruby/object:Gem::Dependency
156
+ name: webmock
157
+ requirement: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - "~>"
160
+ - !ruby/object:Gem::Version
161
+ version: '3.13'
162
+ type: :development
163
+ prerelease: false
164
+ version_requirements: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - "~>"
167
+ - !ruby/object:Gem::Version
168
+ version: '3.13'
169
+ - !ruby/object:Gem::Dependency
170
+ name: factory_bot
171
+ requirement: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - "~>"
174
+ - !ruby/object:Gem::Version
175
+ version: '4.8'
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: 4.8.2
179
+ type: :development
180
+ prerelease: false
181
+ version_requirements: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - "~>"
184
+ - !ruby/object:Gem::Version
185
+ version: '4.8'
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: 4.8.2
189
+ description: Implements basic functionality needed to create and find records in SuiteCRM.
190
+ email:
191
+ - dino@simone.is
192
+ executables: []
193
+ extensions: []
194
+ extra_rdoc_files: []
195
+ files:
196
+ - ".gitignore"
197
+ - Gemfile
198
+ - Gemfile.lock
199
+ - README.md
200
+ - Rakefile
201
+ - bin/console
202
+ - bin/setup
203
+ - fixtures/vcr_cassettes/adds_relationship_to_module.yml
204
+ - fixtures/vcr_cassettes/creates_a_module.yml
205
+ - fixtures/vcr_cassettes/deletes_a_module.yml
206
+ - fixtures/vcr_cassettes/deletes_module_relationship.yml
207
+ - fixtures/vcr_cassettes/get_all_modules_of_type.yml
208
+ - fixtures/vcr_cassettes/gets_a_specific_module.yml
209
+ - fixtures/vcr_cassettes/gets_relationships_for_a_module.yml
210
+ - fixtures/vcr_cassettes/updates_a_module.yml
211
+ - lib/suitecrm-ruby.rb
212
+ - lib/suitecrm/api_exception.rb
213
+ - lib/suitecrm/configuration.rb
214
+ - lib/suitecrm/connection.rb
215
+ - lib/suitecrm/meta.rb
216
+ - lib/suitecrm/module.rb
217
+ - lib/suitecrm/modules.rb
218
+ - lib/suitecrm/relationship.rb
219
+ - lib/suitecrm/version.rb
220
+ - suitecrm-ruby.gemspec
221
+ homepage: https://github.com/dinosimone/suitecrm-ruby
222
+ licenses: []
223
+ metadata: {}
224
+ post_install_message:
225
+ rdoc_options: []
226
+ require_paths:
227
+ - lib
228
+ required_ruby_version: !ruby/object:Gem::Requirement
229
+ requirements:
230
+ - - ">="
231
+ - !ruby/object:Gem::Version
232
+ version: 2.3.0
233
+ required_rubygems_version: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ requirements: []
239
+ rubygems_version: 3.0.3
240
+ signing_key:
241
+ specification_version: 4
242
+ summary: Ruby client for SuiteCRM's V8 API
243
+ test_files: []