diff --git a/app/controllers/admin/hooks_controller.rb b/app/controllers/admin/hooks_controller.rb index 2e47b6c2c4e..446d4ea90a6 100644 --- a/app/controllers/admin/hooks_controller.rb +++ b/app/controllers/admin/hooks_controller.rb @@ -11,12 +11,11 @@ class Admin::HooksController < ApplicationController def create @hook = SystemHook.new(params[:hook]) - respond_to do |format| - if @hook.save - format.html { redirect_to admin_hooks_path, notice: 'Hook was successfully created.' } - else - format.html { render :index } - end + if @hook.save + redirect_to admin_hooks_path, notice: 'Hook was successfully created.' + else + @hooks = SystemHook.all + render :index end end diff --git a/app/models/project.rb b/app/models/project.rb index 4773cf373f3..d3dac34ae89 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -107,6 +107,32 @@ class Project < ActiveRecord::Base validate :check_limit validate :repo_name + after_create :create_hooks + after_destroy :destroy_hooks + + def create_hooks + SystemHook.all_hooks_fire({ + event_name: "project_create", + name: self.name, + path: self.path, + project_id: self.id, + owner_name: self.owner.name, + owner_email: self.owner.email, + created_at: self.created_at + }) + end + + def destroy_hooks + SystemHook.all_hooks_fire({ + event_name: "project_destroy", + name: self.name, + path: self.path, + project_id: self.id, + owner_name: self.owner.name, + owner_email: self.owner.email, + }) + end + def check_limit unless owner.can_create_project? errors[:base] << ("Your own projects limit is #{owner.projects_limit}! Please contact administrator to increase it") @@ -120,7 +146,7 @@ class Project < ActiveRecord::Base errors.add(:path, " like 'gitolite-admin' is not allowed") end end - + def self.access_options UsersProject.access_roles end diff --git a/app/models/system_hook.rb b/app/models/system_hook.rb index 178b7585d5b..8517d43a9de 100644 --- a/app/models/system_hook.rb +++ b/app/models/system_hook.rb @@ -1,3 +1,13 @@ class SystemHook < WebHook + + def async_execute(data) + Resque.enqueue(SystemHookWorker, id, data) + end + def self.all_hooks_fire(data) + SystemHook.all.each do |sh| + sh.async_execute data + end + end + end diff --git a/app/models/user.rb b/app/models/user.rb index a3e08fa7d0b..8eb114c4727 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -57,6 +57,25 @@ class User < ActiveRecord::Base scope :active, where(:blocked => false) before_validation :generate_password, :on => :create + after_create :create_hooks + after_destroy :destroy_hooks + + def create_hooks + SystemHook.all_hooks_fire({ + event_name: "user_create", + name: self.name, + email: self.email, + created_at: self.created_at + }) + end + + def destroy_hooks + SystemHook.all_hooks_fire({ + event_name: "user_destroy", + name: self.name, + email: self.email + }) + end def generate_password if self.force_random_password diff --git a/app/models/users_project.rb b/app/models/users_project.rb index 6ba72370931..128e61b7682 100644 --- a/app/models/users_project.rb +++ b/app/models/users_project.rb @@ -11,6 +11,9 @@ class UsersProject < ActiveRecord::Base after_save :update_repository after_destroy :update_repository + after_create :add_to_team_hooks + after_destroy :remove_from_team_hooks + validates_uniqueness_of :user_id, :scope => [:project_id] validates_presence_of :user_id @@ -18,6 +21,31 @@ class UsersProject < ActiveRecord::Base delegate :name, :email, :to => :user, :prefix => true + def add_to_team_hooks + SystemHook.all_hooks_fire({ + event_name: "user_add_to_team", + project_name: self.project.name, + project_path: self.project.path, + project_id: self.project_id, + user_name: self.user.name, + user_email: self.user.email, + project_access: self.repo_access_human, + created_at: self.created_at + }) + end + + def remove_from_team_hooks + SystemHook.all_hooks_fire({ + event_name: "user_remove_from_team", + project_name: self.project.name, + project_path: self.project.path, + project_id: self.project_id, + user_name: self.user.name, + user_email: self.user.email, + project_access: self.repo_access_human + }) + end + def self.bulk_import(project, user_ids, project_access) UsersProject.transaction do user_ids.each do |user_id| @@ -68,7 +96,7 @@ class UsersProject < ActiveRecord::Base end def repo_access_human - "" + self.class.access_roles.invert[self.project_access] end end # == Schema Information diff --git a/app/models/web_hook.rb b/app/models/web_hook.rb index 7a0423481db..85d87898682 100644 --- a/app/models/web_hook.rb +++ b/app/models/web_hook.rb @@ -13,6 +13,7 @@ class WebHook < ActiveRecord::Base def execute(data) WebHook.post(url, body: data.to_json, headers: { "Content-Type" => "application/json" }) end + end # == Schema Information # diff --git a/app/workers/system_hook_worker.rb b/app/workers/system_hook_worker.rb new file mode 100644 index 00000000000..ca154136b97 --- /dev/null +++ b/app/workers/system_hook_worker.rb @@ -0,0 +1,7 @@ +class SystemHookWorker + @queue = :system_hook + + def self.perform(hook_id, data) + SystemHook.find(hook_id).execute data + end +end diff --git a/resque.sh b/resque.sh index ce7c944b735..ab67c650805 100755 --- a/resque.sh +++ b/resque.sh @@ -1,2 +1,2 @@ mkdir -p tmp/pids -bundle exec rake environment resque:work QUEUE=post_receive,mailer RAILS_ENV=production PIDFILE=tmp/pids/resque_worker.pid BACKGROUND=yes +bundle exec rake environment resque:work QUEUE=post_receive,mailer,system_hook RAILS_ENV=production PIDFILE=tmp/pids/resque_worker.pid BACKGROUND=yes diff --git a/resque_dev.sh b/resque_dev.sh index 9df4dc1d087..b09cfd9e383 100755 --- a/resque_dev.sh +++ b/resque_dev.sh @@ -1 +1 @@ -bundle exec rake environment resque:work QUEUE=* VVERBOSE=1 +bundle exec rake environment resque:work QUEUE=post_receive,mailer,system_hook VVERBOSE=1