freshdesk 0.1 → 0.2
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.
- checksums.yaml +15 -0
- data/lib/freshdesk.rb +148 -44
- metadata +47 -49
checksums.yaml
ADDED
@@ -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=
|
data/lib/freshdesk.rb
CHANGED
@@ -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.
|
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
|
73
|
+
define_method method_name do |params={}|
|
28
74
|
uri = mapping(name)
|
29
|
-
uri.gsub!(
|
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.
|
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.
|
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
|
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
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
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
|
-
|
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 "
|
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
|
-
|
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:
|
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
|
-
|
13
|
-
|
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
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- -
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version:
|
24
|
-
|
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
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- -
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version:
|
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:
|
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:
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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.
|
68
|
+
rubygems_version: 2.1.4
|
70
69
|
signing_key:
|
71
|
-
specification_version:
|
70
|
+
specification_version: 4
|
72
71
|
summary: Ruby Gem for interfacing with the Freshdesk API
|
73
72
|
test_files: []
|
74
|
-
|