diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 7caf5b8c73f..72d33b7abe0 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -480,6 +480,17 @@ class GroupsController < ApplicationController user = User.find_by(id: params[:user_id]) raise Discourse::InvalidParameters.new(:user_id) if user.blank? + # find original membership request PM + request_topic = + Topic.find_by( + title: + ( + I18n.t "groups.request_membership_pm.title", group_name: group.name, locale: user.locale + ), + archetype: "private_message", + user_id: user.id, + ) + ActiveRecord::Base.transaction do if params[:accept] group.add(user) @@ -492,9 +503,11 @@ class GroupsController < ApplicationController if params[:accept] PostCreator.new( current_user, - title: I18n.t("groups.request_accepted_pm.title", group_name: group.name), - raw: I18n.t("groups.request_accepted_pm.body", group_name: group.name), - archetype: Archetype.private_message, + post_type: Post.types[:regular], + topic_id: request_topic.id, + raw: + (I18n.t "groups.request_accepted_pm.body", group_name: group.name, locale: user.locale), + reply_to_post_number: 1, target_usernames: user.username, skip_validations: true, ).create! diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 9a6d3d8e733..0cac6c40c42 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -638,7 +638,6 @@ en: request_membership_pm: title: "Membership Request for @%{group_name}" request_accepted_pm: - title: "You've been accepted into @%{group_name}" body: | Your request to enter @%{group_name} has been accepted and you are now a member. diff --git a/spec/requests/groups_controller_spec.rb b/spec/requests/groups_controller_spec.rb index 423b672afda..3afc1cae506 100644 --- a/spec/requests/groups_controller_spec.rb +++ b/spec/requests/groups_controller_spec.rb @@ -2267,21 +2267,83 @@ RSpec.describe GroupsController do sign_in(user) end - it "sends a private message when accepted" do + it "sends a reply to the request membership topic when accepted" do GroupRequest.create!(group: group, user: other_user) + + # send the initial request PM + PostCreator.new( + other_user, + title: I18n.t("groups.request_membership_pm.title", group_name: group.name), + raw: "*British accent* Please, sir, may I have some group?", + archetype: Archetype.private_message, + target_usernames: "#{user.username}", + skip_validations: true, + ).create! + + topic = Topic.last + expect { put "/groups/#{group.id}/handle_membership_request.json", params: { user_id: other_user.id, accept: true, } - }.to change { Topic.count }.by(1).and change { Post.count }.by(1) + }.to_not change { Topic.count } + + expect(topic.archetype).to eq(Archetype.private_message) + expect(Topic.first.title).to eq( + I18n.t("groups.request_membership_pm.title", group_name: group.name), + ) + + post = Post.last + expect(post.topic_id).to eq(Topic.last.id) + expect(topic.posts.count).to eq(2) + expect(post.raw).to eq( + I18n.t("groups.request_accepted_pm.body", group_name: group.name).strip, + ) + end + + it "sends accepted membership request reply even if request is in another language" do + SiteSetting.allow_user_locale = true + other_user.update!(locale: "fr") + + GroupRequest.create!(group: group, user: other_user) + + # send the initial request PM + PostCreator.new( + other_user, + title: + ( + I18n.t "groups.request_membership_pm.title", + group_name: group.name, + locale: other_user.locale + ), + raw: "*French accent* Please let me in!", + archetype: Archetype.private_message, + target_usernames: "#{user.username}", + skip_validations: true, + ).create! topic = Topic.last + + expect { + put "/groups/#{group.id}/handle_membership_request.json", + params: { + user_id: other_user.id, + accept: true, + } + }.to_not change { Topic.count } + expect(topic.archetype).to eq(Archetype.private_message) - expect(topic.title).to eq(I18n.t("groups.request_accepted_pm.title", group_name: group.name)) - expect(topic.first_post.raw).to eq( - I18n.t("groups.request_accepted_pm.body", group_name: group.name).strip, + expect(Topic.first.title).to eq( + I18n.t("groups.request_membership_pm.title", group_name: group.name, locale: "fr"), + ) + + post = Post.last + expect(post.topic_id).to eq(Topic.last.id) + expect(topic.posts.count).to eq(2) + expect(post.raw).to eq( + I18n.t("groups.request_accepted_pm.body", group_name: group.name, locale: "fr").strip, ) end end