From 559918c6c65091f1d940a8d2deb9e168d31ffb8a Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Fri, 25 Nov 2016 16:45:15 +0800 Subject: [PATCH] PERF: Add endpoint to check if a group can be mentioned by user. --- .../javascripts/discourse/models/group.js.es6 | 6 +++- .../discourse/routes/new-message.js.es6 | 8 ++--- app/controllers/groups_controller.rb | 12 ++++++- app/controllers/session_controller.rb | 1 - app/models/group.rb | 4 --- app/serializers/group_serializer.rb | 11 ------ config/routes.rb | 1 + spec/fabricators/email_token_fabricator.rb | 4 +++ spec/integration/groups_spec.rb | 36 +++++++++++++++++++ 9 files changed, 61 insertions(+), 22 deletions(-) delete mode 100644 app/serializers/group_serializer.rb create mode 100644 spec/fabricators/email_token_fabricator.rb create mode 100644 spec/integration/groups_spec.rb diff --git a/app/assets/javascripts/discourse/models/group.js.es6 b/app/assets/javascripts/discourse/models/group.js.es6 index a8434f510c0..4566c154abc 100644 --- a/app/assets/javascripts/discourse/models/group.js.es6 +++ b/app/assets/javascripts/discourse/models/group.js.es6 @@ -181,7 +181,11 @@ Group.reopenClass({ offset: offset || 0 } }); - } + }, + + mentionable(name) { + return ajax(`/groups/${name}/mentionable`, { data: { name } }); + }, }); export default Group; diff --git a/app/assets/javascripts/discourse/routes/new-message.js.es6 b/app/assets/javascripts/discourse/routes/new-message.js.es6 index d8e8c577511..85731a8e827 100644 --- a/app/assets/javascripts/discourse/routes/new-message.js.es6 +++ b/app/assets/javascripts/discourse/routes/new-message.js.es6 @@ -21,11 +21,11 @@ export default Discourse.Route.extend({ }); } else if (params.groupname) { // send a message to a group - Group.find(params.groupname).then(group => { - if (group.mentionable) { - Ember.run.next(() => e.send("createNewMessageViaParams", group.name, params.title, params.body)); + Group.mentionable(params.groupname).then(result => { + if (result.mentionable) { + Ember.run.next(() => e.send("createNewMessageViaParams", params.groupname, params.title, params.body)); } else { - bootbox.alert(I18n.t("composer.cant_send_pm", { username: group.name })); + bootbox.alert(I18n.t("composer.cant_send_pm", { username: params.groupname })); } }).catch(function() { bootbox.alert(I18n.t("generic_error")); diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 17e3a5c63ea..a39bdb3c98b 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -1,6 +1,6 @@ class GroupsController < ApplicationController - before_filter :ensure_logged_in, only: [:set_notifications] + before_filter :ensure_logged_in, only: [:set_notifications, :mentionable] skip_before_filter :preload_json, :check_xhr, only: [:posts_feed, :mentions_feed] def show @@ -120,6 +120,16 @@ class GroupsController < ApplicationController end end + def mentionable + group = find_group(:name) + + if group + render json: { mentionable: Group.mentionable(current_user).where(id: group.id).present? } + else + raise Discourse::InvalidAccess.new + end + end + def remove_member group = Group.find(params[:id]) guardian.ensure_can_edit!(group) diff --git a/app/controllers/session_controller.rb b/app/controllers/session_controller.rb index 463c830e3ab..a73541a3fb9 100644 --- a/app/controllers/session_controller.rb +++ b/app/controllers/session_controller.rb @@ -169,7 +169,6 @@ class SessionController < ApplicationController login = params[:login].strip login = login[1..-1] if login[0] == "@" - if user = User.find_by_username_or_email(login) # If their password is correct diff --git a/app/models/group.rb b/app/models/group.rb index dcb2b6e9e6f..9d488ac7622 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -381,10 +381,6 @@ class Group < ActiveRecord::Base true end - def mentionable?(user, group_id) - Group.mentionable(user).where(id: group_id).exists? - end - def staff? STAFF_GROUPS.include?(self.name.to_sym) end diff --git a/app/serializers/group_serializer.rb b/app/serializers/group_serializer.rb deleted file mode 100644 index 96a3450bf05..00000000000 --- a/app/serializers/group_serializer.rb +++ /dev/null @@ -1,11 +0,0 @@ -class GroupSerializer < BasicGroupSerializer - attributes :mentionable - - def mentionable - object.mentionable?(scope.user, object.id) - end - - def include_mentionable? - authenticated? - end -end diff --git a/config/routes.rb b/config/routes.rb index 07e6a5a7ab5..f465e56a380 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -409,6 +409,7 @@ Discourse::Application.routes.draw do get 'mentions' get 'messages' get 'counts' + get 'mentionable' member do put "members" => "groups#add_members" diff --git a/spec/fabricators/email_token_fabricator.rb b/spec/fabricators/email_token_fabricator.rb new file mode 100644 index 00000000000..95738b8cfb4 --- /dev/null +++ b/spec/fabricators/email_token_fabricator.rb @@ -0,0 +1,4 @@ +Fabricator(:email_token) do + user + email { |attrs| attrs[:user].email } +end diff --git a/spec/integration/groups_spec.rb b/spec/integration/groups_spec.rb new file mode 100644 index 00000000000..396d7df9f41 --- /dev/null +++ b/spec/integration/groups_spec.rb @@ -0,0 +1,36 @@ +require 'rails_helper' + +describe "Groups" do + describe "checking if a group can be mentioned" do + let(:password) { 'somecomplicatedpassword' } + let(:email_token) { Fabricate(:email_token, confirmed: true) } + let(:user) { email_token.user } + let(:group) { Fabricate(:group, name: 'test', users: [user]) } + + before do + user.update_attributes!(password: password) + end + + it "should return the right response" do + group + + post "/session.json", { login: user.username, password: password } + expect(response).to be_success + + get "/groups/test/mentionable.json", { name: group.name } + + expect(response).to be_success + + response_body = JSON.parse(response.body) + expect(response_body["mentionable"]).to eq(false) + + group.update_attributes!(alias_level: Group::ALIAS_LEVELS[:everyone]) + + get "/groups/test/mentionable.json", { name: group.name } + expect(response).to be_success + + response_body = JSON.parse(response.body) + expect(response_body["mentionable"]).to eq(true) + end + end +end