FEATURE: trigger webhook when a user added/removed in a group. (#12653)
Whenever a group is added or removed from a group a webhook event will get triggered if it's active.
This commit is contained in:
parent
38e7fe2770
commit
26d7eedf4c
|
@ -643,10 +643,18 @@ class Group < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def remove(user)
|
def remove(user)
|
||||||
result = self.group_users.where(user: user).each(&:destroy)
|
group_user = self.group_users.find_by(user: user)
|
||||||
return false if result.blank?
|
return false if group_user.blank?
|
||||||
|
|
||||||
|
has_webhooks = WebHook.active_web_hooks(:group_user)
|
||||||
|
payload = WebHook.generate_payload(:group_user, group_user, WebHookGroupUserSerializer) if has_webhooks
|
||||||
|
group_user.destroy
|
||||||
user.update_columns(primary_group_id: nil) if user.primary_group_id == self.id
|
user.update_columns(primary_group_id: nil) if user.primary_group_id == self.id
|
||||||
DiscourseEvent.trigger(:user_removed_from_group, user, self)
|
DiscourseEvent.trigger(:user_removed_from_group, user, self)
|
||||||
|
WebHook.enqueue_hooks(:group_user, :user_removed_from_group,
|
||||||
|
id: group_user.id,
|
||||||
|
payload: payload
|
||||||
|
) if has_webhooks
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ class WebHookEventType < ActiveRecord::Base
|
||||||
SOLVED = 11
|
SOLVED = 11
|
||||||
ASSIGN = 12
|
ASSIGN = 12
|
||||||
USER_BADGE = 13
|
USER_BADGE = 13
|
||||||
|
GROUP_USER = 14
|
||||||
|
|
||||||
has_and_belongs_to_many :web_hooks
|
has_and_belongs_to_many :web_hooks
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class WebHookGroupUserSerializer < BasicGroupUserSerializer
|
||||||
|
attributes :id,
|
||||||
|
:created_at
|
||||||
|
end
|
|
@ -95,3 +95,8 @@ end
|
||||||
DiscourseEvent.on(:notification_created) do |notification|
|
DiscourseEvent.on(:notification_created) do |notification|
|
||||||
WebHook.enqueue_object_hooks(:notification, notification, :notification_created, NotificationSerializer)
|
WebHook.enqueue_object_hooks(:notification, notification, :notification_created, NotificationSerializer)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
DiscourseEvent.on(:user_added_to_group) do |user, group, options|
|
||||||
|
group_user = GroupUser.find_by(user: user, group: group)
|
||||||
|
WebHook.enqueue_object_hooks(:group_user, group_user, :user_added_to_group, WebHookGroupUserSerializer)
|
||||||
|
end
|
||||||
|
|
|
@ -4018,6 +4018,9 @@ en:
|
||||||
user_badge_event:
|
user_badge_event:
|
||||||
name: "Badge Grant Event"
|
name: "Badge Grant Event"
|
||||||
details: "When a user receives a badge."
|
details: "When a user receives a badge."
|
||||||
|
group_user_event:
|
||||||
|
name: "Group User Event"
|
||||||
|
details: "When a user is added or removed in a group."
|
||||||
delivery_status:
|
delivery_status:
|
||||||
title: "Delivery Status"
|
title: "Delivery Status"
|
||||||
inactive: "Inactive"
|
inactive: "Inactive"
|
||||||
|
|
|
@ -54,3 +54,8 @@ WebHookEventType.seed do |b|
|
||||||
b.id = WebHookEventType::USER_BADGE
|
b.id = WebHookEventType::USER_BADGE
|
||||||
b.name = "user_badge"
|
b.name = "user_badge"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
WebHookEventType.seed do |b|
|
||||||
|
b.id = WebHookEventType::GROUP_USER
|
||||||
|
b.name = "group_user"
|
||||||
|
end
|
||||||
|
|
|
@ -94,3 +94,11 @@ Fabricator(:user_badge_web_hook, from: :web_hook) do
|
||||||
web_hook.web_hook_event_types = [transients[:user_badge_hook]]
|
web_hook.web_hook_event_types = [transients[:user_badge_hook]]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Fabricator(:group_user_web_hook, from: :web_hook) do
|
||||||
|
transient group_user_hook: WebHookEventType.find_by(name: 'group_user')
|
||||||
|
|
||||||
|
after_build do |web_hook, transients|
|
||||||
|
web_hook.web_hook_event_types = [transients[:group_user_hook]]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -519,5 +519,40 @@ describe WebHook do
|
||||||
|
|
||||||
# Future work: revoke badge hook
|
# Future work: revoke badge hook
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'should enqueue the right hooks for group user addition' do
|
||||||
|
Fabricate(:group_user_web_hook)
|
||||||
|
group = Fabricate(:group)
|
||||||
|
|
||||||
|
now = Time.now
|
||||||
|
freeze_time now
|
||||||
|
|
||||||
|
group.add(user)
|
||||||
|
|
||||||
|
job_args = Jobs::EmitWebHookEvent.jobs.last["args"].first
|
||||||
|
expect(job_args["event_name"]).to eq("user_added_to_group")
|
||||||
|
payload = JSON.parse(job_args["payload"])
|
||||||
|
expect(payload["group_id"]).to eq(group.id)
|
||||||
|
expect(payload["user_id"]).to eq(user.id)
|
||||||
|
expect(payload["notification_level"]).to eq(group.default_notification_level)
|
||||||
|
expect(Time.zone.parse(payload["created_at"]).to_f).to be_within(0.001).of(now.to_f)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should enqueue the right hooks for group user deletion' do
|
||||||
|
Fabricate(:group_user_web_hook)
|
||||||
|
group = Fabricate(:group)
|
||||||
|
group_user = Fabricate(:group_user, group: group, user: user)
|
||||||
|
|
||||||
|
now = Time.now
|
||||||
|
freeze_time now
|
||||||
|
|
||||||
|
group.remove(user)
|
||||||
|
|
||||||
|
job_args = Jobs::EmitWebHookEvent.jobs.last["args"].first
|
||||||
|
expect(job_args["event_name"]).to eq("user_removed_from_group")
|
||||||
|
payload = JSON.parse(job_args["payload"])
|
||||||
|
expect(payload["group_id"]).to eq(group.id)
|
||||||
|
expect(payload["user_id"]).to eq(user.id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue