Merge pull request #5705 from discourse/new_webhooks

FEATURE: Webhook for group and category events
This commit is contained in:
Vinoth Kannan
2018-04-02 10:53:21 +05:30
committed by GitHub
18 changed files with 214 additions and 13 deletions

View File

@@ -55,7 +55,10 @@ class Admin::GroupsController < Admin::AdminController
# group rename is ignored for automatic groups
group.name = group_params[:name] if group_params[:name] && !group.automatic
save_group(group) { |g| GroupActionLogger.new(current_user, g).log_change_group_settings }
save_group(group) do |group|
GroupActionLogger.new(current_user, group).log_change_group_settings
DiscourseEvent.trigger(:group_updated, group)
end
end
def save_group(group)

View File

@@ -149,6 +149,7 @@ class CategoriesController < ApplicationController
old_permissions = cat.permissions_params
if result = cat.update(category_params)
DiscourseEvent.trigger(:category_updated, cat)
Scheduler::Defer.later "Log staff action change category settings" do
@staff_action_logger.log_category_settings_change(@category, category_params, old_permissions)
end
@@ -165,6 +166,7 @@ class CategoriesController < ApplicationController
custom_slug = params[:slug].to_s
if custom_slug.present? && @category.update_attributes(slug: custom_slug)
DiscourseEvent.trigger(:category_updated, @category)
render json: success_json
else
render_json_error(@category)

View File

@@ -137,6 +137,7 @@ class GroupsController < ApplicationController
if group.update_attributes(group_params)
GroupActionLogger.new(current_user, group).log_change_group_settings
DiscourseEvent.trigger(:group_updated, group)
render json: success_json
else

View File

@@ -50,6 +50,18 @@ module Jobs
args[:payload] = WebHookUserSerializer.new(user, scope: guardian, root: false).as_json
end
def setup_group(args)
group = Group.find(args[:group_id])
return if group.blank?
args[:payload] = WebHookGroupSerializer.new(group, scope: guardian, root: false).as_json
end
def setup_category(args)
category = Category.find(args[:category_id])
return if category.blank?
args[:payload] = WebHookCategorySerializer.new(category, scope: guardian, root: false).as_json
end
def ping_event?(event_type)
event_type.to_s == 'ping'.freeze
end

View File

@@ -61,6 +61,9 @@ class Category < ActiveRecord::Base
after_update :rename_category_definition, if: :saved_change_to_name?
after_update :create_category_permalink, if: :saved_change_to_slug?
after_commit :trigger_category_created_event, on: :create
after_commit :trigger_category_destroyed_event, on: :destroy
belongs_to :parent_category, class_name: 'Category'
has_many :subcategories, class_name: 'Category', foreign_key: 'parent_category_id'
@@ -508,6 +511,16 @@ SQL
def subcategory_list_includes_topics?
subcategory_list_style.end_with?("with_featured_topics")
end
def trigger_category_created_event
DiscourseEvent.trigger(:category_created, self)
true
end
def trigger_category_destroyed_event
DiscourseEvent.trigger(:category_destroyed, self)
true
end
end
# == Schema Information

View File

@@ -35,6 +35,9 @@ class Group < ActiveRecord::Base
after_save :expire_cache
after_destroy :expire_cache
after_commit :trigger_group_created_event, on: :create
after_commit :trigger_group_destroyed_event, on: :destroy
def expire_cache
ApplicationSerializer.expire_cache_fragment!("group_names")
end
@@ -580,6 +583,16 @@ class Group < ActiveRecord::Base
self.member_of(groups, user).where("gu.owner")
end
def trigger_group_created_event
DiscourseEvent.trigger(:group_created, self)
true
end
def trigger_group_destroyed_event
DiscourseEvent.trigger(:group_destroyed, self)
true
end
protected
def name_format_validator

View File

@@ -2,6 +2,8 @@ class WebHookEventType < ActiveRecord::Base
TOPIC = 1
POST = 2
USER = 3
GROUP = 4
CATEGORY = 5
has_and_belongs_to_many :web_hooks

View File

@@ -0,0 +1,12 @@
class WebHookCategorySerializer < CategorySerializer
%i{
can_edit
notification_level
}.each do |attr|
define_method("include_#{attr}?") do
false
end
end
end

View File

@@ -0,0 +1,12 @@
class WebHookGroupSerializer < GroupShowSerializer
%i{
is_group_user
is_group_owner
}.each do |attr|
define_method("include_#{attr}?") do
false
end
end
end