FEATURE: Webhook for tag events
This commit is contained in:
parent
689144b2bf
commit
434cbc649f
|
@ -110,6 +110,7 @@ class TagsController < ::ApplicationController
|
||||||
tag.name = new_tag_name
|
tag.name = new_tag_name
|
||||||
if tag.save
|
if tag.save
|
||||||
StaffActionLogger.new(current_user).log_custom('renamed_tag', previous_value: params[:tag_id], new_value: new_tag_name)
|
StaffActionLogger.new(current_user).log_custom('renamed_tag', previous_value: params[:tag_id], new_value: new_tag_name)
|
||||||
|
DiscourseEvent.trigger(:tag_updated, tag)
|
||||||
render json: { tag: { id: new_tag_name } }
|
render json: { tag: { id: new_tag_name } }
|
||||||
else
|
else
|
||||||
render_json_error tag.errors.full_messages
|
render_json_error tag.errors.full_messages
|
||||||
|
|
|
@ -62,6 +62,12 @@ module Jobs
|
||||||
args[:payload] = WebHookCategorySerializer.new(category, scope: guardian, root: false).as_json
|
args[:payload] = WebHookCategorySerializer.new(category, scope: guardian, root: false).as_json
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def setup_tag(args)
|
||||||
|
tag = Tag.find(args[:tag_id])
|
||||||
|
return if tag.blank?
|
||||||
|
args[:payload] = TagSerializer.new(tag, scope: guardian, root: false).as_json
|
||||||
|
end
|
||||||
|
|
||||||
def ping_event?(event_type)
|
def ping_event?(event_type)
|
||||||
event_type.to_s == 'ping'.freeze
|
event_type.to_s == 'ping'.freeze
|
||||||
end
|
end
|
||||||
|
|
|
@ -16,6 +16,9 @@ class Tag < ActiveRecord::Base
|
||||||
|
|
||||||
after_save :index_search
|
after_save :index_search
|
||||||
|
|
||||||
|
after_commit :trigger_tag_created_event, on: :create
|
||||||
|
after_commit :trigger_tag_destroyed_event, on: :destroy
|
||||||
|
|
||||||
def self.ensure_consistency!
|
def self.ensure_consistency!
|
||||||
update_topic_counts # topic_count counter cache can miscount
|
update_topic_counts # topic_count counter cache can miscount
|
||||||
end
|
end
|
||||||
|
@ -101,6 +104,16 @@ class Tag < ActiveRecord::Base
|
||||||
def index_search
|
def index_search
|
||||||
SearchIndexer.index(self)
|
SearchIndexer.index(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def trigger_tag_created_event
|
||||||
|
DiscourseEvent.trigger(:tag_created, self)
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
|
def trigger_tag_destroyed_event
|
||||||
|
DiscourseEvent.trigger(:tag_destroyed, self)
|
||||||
|
true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# == Schema Information
|
# == Schema Information
|
||||||
|
|
|
@ -4,6 +4,7 @@ class WebHookEventType < ActiveRecord::Base
|
||||||
USER = 3
|
USER = 3
|
||||||
GROUP = 4
|
GROUP = 4
|
||||||
CATEGORY = 5
|
CATEGORY = 5
|
||||||
|
TAG = 6
|
||||||
|
|
||||||
has_and_belongs_to_many :web_hooks
|
has_and_belongs_to_many :web_hooks
|
||||||
|
|
||||||
|
|
|
@ -62,3 +62,13 @@ end
|
||||||
WebHook.enqueue_hooks(:category, category_id: category.id, event_name: event.to_s)
|
WebHook.enqueue_hooks(:category, category_id: category.id, event_name: event.to_s)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
%i(
|
||||||
|
tag_created
|
||||||
|
tag_updated
|
||||||
|
tag_destroyed
|
||||||
|
).each do |event|
|
||||||
|
DiscourseEvent.on(event) do |tag|
|
||||||
|
WebHook.enqueue_hooks(:tag, tag_id: tag.id, event_name: event.to_s)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -2933,6 +2933,9 @@ en:
|
||||||
category_event:
|
category_event:
|
||||||
name: "Category Event"
|
name: "Category Event"
|
||||||
details: "When a category is created, updated or destroyed."
|
details: "When a category is created, updated or destroyed."
|
||||||
|
tag_event:
|
||||||
|
name: "Tag Event"
|
||||||
|
details: "When a tag is created, updated or destroyed."
|
||||||
delivery_status:
|
delivery_status:
|
||||||
title: "Delivery Status"
|
title: "Delivery Status"
|
||||||
inactive: "Inactive"
|
inactive: "Inactive"
|
||||||
|
|
|
@ -22,3 +22,8 @@ WebHookEventType.seed do |b|
|
||||||
b.id = WebHookEventType::CATEGORY
|
b.id = WebHookEventType::CATEGORY
|
||||||
b.name = "category"
|
b.name = "category"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
WebHookEventType.seed do |b|
|
||||||
|
b.id = WebHookEventType::TAG
|
||||||
|
b.name = "tag"
|
||||||
|
end
|
||||||
|
|
|
@ -55,3 +55,11 @@ Fabricator(:category_web_hook, from: :web_hook) do
|
||||||
web_hook.web_hook_event_types = [transients[:category_hook]]
|
web_hook.web_hook_event_types = [transients[:category_hook]]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Fabricator(:tag_web_hook, from: :web_hook) do
|
||||||
|
transient tag_hook: WebHookEventType.find_by(name: 'tag')
|
||||||
|
|
||||||
|
after_build do |web_hook, transients|
|
||||||
|
web_hook.web_hook_event_types = [transients[:tag_hook]]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -18,6 +18,28 @@ describe Tag do
|
||||||
SiteSetting.min_trust_level_to_tag_topics = 0
|
SiteSetting.min_trust_level_to_tag_topics = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'new' do
|
||||||
|
subject { Fabricate.build(:tag) }
|
||||||
|
|
||||||
|
it 'triggers a extensibility event' do
|
||||||
|
event = DiscourseEvent.track_events { subject.save! }.last
|
||||||
|
|
||||||
|
expect(event[:event_name]).to eq(:tag_created)
|
||||||
|
expect(event[:params].first).to eq(subject)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'destroy' do
|
||||||
|
subject { Fabricate(:tag) }
|
||||||
|
|
||||||
|
it 'triggers a extensibility event' do
|
||||||
|
event = DiscourseEvent.track_events { subject.destroy! }.last
|
||||||
|
|
||||||
|
expect(event[:event_name]).to eq(:tag_destroyed)
|
||||||
|
expect(event[:params].first).to eq(subject)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
it "can delete tags on deleted topics" do
|
it "can delete tags on deleted topics" do
|
||||||
topic.trash!
|
topic.trash!
|
||||||
expect { tag.destroy }.to change { Tag.count }.by(-1)
|
expect { tag.destroy }.to change { Tag.count }.by(-1)
|
||||||
|
|
|
@ -54,6 +54,29 @@ describe TagsController do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#update" do
|
||||||
|
let(:tag) { Fabricate(:tag) }
|
||||||
|
let(:admin) { Fabricate(:admin) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
tag
|
||||||
|
sign_in(admin)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "triggers a extensibility event" do
|
||||||
|
event = DiscourseEvent.track_events {
|
||||||
|
put "/tags/#{tag.name}.json", params: {
|
||||||
|
tag: {
|
||||||
|
id: 'hello'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.last
|
||||||
|
|
||||||
|
expect(event[:event_name]).to eq(:tag_updated)
|
||||||
|
expect(event[:params].first).to eq(tag)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '#personal_messages' do
|
describe '#personal_messages' do
|
||||||
let(:regular_user) { Fabricate(:trust_level_4) }
|
let(:regular_user) { Fabricate(:trust_level_4) }
|
||||||
let(:moderator) { Fabricate(:moderator) }
|
let(:moderator) { Fabricate(:moderator) }
|
||||||
|
|
Loading…
Reference in New Issue