Commit f5908cef authored by Valeriy Sizov's avatar Valeriy Sizov

System Hook: implemented

parent c3857842
...@@ -11,12 +11,11 @@ class Admin::HooksController < ApplicationController ...@@ -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 ...@@ -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 ...@@ -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
......
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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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
# #
......
class SystemHookWorker
@queue = :system_hook
def self.perform(hook_id, data)
SystemHook.find(hook_id).execute data
end
end
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
bundle exec rake environment resque:work QUEUE=* VVERBOSE=1 bundle exec rake environment resque:work QUEUE=post_receive,mailer,system_hook VVERBOSE=1
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment