diff --git a/app/assets/javascripts/discourse-common/lib/icon-library.js.es6 b/app/assets/javascripts/discourse-common/lib/icon-library.js.es6 index 9821368c86e..726b49cfdea 100644 --- a/app/assets/javascripts/discourse-common/lib/icon-library.js.es6 +++ b/app/assets/javascripts/discourse-common/lib/icon-library.js.es6 @@ -35,7 +35,8 @@ const REPLACEMENTS = { "notification.topic_reminder": "far-clock", "notification.watching_first_post": "far-dot-circle", "notification.group_message_summary": "users", - "notification.post_approved": "check" + "notification.post_approved": "check", + "notification.membership_request_accepted": "user-plus" }; // TODO: use lib/svg_sprite/fa4-renames.json here diff --git a/app/assets/javascripts/discourse/widgets/membership-request-accepted-notification-item.js.es6 b/app/assets/javascripts/discourse/widgets/membership-request-accepted-notification-item.js.es6 new file mode 100644 index 00000000000..de5d2efcedf --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/membership-request-accepted-notification-item.js.es6 @@ -0,0 +1,19 @@ +import { createWidgetFrom } from "discourse/widgets/widget"; +import { DefaultNotificationItem } from "discourse/widgets/default-notification-item"; +import { groupPath } from "discourse/lib/url"; + +createWidgetFrom( + DefaultNotificationItem, + "membership-request-accepted-notification-item", + { + url(data) { + return groupPath(data.group_name); + }, + + text(notificationName, data) { + return I18n.t(`notifications.${notificationName}`, { + group_name: data.group_name + }); + } + } +); diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index d1cad42677f..4746262541f 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -351,7 +351,7 @@ class GroupsController < ApplicationController raise Discourse::InvalidParameters.new(:user_id) if user.blank? if params[:accept] - group.add(user) + group.add(user, notify: true) GroupActionLogger.new(current_user, group).log_add_user_to_group(user) end diff --git a/app/models/group.rb b/app/models/group.rb index 92515247ba7..f4bf49a75c2 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -541,9 +541,20 @@ class Group < ActiveRecord::Base PUBLISH_CATEGORIES_LIMIT = 10 - def add(user) + def add(user, notify: false) self.users.push(user) unless self.users.include?(user) + if notify + Notification.create!( + notification_type: Notification.types[:membership_request_accepted], + user_id: user.id, + data: { + group_id: id, + group_name: name + }.to_json + ) + end + if self.categories.count < PUBLISH_CATEGORIES_LIMIT MessageBus.publish('/categories', { categories: ActiveModel::ArraySerializer.new(self.categories).as_json diff --git a/app/models/notification.rb b/app/models/notification.rb index ab420cbb2ec..fdfd00655df 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -64,7 +64,8 @@ class Notification < ActiveRecord::Base topic_reminder: 18, liked_consolidated: 19, post_approved: 20, - code_review_commit_approved: 21 + code_review_commit_approved: 21, + membership_request_accepted: 22 ) end diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 63323facbc2..f0e8a4f6d43 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1730,6 +1730,7 @@ en: granted_badge: "Earned '{{description}}'" topic_reminder: "{{username}} {{description}}" watching_first_post: "New Topic {{description}}" + membership_request_accepted: "Membership accepted in '{{group_name}}'" group_message_summary: one: "{{count}} message in your {{group_name}} inbox" diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb index 42cc6ee7eb9..68656b14fbd 100644 --- a/spec/models/group_spec.rb +++ b/spec/models/group_spec.rb @@ -766,6 +766,14 @@ describe Group do .and change { user.title }.from('AAAA').to('BBBB') end + it "can send a notification to the user" do + expect { group.add(user, notify: true) }.to change { Notification.count }.by(1) + + notification = Notification.last + expect(notification.notification_type).to eq(Notification.types[:membership_request_accepted]) + expect(notification.user_id).to eq(user.id) + end + context 'when adding a user into a public group' do fab!(:category) { Fabricate(:category) } diff --git a/test/javascripts/fixtures/notification_fixtures.js.es6 b/test/javascripts/fixtures/notification_fixtures.js.es6 index 071df77a0d0..9ab4d8d76ef 100644 --- a/test/javascripts/fixtures/notification_fixtures.js.es6 +++ b/test/javascripts/fixtures/notification_fixtures.js.es6 @@ -18,6 +18,38 @@ export default { notification_type: NOTIFICATION_TYPES.liked_consolidated, read: false, data: { display_username: "aquaman", count: "5" } + }, + { + id: 789, + notification_type: NOTIFICATION_TYPES.group_message_summary, + read: false, + post_number: null, + topic_id: null, + slug: null, + data: { + group_id: 41, + group_name: "test", + inbox_count: 5, + username: "test2" + } + }, + { + id: 1234, + notification_type: NOTIFICATION_TYPES.invitee_accepted, + read: false, + post_number: null, + topic_id: null, + slug: null, + data: { display_username: "test1" } + }, + { + id: 5678, + notification_type: NOTIFICATION_TYPES.membership_request_accepted, + read: false, + post_number: null, + topic_id: null, + slug: null, + data: { group_id: 41, group_name: "test" } } ] } diff --git a/test/javascripts/widgets/user-menu-test.js.es6 b/test/javascripts/widgets/user-menu-test.js.es6 index a878a470f4f..66abb7cc877 100644 --- a/test/javascripts/widgets/user-menu-test.js.es6 +++ b/test/javascripts/widgets/user-menu-test.js.es6 @@ -21,7 +21,7 @@ widgetTest("notifications", { test(assert) { const $links = find(".notifications li a"); - assert.equal($links.length, 2); + assert.equal($links.length, 5); assert.ok($links[0].href.includes("/t/a-slug/123")); assert.ok( @@ -36,6 +36,32 @@ widgetTest("notifications", { count: 5 })}` ); + + assert.ok($links[2].href.includes("/u/test2/messages/group/test")); + assert.ok( + $links[2].innerHTML.includes( + I18n.t("notifications.group_message_summary", { + count: 5, + group_name: "test" + }) + ) + ); + + assert.ok($links[3].href.includes("/u/test1")); + assert.ok( + $links[3].innerHTML.includes( + I18n.t("notifications.invitee_accepted", { username: "test1" }) + ) + ); + + assert.ok($links[4].href.includes("/g/test")); + assert.ok( + $links[4].innerHTML.includes( + I18n.t("notifications.membership_request_accepted", { + group_name: "test" + }) + ) + ); } });