freshdesk 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +15 -0
  2. data/lib/freshdesk.rb +148 -44
  3. metadata +47 -49
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZDdjY2NmNWVjYmI4NTIxOWU4YmViNWU4OWE5ZmU2MjEwZDQxODllMw==
5
+ data.tar.gz: !binary |-
6
+ NjkzODhmMjk2ZjU2ZWFlNmEyMTE3YTI3NzRmZTYxMTFlMmU0ZTFlMw==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ OTkzNTU2NmRhNjM1ODZkY2YwYzExZTFhZjYwMjk4MjA2MTU3ZmU4Mzk5Yjc1
10
+ YzZmNTczNmFhZDQ2ZTBmZWE0MzM1MTc2YTdiMTUwMmNiNDkyZDAwZDExZDEx
11
+ ODY1OWQ4YWNjNTQ5ODk1ODgzZTExZjg0NzVjZjZjOTYxNGJhMTc=
12
+ data.tar.gz: !binary |-
13
+ NWI3ZjYyMGZkMjNkOWFkYTY0NmQ3YjY4ZmEzMjc4N2I3MWEwZGMzMjA1NmY5
14
+ NmFiYTA0MTYwOGU0ZDQ2ZTZiNTAzYzIyNWUxOTJhYTljY2ZjMGVjYTIwZDM5
15
+ NDA0YzIyYjI0NjRkZDkzYzQ3MTJiNTc1YTgwMWMxYjg5ODY2NDk=
@@ -1,32 +1,81 @@
1
1
  require 'rest_client'
2
2
  require 'nokogiri'
3
+ require 'uri'
3
4
 
4
5
  class Freshdesk
5
6
 
6
7
  # custom errors
7
8
  class AlreadyExistedError < StandardError; end
8
9
  class ConnectionError < StandardError; end
9
-
10
+
10
11
  attr_accessor :base_url
11
-
12
- def initialize(base_url, username, password)
13
-
12
+
13
+ def initialize(base_url, username, password='X')
14
+
14
15
  @base_url = base_url
15
-
16
+
16
17
  RestClient.add_before_execution_proc do | req, params |
17
18
  req.basic_auth username, password
18
19
  end
19
20
  end
20
-
21
+
22
+ def response_format
23
+ @response_format ||= "xml"
24
+ end
25
+
26
+ # Specify the response format to use--JSON or XML. Currently JSON is only
27
+ # supported for GETs, so other verbs will still use XML.
28
+ def response_format=(format)
29
+ unless format.downcase =~ /json|xml/
30
+ raise StandardError "Unsupported format: '#{format}'. Please specify 'xml' or 'json'."
31
+ end
32
+ @response_format = format.downcase
33
+ end
34
+
21
35
  # Freshdesk API client support "GET" with id parameter optional
22
36
  # Returns nil if there is no response
