FIX: Show membership requests link just for group owners. (#7543)

FIX: Show membership requests link just for group owners. (#7543)

diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb
index c1484c2..d1cad42 100644
--- a/app/controllers/groups_controller.rb
+++ b/app/controllers/groups_controller.rb
@@ -443,20 +443,12 @@ class GroupsController < ApplicationController
         .pluck("users.username")
     )
 
-    raw = <<~EOF
-      #{reason}
-
-      ---
-      <a href="#{Discourse.base_uri}/g/#{group.name}/requests">
-        #{I18n.t('groups.request_membership_pm.handle')}
-      </a>
-    EOF
-
     post = PostCreator.new(current_user,
       title: I18n.t('groups.request_membership_pm.title', group_name: group.name),
-      raw: raw,
+      raw: params[:reason],
       archetype: Archetype.private_message,
       target_usernames: usernames.join(','),
+      custom_fields: { requested_group_id: group.id },
       skip_validations: true
     ).create!
 
diff --git a/app/serializers/basic_post_serializer.rb b/app/serializers/basic_post_serializer.rb
index 5642368..9d57a1c 100644
--- a/app/serializers/basic_post_serializer.rb
+++ b/app/serializers/basic_post_serializer.rb
@@ -38,7 +38,27 @@ class BasicPostSerializer < ApplicationSerializer
         I18n.t('flagging.user_must_edit')
       end
     else
-      object.filter_quotes(@parent_post)
+      cooked = object.filter_quotes(@parent_post)
+
+      if scope&.user
+        group = Group
+          .joins('JOIN group_users ON groups.id = group_users.group_id')
+          .find_by(
+            id: object.custom_fields['requested_group_id'].to_i,
+            group_users: { user_id: scope.user.id, owner: true }
+          )
+
+        if group
+          cooked << <<~EOF
+            <hr />
+            <a href="#{Discourse.base_uri}/g/#{group.name}/requests">
+              #{I18n.t('groups.request_membership_pm.handle')}
+            </a>
+          EOF
+        end
+      end
+
+      cooked
     end
   end
 
diff --git a/lib/topic_view.rb b/lib/topic_view.rb
index 060eaf7..c8ac580 100644
--- a/lib/topic_view.rb
+++ b/lib/topic_view.rb
@@ -40,7 +40,7 @@ class TopicView
   end
 
   def self.default_post_custom_fields
-    @default_post_custom_fields ||= ["action_code_who", "notice_type", "notice_args"]
+    @default_post_custom_fields ||= ["action_code_who", "notice_type", "notice_args", "requested_group_id"]
   end
 
   def self.post_custom_fields_whitelisters
diff --git a/spec/requests/groups_controller_spec.rb b/spec/requests/groups_controller_spec.rb
index e24bad0..002cd64 100644
--- a/spec/requests/groups_controller_spec.rb
+++ b/spec/requests/groups_controller_spec.rb
@@ -1351,6 +1351,7 @@ describe GroupsController do
       body = JSON.parse(response.body)
 
       expect(body['relative_url']).to eq(topic.relative_url)
+      expect(post.custom_fields['requested_group_id'].to_i).to eq(group.id)
       expect(post.user).to eq(user)
 
       expect(topic.title).to eq(I18n.t('groups.request_membership_pm.title',
diff --git a/spec/serializers/basic_post_serializer_spec.rb b/spec/serializers/basic_post_serializer_spec.rb
index 660bd3b..faad104 100644
--- a/spec/serializers/basic_post_serializer_spec.rb
+++ b/spec/serializers/basic_post_serializer_spec.rb
@@ -24,4 +24,27 @@ describe BasicPostSerializer do
 
   end
 
+  context "cooked" do
+    it "includes membership requests" do
+      user = Fabricate(:user)
+      member = Fabricate(:user)
+      owner = Fabricate(:user)
+
+      group = Fabricate(:group)
+      group.add(member)
+      group.add_owner(owner)
+
+      post = Fabricate(:post, custom_fields: { requested_group_id: group.id })
+
+      json = BasicPostSerializer.new(post, scope: Guardian.new(user), root: false).as_json
+      expect(json[:cooked]).not_to include(I18n.t('groups.request_membership_pm.handle'))
+
+      json = BasicPostSerializer.new(post, scope: Guardian.new(member), root: false).as_json
+      expect(json[:cooked]).not_to include(I18n.t('groups.request_membership_pm.handle'))
+
+      json = BasicPostSerializer.new(post, scope: Guardian.new(owner), root: false).as_json
+      expect(json[:cooked]).to include(I18n.t('groups.request_membership_pm.handle'))
+    end
+  end
+
 end

GitHub sha: b60b2a34

I am afraid I need to revert this partially, it adds a pretty serious N+2 to the serializer for all logged on users.

1 Like