mautic_api 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.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +32 -0
  4. data/lib/mautic_api.rb +41 -0
  5. data/lib/mautic_api/api/api.rb +248 -0
  6. data/lib/mautic_api/api/companies.rb +11 -0
  7. data/lib/mautic_api/api/contacts.rb +96 -0
  8. data/lib/mautic_api/api/segments.rb +33 -0
  9. data/lib/mautic_api/auth/abstract_auth.rb +258 -0
  10. data/lib/mautic_api/auth/api_auth.rb +57 -0
  11. data/lib/mautic_api/auth/auth.rb +6 -0
  12. data/lib/mautic_api/auth/auth_interface.rb +29 -0
  13. data/lib/mautic_api/auth/oauth2.rb +62 -0
  14. data/lib/mautic_api/engine.rb +10 -0
  15. data/lib/mautic_api/exception/context_not_found_exception.rb +14 -0
  16. data/lib/mautic_api/version.rb +3 -0
  17. data/lib/tasks/mautic_api_tasks.rake +4 -0
  18. data/test/dummy/README.rdoc +28 -0
  19. data/test/dummy/Rakefile +6 -0
  20. data/test/dummy/app/assets/javascripts/application.js +13 -0
  21. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  22. data/test/dummy/app/controllers/application_controller.rb +5 -0
  23. data/test/dummy/app/helpers/application_helper.rb +2 -0
  24. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  25. data/test/dummy/bin/bundle +3 -0
  26. data/test/dummy/bin/rails +4 -0
  27. data/test/dummy/bin/rake +4 -0
  28. data/test/dummy/config.ru +4 -0
  29. data/test/dummy/config/application.rb +23 -0
  30. data/test/dummy/config/boot.rb +5 -0
  31. data/test/dummy/config/database.yml +25 -0
  32. data/test/dummy/config/environment.rb +5 -0
  33. data/test/dummy/config/environments/development.rb +37 -0
  34. data/test/dummy/config/environments/production.rb +78 -0
  35. data/test/dummy/config/environments/test.rb +39 -0
  36. data/test/dummy/config/initializers/assets.rb +8 -0
  37. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  38. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  39. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  40. data/test/dummy/config/initializers/inflections.rb +16 -0
  41. data/test/dummy/config/initializers/mime_types.rb +4 -0
  42. data/test/dummy/config/initializers/session_store.rb +3 -0
  43. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  44. data/test/dummy/config/locales/en.yml +23 -0
  45. data/test/dummy/config/routes.rb +56 -0
  46. data/test/dummy/config/secrets.yml +22 -0
  47. data/test/dummy/public/404.html +67 -0
  48. data/test/dummy/public/422.html +67 -0
  49. data/test/dummy/public/500.html +66 -0
  50. data/test/dummy/public/favicon.ico +0 -0
  51. data/test/mautic_api_test.rb +7 -0
  52. data/test/test_helper.rb +18 -0
  53. metadata +130 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6c0377d4275602d93edfae7d0ac8109d516d7e6baabd86e6101d97b9b3924eba
