/
web_hook.rb
99 lines (81 loc) · 2.1 KB
/
web_hook.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
class WebHook < ActiveRecord::Base
GLOBAL_PATTERN = '*'.freeze
belongs_to :user
belongs_to :rubygem
validates_formatting_of :url, using: :url, message: "does not appear to be a valid URL"
validate :unique_hook, on: :create
def self.global
where(rubygem_id: nil)
end
def self.specific
where.not(rubygem_id: nil)
end
def fire(protocol, host_with_port, deploy_gem, version, delayed = true)
job = Notifier.new(url, protocol, host_with_port, deploy_gem, version, user.api_key)
if delayed
Delayed::Job.enqueue job, priority: PRIORITIES[:web_hook]
else
job.perform
end
end
def global?
rubygem_id.blank?
end
def success_message
"Successfully created webhook for #{what} to #{url}"
end
def removed_message
"Successfully removed webhook for #{what} to #{url}"
end
def deployed_message(rubygem)
"Successfully deployed webhook for #{what(rubygem)} to #{url}"
end
def failed_message(rubygem)
"There was a problem deploying webhook for #{what(rubygem)} to #{url}"
end
def what(rubygem = self.rubygem)
if rubygem
rubygem.name
else
"all gems"
end
end
def payload
{
'failure_count' => failure_count,
'url' => url
}
end
def as_json(*)
payload
end
def to_xml(options = {})
payload.to_xml(options.merge(root: 'web_hook'))
end
def to_yaml(*args)
payload.to_yaml(*args)
end
def encode_with(coder)
coder.tag = nil
coder.implicit = true
coder.map = payload
end
private
def unique_hook
if user && rubygem
if WebHook.exists?(user_id: user.id,
rubygem_id: rubygem.id,
url: url)
errors[:base] << "A hook for #{url} has already been registered for #{rubygem.name}"
end
elsif user
if WebHook.exists?(user_id: user.id,
rubygem_id: nil,
url: url)
errors[:base] << "A global hook for #{url} has already been registered"
end
else
errors[:base] << "A user is required for this hook"
end
end
end