forked from davvidbaker/github-to-freshdesk
-
Notifications
You must be signed in to change notification settings - Fork 1
/
server.rb
119 lines (90 loc) · 3 KB
/
server.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
require "sinatra"
require "net/http"
require "uri"
require "json"
require "yaml"
config = {
freshdesk_key: ENV['FRESHDESK_API_KEY'],
freshdesk_domain: ENV['FRESHDESK_DOMAIN'],
freshdesk_custom_field: ENV['FRESHDESK_CUSTOM_FIELD']
}
if File.exists?(path = File.join(File.dirname(__FILE__), 'config.yml')) then
config.merge!(YAML.load(File.read(path)) || {})
end
Config = config
def send_api_request(action, params = nil, data = nil, put = false)
key = Config[:freshdesk_key]
domain = Config[:freshdesk_domain]
params ||= {}
query_parts = []
params.each_pair {|k,v| query_parts << "#{k.to_s}:#{v.to_s}"}
query_string = query_parts.join(" AND ")
uri = URI.parse(query_string.length > 0 ?
"https://#{domain}.freshdesk.com/api/v2/#{action}?query=\"#{query_string}\"" :
"https://#{domain}.freshdesk.com/api/v2/#{action}")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
if data then
request = put ? Net::HTTP::Put.new(uri.request_uri) : Net::HTTP::Post.new(uri.request_uri)
request.body = data
else
request = Net::HTTP::Get.new(uri.request_uri)
end
request.basic_auth(key, "X")
request["Content-Type"] = "application/json"
response = http.request(request)
unless response.kind_of? Net::HTTPSuccess then
throw "Response wasn't susccessful #{response.code} #{uri.to_s} \n#{response.body}"
end
JSON.parse response.body
end
def field_for_repo(repo)
return unless Config["repositories"]
Config["repositories"][repo["full_name"]] || Config["repositories"][repo["name"]]
end
def tickets_for_issue(number, repo)
custom_field_name = field_for_repo(repo) || Config[:freshdesk_custom_field]
tickets = send_api_request("search/tickets", { custom_field_name => number })["results"]
tickets
end
def handle_labeled(number, repo, label)
return unless label =~ /^fixed|solution accepted/i
tickets = tickets_for_issue(number, repo)
tickets.each do |ticket|
send_api_request("tickets/#{ticket['id']}/notes", nil, JSON.generate({
:body => "Github issue #{repo["full_name"]}##{number} has been marked as #{label}.",
:private => false
}))
status_numbers = {
3 => /dev|solution accepted/i, # pending
4 => /prod/i, # resolved
8 => /staging/i # staging
}
match = status_numbers.find { |_num, r| label.match(r) }
if match then
updated_status = match.first
send_api_request("tickets/#{ticket['id']}", nil, JSON.generate({
:status => updated_status
}), true)
end
end
end
def handle_closed(number, repo)
tickets = tickets_for_issue(number, repo)
tickets.each do |ticket|
send_api_request("tickets/#{ticket['id']}", nil, JSON.generate({
:status => 4
}), true)
end
end
post '/endpoint' do
body = request.body.read
event = JSON.parse(body)
case event["action"]
when "labeled"
handle_labeled(event["issue"]["number"], event["repository"], event["label"]["name"])
when "closed"
handle_closed(event["issue"]["number"], event["repository"])
end
"OK"
end