From a16b616861ec25f28f05bb18d48ed111e56a7b0f Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 11 Apr 2018 19:47:05 +0530 Subject: [PATCH] FEATURE: webhook for flag events --- app/jobs/regular/emit_web_hook_event.rb | 6 +++ app/models/post_action.rb | 7 ++++ app/models/web_hook_event_type.rb | 1 + app/serializers/web_hook_flag_serializer.rb | 43 +++++++++++++++++++++ config/initializers/012-web_hook_events.rb | 11 ++++++ config/locales/client.en.yml | 3 ++ db/fixtures/007_web_hook_event_types.rb | 5 +++ spec/fabricators/web_hook_fabricator.rb | 8 ++++ spec/models/post_action_spec.rb | 32 +++++++++++++++ 9 files changed, 116 insertions(+) create mode 100644 app/serializers/web_hook_flag_serializer.rb diff --git a/app/jobs/regular/emit_web_hook_event.rb b/app/jobs/regular/emit_web_hook_event.rb index 4a6f3c1c6f9..5ec6f4fa681 100644 --- a/app/jobs/regular/emit_web_hook_event.rb +++ b/app/jobs/regular/emit_web_hook_event.rb @@ -68,6 +68,12 @@ module Jobs args[:payload] = TagSerializer.new(tag, scope: guardian, root: false).as_json end + def setup_flag(args) + flag = PostAction.find(args[:flag_id]) + return if flag.blank? + args[:payload] = WebHookFlagSerializer.new(flag, scope: guardian, root: false).as_json + end + def ping_event?(event_type) event_type.to_s == 'ping'.freeze end diff --git a/app/models/post_action.rb b/app/models/post_action.rb index 6a499aa0179..8e705527cdf 100644 --- a/app/models/post_action.rb +++ b/app/models/post_action.rb @@ -155,6 +155,7 @@ SQL DiscourseEvent.trigger(:confirmed_spam_post, post) if trigger_spam DiscourseEvent.trigger(:flag_reviewed, post) + DiscourseEvent.trigger(:flag_agreed, actions.first) if actions.first.present? update_flagged_posts_count end @@ -188,6 +189,7 @@ SQL Post.with_deleted.where(id: post.id).update_all(cached) DiscourseEvent.trigger(:flag_reviewed, post) + DiscourseEvent.trigger(:flag_disagreed, actions.first) if actions.first.present? update_flagged_posts_count end @@ -206,6 +208,7 @@ SQL end DiscourseEvent.trigger(:flag_reviewed, post) + DiscourseEvent.trigger(:flag_deferred, actions.first) if actions.first.present? update_flagged_posts_count end @@ -306,6 +309,10 @@ SQL end end + if post_action && PostActionType.notify_flag_type_ids.include?(post_action_type_id) + DiscourseEvent.trigger(:flag_created, post_action) + end + GivenDailyLike.increment_for(user.id) if post_action_type_id == PostActionType.types[:like] # agree with other flags diff --git a/app/models/web_hook_event_type.rb b/app/models/web_hook_event_type.rb index f61048bcfc0..7d6d595566f 100644 --- a/app/models/web_hook_event_type.rb +++ b/app/models/web_hook_event_type.rb @@ -5,6 +5,7 @@ class WebHookEventType < ActiveRecord::Base GROUP = 4 CATEGORY = 5 TAG = 6 + FLAG = 7 has_and_belongs_to_many :web_hooks diff --git a/app/serializers/web_hook_flag_serializer.rb b/app/serializers/web_hook_flag_serializer.rb new file mode 100644 index 00000000000..67674fef8ef --- /dev/null +++ b/app/serializers/web_hook_flag_serializer.rb @@ -0,0 +1,43 @@ +class WebHookFlagSerializer < ApplicationSerializer + attributes :id, + :post, + :flag_type, + :created_by, + :created_at, + :resolved_at, + :resolved_by + + def post + BasicPostSerializer.new(object.post, scope: scope, root: false).as_json + end + + def flag_type + object.post_action_type_key + end + + def include_post? + object.post.present? + end + + def created_by + object.user && object.user.username + end + + def resolved_at + object.disposed_at + end + + def include_resolved_at? + object.disposed_at.present? + end + + def resolved_by + if object.disposed_by_id.present? + User.find(object.disposed_by_id).username + end + end + + def include_resolved_by? + object.disposed_by_id.present? + end +end diff --git a/config/initializers/012-web_hook_events.rb b/config/initializers/012-web_hook_events.rb index a4b398ada44..17ab7ad0dd5 100644 --- a/config/initializers/012-web_hook_events.rb +++ b/config/initializers/012-web_hook_events.rb @@ -72,3 +72,14 @@ end WebHook.enqueue_hooks(:tag, tag_id: tag.id, event_name: event.to_s) end end + +%i( + flag_created + flag_agreed + flag_disagreed + flag_deferred +).each do |event| + DiscourseEvent.on(event) do |flag| + WebHook.enqueue_hooks(:flag, flag_id: flag.id, event_name: event.to_s) + end +end diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 4dc87b52df7..1180bda2be0 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -2957,6 +2957,9 @@ en: tag_event: name: "Tag Event" details: "When a tag is created, updated or destroyed." + flag_event: + name: "Flag Event" + details: "When a flag is created, agreed, disagreed or deferred." delivery_status: title: "Delivery Status" inactive: "Inactive" diff --git a/db/fixtures/007_web_hook_event_types.rb b/db/fixtures/007_web_hook_event_types.rb index eb627b7f260..8aa08591607 100644 --- a/db/fixtures/007_web_hook_event_types.rb +++ b/db/fixtures/007_web_hook_event_types.rb @@ -27,3 +27,8 @@ WebHookEventType.seed do |b| b.id = WebHookEventType::TAG b.name = "tag" end + +WebHookEventType.seed do |b| + b.id = WebHookEventType::FLAG + b.name = "flag" +end diff --git a/spec/fabricators/web_hook_fabricator.rb b/spec/fabricators/web_hook_fabricator.rb index 4f6f63b6146..f44952891e7 100644 --- a/spec/fabricators/web_hook_fabricator.rb +++ b/spec/fabricators/web_hook_fabricator.rb @@ -63,3 +63,11 @@ Fabricator(:tag_web_hook, from: :web_hook) do web_hook.web_hook_event_types = [transients[:tag_hook]] end end + +Fabricator(:flag_web_hook, from: :web_hook) do + transient flag_hook: WebHookEventType.find_by(name: 'flag') + + after_build do |web_hook, transients| + web_hook.web_hook_event_types = [transients[:flag_hook]] + end +end diff --git a/spec/models/post_action_spec.rb b/spec/models/post_action_spec.rb index dce6e5675ef..da30be3cc94 100644 --- a/spec/models/post_action_spec.rb +++ b/spec/models/post_action_spec.rb @@ -710,4 +710,36 @@ describe PostAction do end end + describe "triggers webhook events" do + let(:post) { Fabricate(:post) } + + it 'flag created' do + event = DiscourseEvent.track_events { PostAction.act(eviltrout, post, PostActionType.types[:spam]) }.last + expect(event[:event_name]).to eq(:flag_created) + end + + context "resolving flags" do + before do + @flag = PostAction.act(eviltrout, post, PostActionType.types[:spam]) + end + + it 'flag agreed' do + event = DiscourseEvent.track_events { PostAction.agree_flags!(post, moderator) }.last + expect(event[:event_name]).to eq(:flag_agreed) + expect(event[:params].first).to eq(@flag) + end + + it 'flag disagreed' do + event = DiscourseEvent.track_events { PostAction.clear_flags!(post, moderator) }.last + expect(event[:event_name]).to eq(:flag_disagreed) + expect(event[:params].first).to eq(@flag) + end + + it 'flag deferred' do + event = DiscourseEvent.track_events { PostAction.defer_flags!(post, moderator) }.last + expect(event[:event_name]).to eq(:flag_deferred) + expect(event[:params].first).to eq(@flag) + end + end + end end