Skip to content

Commit f5908ce

Browse files
committed
System Hook: implemented
1 parent c385784 commit f5908ce

File tree

9 files changed

+100
-10
lines changed

9 files changed

+100
-10
lines changed

app/controllers/admin/hooks_controller.rb

+5-6
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,11 @@ def index
1111
def create
1212
@hook = SystemHook.new(params[:hook])
1313

14-
respond_to do |format|
15-
if @hook.save
16-
format.html { redirect_to admin_hooks_path, notice: 'Hook was successfully created.' }
17-
else
18-
format.html { render :index }
19-
end
14+
if @hook.save
15+
redirect_to admin_hooks_path, notice: 'Hook was successfully created.'
16+
else
17+
@hooks = SystemHook.all
18+
render :index
2019
end
2120
end
2221

app/models/project.rb

+27-1
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,32 @@ def saved?
107107
validate :check_limit
108108
validate :repo_name
109109

110+
after_create :create_hooks
111+
after_destroy :destroy_hooks
112+
113+
def create_hooks
114+
SystemHook.all_hooks_fire({
115+
event_name: "project_create",
116+
name: self.name,
117+
path: self.path,
118+
project_id: self.id,
119+
owner_name: self.owner.name,
120+
owner_email: self.owner.email,
121+
created_at: self.created_at
122+
})
123+
end
124+
125+
def destroy_hooks
126+
SystemHook.all_hooks_fire({
127+
event_name: "project_destroy",
128+
name: self.name,
129+
path: self.path,
130+
project_id: self.id,
131+
owner_name: self.owner.name,
132+
owner_email: self.owner.email,
133+
})
134+
end
135+
110136
def check_limit
111137
unless owner.can_create_project?
112138
errors[:base] << ("Your own projects limit is #{owner.projects_limit}! Please contact administrator to increase it")
@@ -120,7 +146,7 @@ def repo_name
120146
errors.add(:path, " like 'gitolite-admin' is not allowed")
121147
end
122148
end
123-
149+
124150
def self.access_options
125151
UsersProject.access_roles
126152
end

app/models/system_hook.rb

+10
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
11
class SystemHook < WebHook
2+
3+
def async_execute(data)
4+
Resque.enqueue(SystemHookWorker, id, data)
5+
end
26

7+
def self.all_hooks_fire(data)
8+
SystemHook.all.each do |sh|
9+
sh.async_execute data
10+
end
11+
end
12+
313
end

app/models/user.rb

+19
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,25 @@ class User < ActiveRecord::Base
5757
scope :active, where(:blocked => false)
5858

5959
before_validation :generate_password, :on => :create
60+
after_create :create_hooks
61+
after_destroy :destroy_hooks
62+
63+
def create_hooks
64+
SystemHook.all_hooks_fire({
65+
event_name: "user_create",
66+
name: self.name,
67+
email: self.email,
68+
created_at: self.created_at
69+
})
70+
end
71+
72+
def destroy_hooks
73+
SystemHook.all_hooks_fire({
74+
event_name: "user_destroy",
75+
name: self.name,
76+
email: self.email
77+
})
78+
end
6079

6180
def generate_password
6281
if self.force_random_password

app/models/users_project.rb

+29-1
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,41 @@ class UsersProject < ActiveRecord::Base
1111

1212
after_save :update_repository
1313
after_destroy :update_repository
14+
after_create :add_to_team_hooks
15+
after_destroy :remove_from_team_hooks
16+
1417

1518
validates_uniqueness_of :user_id, :scope => [:project_id]
1619
validates_presence_of :user_id
1720
validates_presence_of :project_id
1821

1922
delegate :name, :email, :to => :user, :prefix => true
2023

24+
def add_to_team_hooks
25+
SystemHook.all_hooks_fire({
26+
event_name: "user_add_to_team",
27+
project_name: self.project.name,
28+
project_path: self.project.path,
29+
project_id: self.project_id,
30+
user_name: self.user.name,
31+
user_email: self.user.email,
32+
project_access: self.repo_access_human,
33+
created_at: self.created_at
34+
})
35+
end
36+
37+
def remove_from_team_hooks
38+
SystemHook.all_hooks_fire({
39+
event_name: "user_remove_from_team",
40+
project_name: self.project.name,
41+
project_path: self.project.path,
42+
project_id: self.project_id,
43+
user_name: self.user.name,
44+
user_email: self.user.email,
45+
project_access: self.repo_access_human
46+
})
47+
end
48+
2149
def self.bulk_import(project, user_ids, project_access)
2250
UsersProject.transaction do
2351
user_ids.each do |user_id|
@@ -68,7 +96,7 @@ def project_access_human
6896
end
6997

7098
def repo_access_human
71-
""
99+
self.class.access_roles.invert[self.project_access]
72100
end
73101
end
74102
# == Schema Information

app/models/web_hook.rb

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class WebHook < ActiveRecord::Base
1313
def execute(data)
1414
WebHook.post(url, body: data.to_json, headers: { "Content-Type" => "application/json" })
1515
end
16+
1617
end
1718
# == Schema Information
1819
#

app/workers/system_hook_worker.rb

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class SystemHookWorker
2+
@queue = :system_hook
3+
4+
def self.perform(hook_id, data)
5+
SystemHook.find(hook_id).execute data
6+
end
7+
end

resque.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
mkdir -p tmp/pids
2-
bundle exec rake environment resque:work QUEUE=post_receive,mailer RAILS_ENV=production PIDFILE=tmp/pids/resque_worker.pid BACKGROUND=yes
2+
bundle exec rake environment resque:work QUEUE=post_receive,mailer,system_hook RAILS_ENV=production PIDFILE=tmp/pids/resque_worker.pid BACKGROUND=yes

resque_dev.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
bundle exec rake environment resque:work QUEUE=* VVERBOSE=1
1+
bundle exec rake environment resque:work QUEUE=post_receive,mailer,system_hook VVERBOSE=1

0 commit comments

Comments
 (0)