Commit f5908cef19a3cd2c44be02b453fecb568b2c6c8e

Authored by Valeriy Sizov
1 parent c3857842

System Hook: implemented

app/controllers/admin/hooks_controller.rb
@@ -11,12 +11,11 @@ class Admin::HooksController < ApplicationController @@ -11,12 +11,11 @@ class Admin::HooksController < ApplicationController
11 def create 11 def create
12 @hook = SystemHook.new(params[:hook]) 12 @hook = SystemHook.new(params[:hook])
13 13
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
20 end 19 end
21 end 20 end
22 21
app/models/project.rb
@@ -107,6 +107,32 @@ class Project < ActiveRecord::Base @@ -107,6 +107,32 @@ class Project < ActiveRecord::Base
107 validate :check_limit 107 validate :check_limit
108 validate :repo_name 108 validate :repo_name
109 109
  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 +
110 def check_limit 136 def check_limit
111 unless owner.can_create_project? 137 unless owner.can_create_project?
112 errors[:base] << ("Your own projects limit is #{owner.projects_limit}! Please contact administrator to increase it") 138 errors[:base] << ("Your own projects limit is #{owner.projects_limit}! Please contact administrator to increase it")
@@ -120,7 +146,7 @@ class Project &lt; ActiveRecord::Base @@ -120,7 +146,7 @@ class Project &lt; ActiveRecord::Base
120 errors.add(:path, " like 'gitolite-admin' is not allowed") 146 errors.add(:path, " like 'gitolite-admin' is not allowed")
121 end 147 end
122 end 148 end
123 - 149 +
124 def self.access_options 150 def self.access_options
125 UsersProject.access_roles 151 UsersProject.access_roles
126 end 152 end
app/models/system_hook.rb
1 class SystemHook < WebHook 1 class SystemHook < WebHook
  2 +
  3 + def async_execute(data)
  4 + Resque.enqueue(SystemHookWorker, id, data)
  5 + end
2 6
  7 + def self.all_hooks_fire(data)
  8 + SystemHook.all.each do |sh|
  9 + sh.async_execute data
  10 + end
  11 + end
  12 +
3 end 13 end
app/models/user.rb
@@ -57,6 +57,25 @@ class User &lt; ActiveRecord::Base @@ -57,6 +57,25 @@ class User &lt; ActiveRecord::Base
57 scope :active, where(:blocked => false) 57 scope :active, where(:blocked => false)
58 58
59 before_validation :generate_password, :on => :create 59 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
60 79
61 def generate_password 80 def generate_password
62 if self.force_random_password 81 if self.force_random_password
app/models/users_project.rb
@@ -11,6 +11,9 @@ class UsersProject &lt; ActiveRecord::Base @@ -11,6 +11,9 @@ class UsersProject &lt; ActiveRecord::Base
11 11
12 after_save :update_repository 12 after_save :update_repository
13 after_destroy :update_repository 13 after_destroy :update_repository
  14 + after_create :add_to_team_hooks
  15 + after_destroy :remove_from_team_hooks
  16 +
14 17
15 validates_uniqueness_of :user_id, :scope => [:project_id] 18 validates_uniqueness_of :user_id, :scope => [:project_id]
16 validates_presence_of :user_id 19 validates_presence_of :user_id
@@ -18,6 +21,31 @@ class UsersProject &lt; ActiveRecord::Base @@ -18,6 +21,31 @@ class UsersProject &lt; ActiveRecord::Base
18 21
19 delegate :name, :email, :to => :user, :prefix => true 22 delegate :name, :email, :to => :user, :prefix => true
20 23
  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 +
21 def self.bulk_import(project, user_ids, project_access) 49 def self.bulk_import(project, user_ids, project_access)
22 UsersProject.transaction do 50 UsersProject.transaction do
23 user_ids.each do |user_id| 51 user_ids.each do |user_id|
@@ -68,7 +96,7 @@ class UsersProject &lt; ActiveRecord::Base @@ -68,7 +96,7 @@ class UsersProject &lt; ActiveRecord::Base
68 end 96 end
69 97
70 def repo_access_human 98 def repo_access_human
71 - "" 99 + self.class.access_roles.invert[self.project_access]
72 end 100 end
73 end 101 end
74 # == Schema Information 102 # == Schema Information
app/models/web_hook.rb
@@ -13,6 +13,7 @@ class WebHook &lt; ActiveRecord::Base @@ -13,6 +13,7 @@ class WebHook &lt; ActiveRecord::Base
13 def execute(data) 13 def execute(data)
14 WebHook.post(url, body: data.to_json, headers: { "Content-Type" => "application/json" }) 14 WebHook.post(url, body: data.to_json, headers: { "Content-Type" => "application/json" })
15 end 15 end
  16 +
16 end 17 end
17 # == Schema Information 18 # == Schema Information
18 # 19 #
app/workers/system_hook_worker.rb 0 → 100644
@@ -0,0 +1,7 @@ @@ -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
1 mkdir -p tmp/pids 1 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
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