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 11 def create
12 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 19 end
21 20 end
22 21  
... ...
app/models/project.rb
... ... @@ -107,6 +107,32 @@ class Project < ActiveRecord::Base
107 107 validate :check_limit
108 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 136 def check_limit
111 137 unless owner.can_create_project?
112 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 146 errors.add(:path, " like 'gitolite-admin' is not allowed")
121 147 end
122 148 end
123   -
  149 +
124 150 def self.access_options
125 151 UsersProject.access_roles
126 152 end
... ...
app/models/system_hook.rb
1 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 13 end
... ...
app/models/user.rb
... ... @@ -57,6 +57,25 @@ class User &lt; ActiveRecord::Base
57 57 scope :active, where(:blocked => false)
58 58  
59 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 80 def generate_password
62 81 if self.force_random_password
... ...
app/models/users_project.rb
... ... @@ -11,6 +11,9 @@ class UsersProject &lt; ActiveRecord::Base
11 11  
12 12 after_save :update_repository
13 13 after_destroy :update_repository
  14 + after_create :add_to_team_hooks
  15 + after_destroy :remove_from_team_hooks
  16 +
14 17  
15 18 validates_uniqueness_of :user_id, :scope => [:project_id]
16 19 validates_presence_of :user_id
... ... @@ -18,6 +21,31 @@ class UsersProject &lt; ActiveRecord::Base
18 21  
19 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 49 def self.bulk_import(project, user_ids, project_access)
22 50 UsersProject.transaction do
23 51 user_ids.each do |user_id|
... ... @@ -68,7 +96,7 @@ class UsersProject &lt; ActiveRecord::Base
68 96 end
69 97  
70 98 def repo_access_human
71   - ""
  99 + self.class.access_roles.invert[self.project_access]
72 100 end
73 101 end
74 102 # == Schema Information
... ...
app/models/web_hook.rb
... ... @@ -13,6 +13,7 @@ class WebHook &lt; ActiveRecord::Base
13 13 def execute(data)
14 14 WebHook.post(url, body: data.to_json, headers: { "Content-Type" => "application/json" })
15 15 end
  16 +
16 17 end
17 18 # == Schema Information
18 19 #
... ...
app/workers/system_hook_worker.rb 0 → 100644
... ... @@ -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 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   -bundle exec rake environment resque:work QUEUE=* VVERBOSE=1
  1 +bundle exec rake environment resque:work QUEUE=post_receive,mailer,system_hook VVERBOSE=1
... ...