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 12 #
13 13  
14 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 15 end
... ...
app/observers/system_hook_observer.rb
1 1 class SystemHookObserver < ActiveRecord::Observer
2 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 6 end
37 7  
38 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 10 end
67 11 end
... ...
app/services/system_hooks_service.rb 0 → 100644
... ... @@ -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 @@
  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
... ...