Commit 9611640e3891e222a08d9a7ba1a7cc9d73c4e641

Authored by Dmitriy Zaporozhets
2 parents 72d48376 c77730dd

Merge pull request #3052 from Undev/system-hook-observer-improves

System hooks code & logic refactoring
app/models/system_hook.rb
@@ -12,13 +12,4 @@ @@ -12,13 +12,4 @@
12 # 12 #
13 13
14 class SystemHook < WebHook 14 class SystemHook < WebHook
15 - def self.all_hooks_fire(data)  
16 - SystemHook.all.each do |sh|  
17 - sh.async_execute data  
18 - end  
19 - end  
20 -  
21 - def async_execute(data)  
22 - Sidekiq::Client.enqueue(SystemHookWorker, id, data)  
23 - end  
24 end 15 end
app/observers/system_hook_observer.rb
1 class SystemHookObserver < ActiveRecord::Observer 1 class SystemHookObserver < ActiveRecord::Observer
2 observe :user, :project, :users_project 2 observe :user, :project, :users_project
3 -  
4 - def after_create(model)  
5 - if model.kind_of? Project  
6 - SystemHook.all_hooks_fire({  
7 - event_name: "project_create",  
8 - name: model.name,  
9 - path: model.path,  
10 - project_id: model.id,  
11 - owner_name: model.owner.name,  
12 - owner_email: model.owner.email,  
13 - created_at: model.created_at  
14 - })  
15 - elsif model.kind_of? User  
16 - SystemHook.all_hooks_fire({  
17 - event_name: "user_create",  
18 - name: model.name,  
19 - email: model.email,  
20 - created_at: model.created_at  
21 - })  
22 -  
23 - elsif model.kind_of? UsersProject  
24 - SystemHook.all_hooks_fire({  
25 - event_name: "user_add_to_team",  
26 - project_name: model.project.name,  
27 - project_path: model.project.path,  
28 - project_id: model.project_id,  
29 - user_name: model.user.name,  
30 - user_email: model.user.email,  
31 - project_access: model.repo_access_human,  
32 - created_at: model.created_at  
33 - })  
34 3
35 - end 4 + def after_create(model)
  5 + SystemHooksService.execute_hooks_for(model, :create)
36 end 6 end
37 7
38 def after_destroy(model) 8 def after_destroy(model)
39 - if model.kind_of? Project  
40 - SystemHook.all_hooks_fire({  
41 - event_name: "project_destroy",  
42 - name: model.name,  
43 - path: model.path,  
44 - project_id: model.id,  
45 - owner_name: model.owner.name,  
46 - owner_email: model.owner.email,  
47 - })  
48 - elsif model.kind_of? User  
49 - SystemHook.all_hooks_fire({  
50 - event_name: "user_destroy",  
51 - name: model.name,  
52 - email: model.email  
53 - })  
54 -  
55 - elsif model.kind_of? UsersProject  
56 - SystemHook.all_hooks_fire({  
57 - event_name: "user_remove_from_team",  
58 - project_name: model.project.name,  
59 - project_path: model.project.path,  
60 - project_id: model.project_id,  
61 - user_name: model.user.name,  
62 - user_email: model.user.email,  
63 - project_access: model.repo_access_human  
64 - })  
65 - end 9 + SystemHooksService.execute_hooks_for(model, :destroy)
66 end 10 end
67 end 11 end
app/services/system_hooks_service.rb 0 → 100644
@@ -0,0 +1,59 @@ @@ -0,0 +1,59 @@
  1 +class SystemHooksService
  2 + def self.execute_hooks_for(model, event)
  3 + execute_hooks(build_event_data(model, event))
  4 + end
  5 +
  6 + private
  7 +
  8 + def self.execute_hooks(data)
  9 + SystemHook.all.each do |sh|
  10 + async_execute_hook sh, data
  11 + end
  12 + end
  13 +
  14 + def self.async_execute_hook(hook, data)
  15 + Sidekiq::Client.enqueue(SystemHookWorker, hook.id, data)
  16 + end
  17 +
  18 + def self.build_event_data(model, event)
  19 + data = {
  20 + event_name: build_event_name(model, event),
  21 + created_at: model.created_at
  22 + }
  23 +
  24 + case model
  25 + when Project
  26 + data.merge!({
  27 + name: model.name,
  28 + path: model.path,
  29 + project_id: model.id,
  30 + owner_name: model.owner.name,
  31 + owner_email: model.owner.email
  32 + })
  33 + when User
  34 + data.merge!({
  35 + name: model.name,
  36 + email: model.email
  37 + })
  38 + when UsersProject
  39 + data.merge!({
  40 + project_name: model.project.name,
  41 + project_path: model.project.path,
  42 + project_id: model.project_id,
  43 + user_name: model.user.name,
  44 + user_email: model.user.email,
  45 + project_access: model.repo_access_human
  46 + })
  47 + end
  48 + end
  49 +
  50 + def self.build_event_name(model, event)
  51 + case model
  52 + when UsersProject
  53 + return "user_add_to_team" if event == :create
  54 + return "user_remove_from_team" if event == :destroy
  55 + else
  56 + "#{model.class.name.downcase}_#{event.to_s}"
  57 + end
  58 + end
  59 +end
spec/services/system_hooks_service_spec.rb 0 → 100644
@@ -0,0 +1,41 @@ @@ -0,0 +1,41 @@
  1 +require 'spec_helper'
  2 +
  3 +describe SystemHooksService do
  4 + let (:user) { create :user }
  5 + let (:project) { create :project }
  6 + let (:users_project) { create :users_project }
  7 +
  8 + context 'it should build event data' do
  9 + it 'should build event data for user' do
  10 + SystemHooksService.build_event_data(user, :create).should include(:event_name, :name, :created_at, :email)
  11 + end
  12 +
  13 + it 'should build event data for project' do
  14 + SystemHooksService.build_event_data(project, :create).should include(:event_name, :name, :created_at, :path, :project_id, :owner_name, :owner_email)
  15 + end
  16 +
  17 + it 'should build event data for users project' do
  18 + SystemHooksService.build_event_data(users_project, :create).should include(:event_name, :created_at, :project_name, :project_path, :project_id, :user_name, :user_email, :project_access)
  19 + end
  20 + end
  21 +
  22 + context 'it should build event names' do
  23 + it 'should build event names for user' do
  24 + SystemHooksService.build_event_name(user, :create).should eq "user_create"
  25 +
  26 + SystemHooksService.build_event_name(user, :destroy).should eq "user_destroy"
  27 + end
  28 +
  29 + it 'should build event names for project' do
  30 + SystemHooksService.build_event_name(project, :create).should eq "project_create"
  31 +
  32 + SystemHooksService.build_event_name(project, :destroy).should eq "project_destroy"
  33 + end
  34 +
  35 + it 'should build event names for users project' do
  36 + SystemHooksService.build_event_name(users_project, :create).should eq "user_add_to_team"
  37 +
  38 + SystemHooksService.build_event_name(users_project, :destroy).should eq "user_remove_from_team"
  39 + end
  40 + end
  41 +end