From 07ecbb5a3b980115e6b8dfc127b8e336997a2ea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Fri, 17 May 2024 18:39:05 +0200 Subject: [PATCH] FIX: group's mentions was broken (#27066) In https://github.com/discourse/discourse/commit/1deeff2336a3d9180ec6276a8fd5b399ec6165c8 we changed the format of the results given by the API but we forgot to update the `#mentions` endpoint as well. Context - https://meta.discourse.org/t/-/308044 --- app/controllers/groups_controller.rb | 19 +++++++++++- spec/requests/groups_controller_spec.rb | 40 +++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index b91559d3df2..685393f8783 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -218,26 +218,43 @@ class GroupsController < ApplicationController "#{SiteSetting.title} - #{I18n.t("rss_description.group_posts", group_name: group.name)}" @link = Discourse.base_url @description = I18n.t("rss_description.group_posts", group_name: group.name) + render "posts/latest", formats: [:rss] end def mentions raise Discourse::NotFound unless SiteSetting.enable_mentions? + group = find_group(:group_id) + guardian.ensure_can_see_group_members!(group) + posts = group.mentioned_posts_for(guardian, params.permit(:before_post_id, :category_id)).limit(20) - render_serialized posts.to_a, GroupPostSerializer + + response = { posts: serialize_data(posts, GroupPostSerializer) } + + if guardian.can_lazy_load_categories? + category_ids = posts.map { |p| p.topic.category_id }.compact.uniq + categories = Category.secured(guardian).with_parents(category_ids) + response[:categories] = serialize_data(categories, CategoryBadgeSerializer) + end + + render json: response end def mentions_feed raise Discourse::NotFound unless SiteSetting.enable_mentions? + group = find_group(:group_id) + guardian.ensure_can_see_group_members!(group) + @posts = group.mentioned_posts_for(guardian, params.permit(:before_post_id, :category_id)).limit(50) @title = "#{SiteSetting.title} - #{I18n.t("rss_description.group_mentions", group_name: group.name)}" @link = Discourse.base_url @description = I18n.t("rss_description.group_mentions", group_name: group.name) + render "posts/latest", formats: [:rss] end diff --git a/spec/requests/groups_controller_spec.rb b/spec/requests/groups_controller_spec.rb index cb8e5fb4384..c679ebedb1f 100644 --- a/spec/requests/groups_controller_spec.rb +++ b/spec/requests/groups_controller_spec.rb @@ -526,6 +526,46 @@ RSpec.describe GroupsController do end end + describe "#mentions" do + it "ensures mentions are enabled" do + SiteSetting.enable_mentions = false + + sign_in(user) + get "/groups/#{group.name}/mentions.json" + + expect(response.status).to eq(404) + end + + it "ensures the group can be seen" do + sign_in(user) + group.update!(visibility_level: Group.visibility_levels[:owners]) + + get "/groups/#{group.name}/mentions.json" + + expect(response.status).to eq(404) + end + + it "ensures the group members can be seen" do + sign_in(user) + group.update!(members_visibility_level: Group.visibility_levels[:owners]) + + get "/groups/#{group.name}/mentions.json" + + expect(response.status).to eq(403) + end + + it "returns the right response" do + post = Fabricate(:post) + GroupMention.create!(post: post, group: group) + + sign_in(user) + get "/groups/#{group.name}/mentions.json" + + expect(response.status).to eq(200) + expect(response.parsed_body["posts"].first["id"]).to eq(post.id) + end + end + describe "#posts" do it "ensures the group can be seen" do sign_in(user)