23
- def self.define_get(name, *args)
37
+ def self.fd_define_get(name)
38
+ name = name.to_s
39
+ method_name = "get_" + name
40
+
41
+ define_method method_name do |*args|
42
+ uri = mapping(name)
43
+ uri.gsub!(/\.xml/, "\.#{response_format}")
44
+
45
+ # If we've been passed a string paramter, it means we're fetching
46
+ # something like domain_URL/helpdesk/tickets/[ticket_id].xml
47
+ #
48
+ # If we're supplied with a hash parameter, it means we're fetching
49
+ # something like domain_URL/helpdesk/tickets.xml?filter_name=all_tickets&page=[value]
50
+ if args.size > 0
51
+ url_args = args.first
52
+ if url_args.class == Hash
53
+ uri += '?' + URI.encode_www_form(url_args)
54
+ else
55
+ uri.gsub!(/\.#{response_format}/, "/#{url_args}\.#{response_format}")
56
+ end
57
+ end
58
+
59
+ begin
60
+ response = RestClient.get uri
61
+ rescue Exception
62
+ response = nil
63
+ end
64
+ end
65
+ end
66
+
67
+ # Certain GET calls require query strings instead of a more
68
+ # RESTful URI. This method and fd_define_get are mutually exclusive.
69
+ def self.fd_define_parameterized_get(name)
24
70
  name = name.to_s
25
71
  method_name = "get_" + name
26
72
 
27
- define_method method_name do |*args|
73
+ define_method method_name do |params={}|
28
74
  uri = mapping(name)
29
- uri.gsub!(/.xml/, "/#{args}.xml") if args.size > 0
75
+ uri.gsub!(/\.xml/, ".#{response_format}")
76
+ unless params.empty?
77
+ uri += '?' + URI.encode_www_form(params)
78
+ end
30
79
 
31
80
  begin
32
81
  response = RestClient.get uri
@@ -35,9 +84,9 @@ class Freshdesk
35
84
  end
36
85
  end
37
86
  end
38
-
87
+
39
88
  # Freshdesk API client support "DELETE" with the required id parameter
40
- def self.define_delete(name, *args)
89
+ def self.fd_define_delete(name)
41
90
  name = name.to_s
42
91
  method_name = "delete_" + name
43
92
 
@@ -48,55 +97,111 @@ class Freshdesk
48
97
  RestClient.delete uri
49
98
  end
50
99
  end
51
-
100
+
52
101
  # Freshdesk API client support "POST" with the optional key, value parameter
53
102
  #
54
- # Will throw:
103
+ # Will throw:
55
104
  # AlreadyExistedError if there is exact copy of data in the server
56
105
  # ConnectionError if there is connection problem with the server
57
- def self.define_post(name, *args)
106
+ def self.fd_define_post(name)
58
107
  name = name.to_s
59
108
  method_name = "post_" + name
60
-
61
- define_method method_name do |args|
109
+
110
+ define_method method_name do |args, id=nil|
62
111
  raise StandardError, "Arguments are required to modify data" if args.size.eql? 0
63
- uri = mapping(name)
64
-
112
+ uri = mapping(name, id)
113
+
65
114
  builder = Nokogiri::XML::Builder.new do |xml|
66
115
  xml.send(doc_name(name)) {
116
+ if args.has_key? :attachment
117
+ attachment_name = args[:attachment][:name] or raise StandardError, "Attachment name required"
118
+ attachment_cdata = args[:attachment][:cdata] or raise StandardError, "Attachment CDATA required"
119
+ xml.send("attachments", type: "array") {
120
+ xml.send("attachment") {
121
+ xml.send("resource", "type" => "file", "name" => attachment_name, "content-type" => "application/octet-stream") {
122
+ xml.cdata attachment_cdata
123
+ }
124
+ }
125
+ }
126
+ args.except! :attachment
127
+ end
67
128
  args.each do |key, value|
68
129
  xml.send(key, value)
69
130
  end
70
131
  }
71
132
  end
72
133
 
73
- begin
134
+ begin
74
135
  response = RestClient.post uri, builder.to_xml, :content_type => "text/xml"
75
-
136
+
76
137
  rescue RestClient::UnprocessableEntity
77
138
  raise AlreadyExistedError, "Entry already existed"
78
-
139
+
79
140
  rescue RestClient::InternalServerError
80
141
  raise ConnectionError, "Connection to the server failed. Please check hostname"
81
-
142
+
82
143
  rescue RestClient::Found
83
144
  raise ConnectionError, "Connection to the server failed. Please check username/password"
84
-
85
- rescue Exception => e3
145
+
146
+ rescue Exception
86
147
  raise
87
- end
88
-
89
- response
148
+ end
149
+
150
+ response
90
151
  end
91
152
  end
92
-
93
- [:tickets, :ticket_fields, :users, :forums, :solutions, :companies].each do |a|
94
- define_get a
95
- define_post a
96
- define_delete a
153
+
154
+ # Freshdesk API client support "PUT" with key, value parameter
155
+ #
156
+ # Will throw:
157
+ # ConnectionError if there is connection problem with the server
158
+ def self.fd_define_put(name)
159
+ name = name.to_s
160
+ method_name = "put_" + name
161
+
162
+ define_method method_name do |args|
163
+ raise StandardError, "Arguments are required to modify data" if args.size.eql? 0
164
+ raise StandardError, "id is required to modify data" if args[:id].nil?
165
+ uri = mapping(name)
166
+
167
+ builder = Nokogiri::XML::Builder.new do |xml|
168
+ xml.send(doc_name(name)) {
169
+ args.each do |key, value|
170
+ xml.send(key, value)
171
+ end
172
+ }
173
+ end
174
+
175
+ begin
176
+ uri.gsub!(/.xml/, "/#{args[:id]}.xml")
177
+ response = RestClient.put uri, builder.to_xml, :content_type => "text/xml"
178
+
179
+ rescue RestClient::InternalServerError
180
+ raise ConnectionError, "Connection to the server failed. Please check hostname"
181
+
182
+ rescue RestClient::Found
183
+ raise ConnectionError, "Connection to the server failed. Please check username/password"
184
+
185
+ rescue Exception
186
+ raise
187
+ end
188
+
189
+ response
190
+ end
191
+ end
192
+
193
+ [:tickets, :ticket_fields, :ticket_notes, :users, :forums, :solutions, :companies, :time_sheets].each do |a|
194
+ fd_define_get a
195
+ fd_define_post a
196
+ fd_define_delete a
197
+ fd_define_put a
198
+ end
199
+
200
+ [:user_ticket].each do |resource|
201
+ fd_define_parameterized_get resource
97
202
  end
98
-
99
-
203
+
204
+
100
205
  # Mapping of object name to url:
101
206
  # tickets => helpdesk/tickets.xml
102
207
  # ticket_fields => /ticket_fields.xml
@@ -104,30 +209,29 @@ class Freshdesk
104
209
  # forums => /categories.xml
105
210
  # solutions => /solution/categories.xml
106
211
  # companies => /customers.xml
107
- def mapping(method_name)
108
- path = case method_name
212
+ def mapping(method_name, id = nil)
213
+ case method_name
109
214
  when "tickets" then File.join(@base_url + "helpdesk/tickets.xml")
110
- when "ticket_fields" then File.join( @base_url, "ticket_fields.xml")
215
+ when "user_ticket" then File.join(@base_url + "helpdesk/tickets/user_ticket.xml")
216
+ when "ticket_fields" then File.join(@base_url, "ticket_fields.xml")
217
+ when "ticket_notes" then File.join(@base_url, "helpdesk/tickets/#{id}/notes.xml")
111
218
  when "users" then File.join(@base_url, "contacts.xml")
112
219
  when "forums" then File.join(@base_url + "categories.xml")
113
220
  when "solutions" then File.join(@base_url + "solution/categories.xml")
114
221
  when "companies" then File.join(@base_url + "customers.xml")
222
+ when "time_sheets" then File.join(@base_url + "helpdesk/time_sheets.xml")
115
223
  end
116
224
  end
117
-
225
+
118
226
  # match with the root name of xml document that freskdesk uses
119
227
  def doc_name(name)
120
- doc = case name
228
+ case name
121
229
  when "tickets" then "helpdesk_ticket"
122
230
  when "ticket_fields" then "helpdesk-ticket-fields"
231
+ when "ticket_notes" then "helpdesk_note"
123
232
  when "users" then "user"
124
233
  when "companies" then "customer"
125
234
  else raise StandardError, "No root object for this call"
126
235
  end
127
236
  end
128
237
  end
129
-
130
- #freshdesk = Freshdesk.new('http://onescreen.freshdesk.com', 'limanoit@gmail.com', '134658')
131
- #response = freshdesk.post_users(:name => 'test', :email => 'test@143124test.com', :customer => "onescreen")
132
- #response = freshdesk.post_users(:name=>'NirmitPatel', :email=>'f.last@onescreen.com', :customer=>'1000500nemo')
133
- #puts response
metadata CHANGED
@@ -1,74 +1,72 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: freshdesk
3
- version: !ruby/object:Gem::Version
4
- version: "0.1"
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.2'
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - David Liman
8
+ - Tim Macdonald
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
-
12
- date: 2012-02-22 00:00:00 -08:00
13
- default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2014-02-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: rest-client
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ! '>='
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
17
21
  type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
24
- version:
25
- - !ruby/object:Gem::Dependency
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ! '>='
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
26
29
  name: nokogiri
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
27
35
  type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: "0"
34
- version:
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
35
42
  description: Ruby Gem for interfacing with the Freshdesk API
36
- email: limanoit@gmail.com
43
+ email: tsmacdonald@gmail.com
37
44
  executables: []
38
-
39
45
  extensions: []
40
-
41
46
  extra_rdoc_files: []
42
-
43
- files:
47
+ files:
44
48
  - lib/freshdesk.rb
45
- has_rdoc: true
46
49
  homepage: https://github.com/dvliman/freshdesk-api
47
50
  licenses: []
48
-
51
+ metadata: {}
49
52
  post_install_message:
50
53
  rdoc_options: []
51
-
52
- require_paths:
54
+ require_paths:
53
55
  - lib
54
- required_ruby_version: !ruby/object:Gem::Requirement
55
- requirements:
56
- - - ">="
57
- - !ruby/object:Gem::Version
58
- version: "0"
59
- version:
60
- required_rubygems_version: !ruby/object:Gem::Requirement
61
- requirements:
62
- - - ">="
63
- - !ruby/object:Gem::Version
64
- version: "0"
65
- version:
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
66
  requirements: []
67
-
68
67
  rubyforge_project:
69
- rubygems_version: 1.3.5
68
+ rubygems_version: 2.1.4
70
69
  signing_key:
71
- specification_version: 3
70
+ specification_version: 4
72
71
  summary: Ruby Gem for interfacing with the Freshdesk API
73
72
  test_files: []
74
-