System Hook: implemented
This commit is contained in:
parent
c38578428b
commit
f5908cef19
9 changed files with 100 additions and 10 deletions
|
@ -11,12 +11,11 @@ class Admin::HooksController < ApplicationController
|
||||||
def create
|
def create
|
||||||
@hook = SystemHook.new(params[:hook])
|
@hook = SystemHook.new(params[:hook])
|
||||||
|
|
||||||
respond_to do |format|
|
if @hook.save
|
||||||
if @hook.save
|
redirect_to admin_hooks_path, notice: 'Hook was successfully created.'
|
||||||
format.html { redirect_to admin_hooks_path, notice: 'Hook was successfully created.' }
|
else
|
||||||
else
|
@hooks = SystemHook.all
|
||||||
format.html { render :index }
|
render :index
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -107,6 +107,32 @@ class Project < ActiveRecord::Base
|
||||||
validate :check_limit
|
validate :check_limit
|
||||||
validate :repo_name
|
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
|
def check_limit
|
||||||
unless owner.can_create_project?
|
unless owner.can_create_project?
|
||||||
errors[:base] << ("Your own projects limit is #{owner.projects_limit}! Please contact administrator to increase it")
|
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")
|
errors.add(:path, " like 'gitolite-admin' is not allowed")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.access_options
|
def self.access_options
|
||||||
UsersProject.access_roles
|
UsersProject.access_roles
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,3 +1,13 @@
|
||||||
class SystemHook < WebHook
|
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
|
end
|
||||||
|
|
|
@ -57,6 +57,25 @@ class User < ActiveRecord::Base
|
||||||
scope :active, where(:blocked => false)
|
scope :active, where(:blocked => false)
|
||||||
|
|
||||||
before_validation :generate_password, :on => :create
|
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
|
def generate_password
|
||||||
if self.force_random_password
|
if self.force_random_password
|
||||||
|
|
|
@ -11,6 +11,9 @@ class UsersProject < ActiveRecord::Base
|
||||||
|
|
||||||
after_save :update_repository
|
after_save :update_repository
|
||||||
after_destroy :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_uniqueness_of :user_id, :scope => [:project_id]
|
||||||
validates_presence_of :user_id
|
validates_presence_of :user_id
|
||||||
|
@ -18,6 +21,31 @@ class UsersProject < ActiveRecord::Base
|
||||||
|
|
||||||
delegate :name, :email, :to => :user, :prefix => true
|
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)
|
def self.bulk_import(project, user_ids, project_access)
|
||||||
UsersProject.transaction do
|
UsersProject.transaction do
|
||||||
user_ids.each do |user_id|
|
user_ids.each do |user_id|
|
||||||
|
@ -68,7 +96,7 @@ class UsersProject < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def repo_access_human
|
def repo_access_human
|
||||||
""
|
self.class.access_roles.invert[self.project_access]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
# == Schema Information
|
# == Schema Information
|
||||||
|
|
|
@ -13,6 +13,7 @@ class WebHook < ActiveRecord::Base
|
||||||
def execute(data)
|
def execute(data)
|
||||||
WebHook.post(url, body: data.to_json, headers: { "Content-Type" => "application/json" })
|
WebHook.post(url, body: data.to_json, headers: { "Content-Type" => "application/json" })
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
# == Schema Information
|
# == Schema Information
|
||||||
#
|
#
|
||||||
|
|
7
app/workers/system_hook_worker.rb
Normal file
7
app/workers/system_hook_worker.rb
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
class SystemHookWorker
|
||||||
|
@queue = :system_hook
|
||||||
|
|
||||||
|
def self.perform(hook_id, data)
|
||||||
|
SystemHook.find(hook_id).execute data
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,2 +1,2 @@
|
||||||
mkdir -p tmp/pids
|
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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue