freshdesk 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/freshdesk.rb +133 -0
  2. metadata +74 -0
@@ -0,0 +1,133 @@
1
+ require 'rest_client'
2
+ require 'nokogiri'
3
+
4
+ class Freshdesk
5
+
6
+ # custom errors
7
+ class AlreadyExistedError < StandardError; end
8
+ class ConnectionError < StandardError; end
9
+
10
+ attr_accessor :base_url
11
+
12
+ def initialize(base_url, username, password)
13
+
14
+ @base_url = base_url
15
+
16
+ RestClient.add_before_execution_proc do | req, params |
17
+ req.basic_auth username, password
18
+ end
19
+ end
20
+
21
+ # Freshdesk API client support "GET" with id parameter optional
22
+ # Returns nil if there is no response
23
+ def self.define_get(name, *args)
24
+ name = name.to_s
25
+ method_name = "get_" + name
26
+
27
+ define_method method_name do |*args|
28
+ uri = mapping(name)
29
+ uri.gsub!(/.xml/, "/#{args}.xml") if args.size > 0
30
+
31
+ begin
32
+ response = RestClient.get uri
33
+ rescue Exception
34
+ response = nil
35
+ end
36
+ end
37
+ end
38
+
39
+ # Freshdesk API client support "DELETE" with the required id parameter
40
+ def self.define_delete(name, *args)
41
+ name = name.to_s
42
+ method_name = "delete_" + name
43
+
44
+ define_method method_name do |args|
45
+ uri = mapping(name)
46
+ raise StandardError, "An ID is required to delete" if args.size.eql? 0
47
+ uri.gsub!(/.xml/, "/#{args}.xml")
48
+ RestClient.delete uri
49
+ end
50
+ end
51
+
52
+ # Freshdesk API client support "POST" with the optional key, value parameter
53
+ #
54
+ # Will throw:
55
+ # AlreadyExistedError if there is exact copy of data in the server
56
+ # ConnectionError if there is connection problem with the server
57
+ def self.define_post(name, *args)
58
+ name = name.to_s
59
+ method_name = "post_" + name
60
+
61
+ define_method method_name do |args|
62
+ raise StandardError, "Arguments are required to modify data" if args.size.eql? 0
63
+ uri = mapping(name)
64
+
65
+ builder = Nokogiri::XML::Builder.new do |xml|
66
+ xml.send(doc_name(name)) {
67
+ args.each do |key, value|
68
+ xml.send(key, value)
69
+ end
70
+ }
71
+ end
72
+
73
+ begin
74
+ response = RestClient.post uri, builder.to_xml, :content_type => "text/xml"
75
+
76
+ rescue RestClient::UnprocessableEntity
77
+ raise AlreadyExistedError, "Entry already existed"
78
+
79
+ rescue RestClient::InternalServerError
80
+ raise ConnectionError, "Connection to the server failed. Please check hostname"
81
+
82
+ rescue RestClient::Found
83
+ raise ConnectionError, "Connection to the server failed. Please check username/password"
84
+
85
+ rescue Exception => e3
86
+ raise
87
+ end
88
+
89
+ response
90
+ end
91
+ 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
97
+ end
98
+
99
+
100
+ # Mapping of object name to url:
101
+ # tickets => helpdesk/tickets.xml
102
+ # ticket_fields => /ticket_fields.xml
103
+ # users => /contacts.xml
104
+ # forums => /categories.xml
105
+ # solutions => /solution/categories.xml
106
+ # companies => /customers.xml
107
+ def mapping(method_name)
108
+ path = case method_name
109
+ when "tickets" then File.join(@base_url + "helpdesk/tickets.xml")
110
+ when "ticket_fields" then File.join( @base_url, "ticket_fields.xml")
111
+ when "users" then File.join(@base_url, "contacts.xml")
112
+ when "forums" then File.join(@base_url + "categories.xml")
113
+ when "solutions" then File.join(@base_url + "solution/categories.xml")
114
+ when "companies" then File.join(@base_url + "customers.xml")
115
+ end
116
+ end
117
+
118
+ # match with the root name of xml document that freskdesk uses
119
+ def doc_name(name)
120
+ doc = case name
121
+ when "tickets" then "helpdesk_ticket"
122
+ when "ticket_fields" then "helpdesk-ticket-fields"
123
+ when "users" then "user"
124
+ when "companies" then "customer"
125
+ else raise StandardError, "No root object for this call"
126
+ end
127
+ end
128
+ 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 ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: freshdesk
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.1"
5
+ platform: ruby
6
+ authors:
7
+ - David Liman
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2012-02-22 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rest-client
17
+ 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
26
+ name: nokogiri
27
+ 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:
35
+ description: Ruby Gem for interfacing with the Freshdesk API
36
+ email: limanoit@gmail.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files: []
42
+
43
+ files:
44
+ - lib/freshdesk.rb
45
+ has_rdoc: true
46
+ homepage: https://github.com/dvliman/freshdesk-api
47
+ licenses: []
48
+
49
+ post_install_message:
50
+ rdoc_options: []
51
+
52
+ require_paths:
53
+ - 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:
66
+ requirements: []
67
+
68
+ rubyforge_project:
69
+ rubygems_version: 1.3.5
70
+ signing_key:
71
+ specification_version: 3
72
+ summary: Ruby Gem for interfacing with the Freshdesk API
73
+ test_files: []
74
+