suitecrm-ruby 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []