From ad4a96d38765588a4288aaf760b92509f1ef331d Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 3 Jan 2017 15:33:57 +0800 Subject: [PATCH] FIX: Only send membership request to the last 5 active group owners. --- .../components/group-membership-button.js.es6 | 11 +++++++--- .../javascripts/discourse/models/group.js.es6 | 5 +++++ app/controllers/groups_controller.rb | 10 ++++++++++ app/models/user_search.rb | 2 ++ config/routes.rb | 1 + spec/integration/groups_spec.rb | 20 +++++++++++++++++++ 6 files changed, 46 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/components/group-membership-button.js.es6 b/app/assets/javascripts/discourse/components/group-membership-button.js.es6 index b78bb902064..ff8ceb0dcf4 100644 --- a/app/assets/javascripts/discourse/components/group-membership-button.js.es6 +++ b/app/assets/javascripts/discourse/components/group-membership-button.js.es6 @@ -1,5 +1,6 @@ import { default as computed } from 'ember-addons/ember-computed-decorators'; import { popupAjaxError } from 'discourse/lib/ajax-error'; +import Group from 'discourse/models/group'; export default Ember.Component.extend({ @computed("model.public") @@ -64,9 +65,13 @@ export default Ember.Component.extend({ requestMembership() { const groupName = this.get('model.name'); - const title = I18n.t('groups.request_membership_pm.title'); - const body = I18n.t('groups.request_membership_pm.body', { groupName }); - this.sendAction("createNewMessageViaParams", groupName, title, body); + + Group.loadOwners(groupName).then(result => { + const names = result.map(owner => owner.username).join(","); + const title = I18n.t('groups.request_membership_pm.title'); + const body = I18n.t('groups.request_membership_pm.body', { groupName }); + this.sendAction("createNewMessageViaParams", names, title, body); + }); } } }); diff --git a/app/assets/javascripts/discourse/models/group.js.es6 b/app/assets/javascripts/discourse/models/group.js.es6 index 38d4fb82ee2..36a1359bbed 100644 --- a/app/assets/javascripts/discourse/models/group.js.es6 +++ b/app/assets/javascripts/discourse/models/group.js.es6 @@ -2,6 +2,7 @@ import { ajax } from 'discourse/lib/ajax'; import { default as computed, observes } from "ember-addons/ember-computed-decorators"; import GroupHistory from 'discourse/models/group-history'; import RestModel from 'discourse/models/rest'; +import { popupAjaxError } from 'discourse/lib/ajax-error'; const Group = RestModel.extend({ limit: 50, @@ -208,6 +209,10 @@ Group.reopenClass({ return ajax("/groups/" + name + ".json").then(result => Group.create(result.basic_group)); }, + loadOwners(name) { + return ajax('/groups/' + name + '/owners.json').catch(popupAjaxError); + }, + loadMembers(name, offset, limit, params) { return ajax('/groups/' + name + '/members.json', { data: _.extend({ diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 26277cdc776..e5c99c2433a 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -141,6 +141,16 @@ class GroupsController < ApplicationController } end + def owners + group = find_group(:group_id) + + owners = group.users.where('group_users.owner') + .order("users.last_seen_at DESC") + .limit(5) + + render_serialized(owners, GroupUserSerializer) + end + def add_members group = Group.find(params[:id]) group.public ? ensure_logged_in : guardian.ensure_can_edit!(group) diff --git a/app/models/user_search.rb b/app/models/user_search.rb index 56a40af3429..2b1c05f0ded 100644 --- a/app/models/user_search.rb +++ b/app/models/user_search.rb @@ -1,4 +1,6 @@ # Searches for a user by username or full text or name (if enabled in SiteSettings) +require_dependency 'search' + class UserSearch def initialize(term, opts={}) diff --git a/config/routes.rb b/config/routes.rb index cc95f859fea..f6b12533e02 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -404,6 +404,7 @@ Discourse::Application.routes.draw do get 'activity' => "groups#show" get 'activity/:filter' => "groups#show" get 'members' + get 'owners' get 'posts' get 'topics' get 'mentions' diff --git a/spec/integration/groups_spec.rb b/spec/integration/groups_spec.rb index 33e972bda67..d0b8ddaefaa 100644 --- a/spec/integration/groups_spec.rb +++ b/spec/integration/groups_spec.rb @@ -151,6 +151,26 @@ describe "Groups" do end end + describe 'owners' do + let(:user1) { Fabricate(:user, last_seen_at: Time.zone.now) } + let(:user2) { Fabricate(:user, last_seen_at: Time.zone.now - 1 .day) } + let(:group) { Fabricate(:group, users: [user1, user2]) } + + it 'should return the right list of owners' do + group.add_owner(user1) + group.add_owner(user2) + + xhr :get, "/groups/#{group.name}/owners" + + expect(response).to be_success + + owners = JSON.parse(response.body) + + expect(owners.count).to eq(2) + expect(owners.map { |o| o["id"] }.sort).to eq([user1.id, user2.id]) + end + end + describe 'members' do let(:user1) do Fabricate(:user,