4
+ data.tar.gz: 2718533221f8c003cd4dee335a5abc02345da7748a17f43c83b72c00c3c33521
5
+ SHA512:
6
+ metadata.gz: 990ec179a899e644717cede7fad70babd70af5adc63a4d5a9ff18cf0dca8aad3697943f6e7ab175005315cb89ea33ba91c63b137480cb96b846de16f7b6de9bd
7
+ data.tar.gz: e5b1324f9521bf3480dce847b5ace649628da43affd445083cc4ad2c65feeab938c275434063a057c4a96a09468c7a049064529ff2b8c64509150b7dadcd0e64
@@ -0,0 +1,20 @@
1
+ Copyright 2016 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,32 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'MauticApi'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+
18
+
19
+
20
+ Bundler::GemHelper.install_tasks
21
+
22
+ require 'rake/testtask'
23
+
24
+ Rake::TestTask.new(:test) do |t|
25
+ t.libs << 'lib'
26
+ t.libs << 'test'
27
+ t.pattern = 'test/**/*_test.rb'
28
+ t.verbose = false
29
+ end
30
+
31
+
32
+ task default: :test
@@ -0,0 +1,41 @@
1
+ # @package Mautic
2
+ # @copyright 2016 trampos.co. All rights reserved.
3
+ # @author marcel@trampos.co
4
+ # @link http://trampos.co
5
+ # @license MIT http://opensource.org/licenses/MIT
6
+
7
+ require "mautic_api/engine"
8
+
9
+ module MauticApi
10
+
11
+ autoload :Auth, 'mautic_api/auth/auth'
12
+ autoload :Api, 'mautic_api/api/api'
13
+ autoload :Contacts, 'mautic_api/api/contacts'
14
+ autoload :Companies, 'mautic_api/api/companies'
15
+ autoload :Segments, 'mautic_api/api/segments'
16
+ autoload :ContextNotFoundException, 'mautic_api/exception/context_not_found_exception'
17
+
18
+
19
+ class Context
20
+
21
+ # Get an API context object
22
+ #
23
+ # @param string $apiContext API context (leads, forms, etc)
24
+ # @param AuthInterface $auth API Auth object
25
+ # @param string $baseUrl Base URL for API endpoints
26
+ #
27
+ # @return Api\Api
28
+ # @throws ContextNotFoundException
29
+
30
+ def new_api api_context, auth, base_url=""
31
+
32
+ class_name = "MauticApi::#{api_context.camelize}"
33
+
34
+ if Object.const_defined?(class_name)
35
+ return class_name.constantize.new(auth, base_url)
36
+ else
37
+ raise ContextNotFoundException "A context of 'api_context' was not found."
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,248 @@
1
+ module MauticApi
2
+
3
+ class Api
4
+
5
+ attr_accessor :base_url, :auth
6
+
7
+ ENDPOINT = ""
8
+ LIST_NAME = ""
9
+ ITEM_NAME = ""
10
+
11
+ BASE_API_ENDPOINT = 'api'
12
+
13
+ def endpoint
14
+ self.class::ENDPOINT
15
+ end
16
+
17
+ def list_name
18
+ self.class::LIST_NAME
19
+ end
20
+
21
+ def item_name
22
+ self.class::ITEM_NAME
23
+ end
24
+
25
+ def base_api_endpoint
26
+ self.class::BASE_API_ENDPOINT
27
+ end
28
+
29
+ def initialize auth, base_url
30
+ @auth = auth
31
+ set_base_url(base_url)
32
+ end
33
+
34
+ def set_base_url url
35
+ url += "/" if url[-1] != "/"
36
+ url += "api/" if url[-4,4] != "api/"
37
+ @base_url = url
38
+ return self
39
+ end
40
+
41
+ def action_not_supported action
42
+ return {
43
+ error: {
44
+ code: 500,
45
+ message: "#{action} is not supported at this time."
46
+ }
47
+ }
48
+ end
49
+
50
+ # Make the API request
51
+ #
52
+ # @param $endpoint
53
+ # @param array parameters
54
+ # @param string method
55
+ #
56
+ # @return array
57
+ # @throws \Exception
58
+
59
+ def make_request endpoint, parameters = {}, method = :get, settings = {}
60
+
61
+ response = {}
62
+
63
+ # Validate if this endpoint has a BC url
64
+ bc_endpoint = nil
65
+
66
+ if @bc_attempt
67
+ if @bc_regex_endpoints.present?
68
+ @bc_regex_endpoints.each do |regex, bc|
69
+
70
+ if endpoint.scan(/@#{regex}@/)
71
+ @bc_attempt = true
72
+ bcEndpoint = endpoint.gsub(/@#{regex}@/, bc)
73
+ break
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ url = "#{@base_url}#{endpoint}"
80
+ # Don't make the call if we're unit testing a BC endpoint
81
+
82
+ if !bc_endpoint || !@bc_testing || (bc_endpoint && @bc_testing && @bc_attempt)
83
+
84
+ # Hack for unit testing to ensure this isn't being called due to a bad regex
85
+ # if @bc_testing && !@bc_attempt
86
+
87
+ # bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)
88
+ # if !@bc_testing.kind_of?(Array)
89
+ # @bc_testing = [@bc_testing]
90
+ # end
91
+
92
+ # The method is not catching the BC endpoint so fail the test
93
+ # if @bc_testing.include?($bt[1]['function'])
94
+ # throw new \Exception($endpoint.' not matched in '.var_export(@bc_regex_endpoints, true))
95
+ # }
96
+ # end
97
+
98
+ @bc_attempt = false
99
+
100
+ if url.index('http').nil?
101
+ error = {
102
+ code: 500,
103
+ message: "URL is incomplete. Please use #{}, set the base URL as the third argument to MauticApi.newApi, or make endpoint a complete URL."
104
+ }
105
+ else
106
+
107
+ begin
108
+ settings = {}
109
+
110
+ if self.respond_to?(:get_temporary_file_path)
111
+ settings[:temporary_file_path] = self.get_temporary_file_path
112
+ end
113
+
114
+ response = @auth.make_request(url, parameters, method, settings)
115
+
116
+ # TODO: $this->getLogger()->debug('API Response', array('response' => $response))
117
+
118
+ if response[:code] >= 300
119
+
120
+ # TODO: $this->getLogger()->warning($response)
121
+ # assume an error
122
+
123
+ error = {
124
+ code: response[:code],
125
+ message: response[:body],
126
+ response: response
127
+ }
128
+ end
129
+
130
+ rescue Exception => e
131
+ # TODO: $this->getLogger()->error('Failed connecting to Mautic API: '.$e->getMessage(), array('trace' => $e->getTraceAsString()))
132
+
133
+ error = {
134
+ code: 500,
135
+ message: e
136
+ }
137
+ end
138
+ end
139
+
140
+ if error.present?
141
+ return { errors: [error] }
142
+ end
143
+
144
+ # Ensure a code is present in the error array
145
+ # if response[:errors].present?
146
+ # info = @auth.get_response_info
147
+ # response[:errors].each do |key, error|
148
+ # if response[:errors][key]['code']
149
+ # response[:errors][key]['code'] = info['http_code']
150
+ # end
151
+ # end
152
+ # end
153
+ end
154
+
155
+ # Check for a 404 code and a BC URL then try again if applicable
156
+ # if bc_endpoint && (@bc_testing || (response['errors'][0]['code'].to_i === 404))
157
+ # @bc_attempt = true
158
+ # return self.make_request(bc_endpoint, parameters, method)
159
+ # end
160
+
161
+ return response
162
+ end
163
+
164
+ # Get a single item
165
+ #
166
+ # @param int $id
167
+ #
168
+ # @returnarray|mixed
169
+
170
+ def get id
171
+ return make_request("#{self.endpoint}/#{id}")
172
+ end
173
+
174
+ # Get a list of items
175
+ #
176
+ # @param string $search
177
+ # @param int $start
178
+ # @param int $limit
179
+ # @param string $orderBy
180
+ # @param string $orderByDir
181
+ # @param bool $publishedOnly
182
+ #
183
+ # @return array|mixed
184
+
185
+ def get_list search = '', start = 0, limit = 0, order_by = '', order_by_dir = 'ASC', published_only = false
186
+
187
+ parameters = {}
188
+
189
+ args = ['search', 'start', 'limit', 'order_by', 'order_by_dir', 'published_only']
190
+
191
+ args.each do |arg|
192
+ parameters[arg.to_sym] = (eval arg) if (eval arg).present?
193
+ end
194
+
195
+ return make_request(self.endpoint, parameters)
196
+ end
197
+
198
+
199
+ # Proxy function to getList with $publishedOnly set to true
200
+ #
201
+ # @param string $search
202
+ # @param int $start
203
+ # @param int $limit
204
+ # @param string $orderBy
205
+ # @param string $orderByDir
206
+ #
207
+ # @return array|mixed
208
+
209
+ def get_published_list search = '', start = 0, limit = 0, order_by = '', order_by_dir = 'ASC'
210
+ return get_list(search, start, limit, order_by, order_by_dir, true)
211
+ end
212
+
213
+
214
+ # Create a new item (if supported)
215
+ #
216
+ # @param array parameters
217
+ #
218
+ # @return array|mixed
219
+
220
+ def create parameters
221
+ return make_request("#{self.endpoint}/new", parameters, :post)
222
+ end
223
+
224
+ # Edit an item with option to create if it doesn't exist
225
+ #
226
+ # @param int $id
227
+ # @param array parameters
228
+ # @param bool $createIfNotExists = false
229
+ #
230
+ # @return array|mixed
231
+
232
+ def edit(id, parameters, create_if_not_exists = false)
233
+ method = create_if_not_exists ? :put : :patch
234
+ return make_request("#{self.endpoint}/#{id}/edit", parameters, method)
235
+ end
236
+
237
+ # Delete an item
238
+ #
239
+ # @param $id
240
+ #
241
+ # @return array|mixed
242
+
243
+ def delete id
244
+ return make_request("#{self.endpoint}/#{id}/delete", {}, :delete)
245
+ end
246
+
247
+ end
248
+ end
@@ -0,0 +1,11 @@
1
+ module MauticApi
2
+
3
+ class Companies < Api
4
+
5
+ ENDPOINT = 'companies'
6
+ LIST_NAME = "companies"
7
+ ITEM_NAME = "company"
8
+
9
+ end
10
+
11
+ end
@@ -0,0 +1,96 @@
1
+ module MauticApi
2
+
3
+ class Contacts < Api
4
+
5
+ ENDPOINT = "contacts"
6
+ LIST_NAME = "contacts"
7
+ ITEM_NAME = "contact"
8
+
9
+ # Get a list of users available as contact owners
10
+ #
11
+ # @return array|mixed
12
+
13
+ def get_owners
14
+ return make_request("#{self.endpoint}/list/owners")
15
+ end
16
+
17
+ # Get a list of custom fields
18
+ #
19
+ # @return array|mixed
20
+
21
+ def get_field_list
22
+ return make_request("#{self.endpoint}/list/fields")
23
+ end
24
+
25
+ # Get a list of contact segments
26
+ #
27
+ # @return array|mixed
28
+
29
+ def get_segments
30
+ return make_request("#{self.endpoint}/list/segments")
31
+ end
32
+
33
+ # Get a list of a contact's notes
34
+ #
35
+ # @param int $id Contact ID
36
+ # @param string $search
37
+ # @param int $start
38
+ # @param int $limit
39
+ # @param string $orderBy
40
+ # @param string $orderByDir
41
+ #
42
+ # @return array|mixed
43
+
44
+ def get_contact_notes id, search = '', start = 0, limit = 0, orderBy = '', order_by_dir = 'ASC'
45
+
46
+ parameters = {}
47
+
48
+ args = ['search', 'start', 'limit', 'orderBy', 'order_by_dir']
49
+
50
+ args.each do |arg|
51
+ parameters[arg.to_sym] = (eval arg) if (eval arg).present?
52
+ end
53
+
54
+ return make_request("#{self.endpoint}/#{id}/notes", parameters)
55
+ end
56
+
57
+ # Get a segment of smart segments the lead is in
58
+ #
59
+ # @param $id
60
+ # @return array|mixed
61
+
62
+ def get_contact_segments(id)
63
+ return make_request("#{self.endpoint}/#{id}/segments")
64
+ end
65
+
66
+ # Add do not contact to lead
67
+ #
68
+ # @param int $id Contact ID
69
+ # @param string $comments
70
+ #
71
+ # @return array|mixed
72
+
73
+ def add_do_not_contact id, reason = 1, comments = ''
74
+ parameters = {}
75
+
76
+ args = ['reason', 'comments']
77
+
78
+ args.each do |arg|
79
+ parameters[arg.to_sym] = (eval arg) if (eval arg).present?
80
+ end
81
+
82
+ return make_request("#{self.endpoint}/#{id}/dnc/add/email", parameters, :post)
83
+ end
84
+
85
+ # Get a segment of campaigns the lead is in
86
+ #
87
+ # @param $id
88
+ # @return array|mixed
89
+
90
+ def get_contact_campaigns(id)
91
+ return make_request("#{self.endpoint}/#{id}/campaigns")
92
+ end
93
+
94
+ end
95
+
96
+ end