FEATURE: support group owner, capable of controlling group membership

Group owners are regular users that can add or remove users to a group
The Admin UX allows admins to appoint group owners
The public group UX will display group owners first and unlock UI to
add and remove members

Group owners can only be appointed on non automatic groups
Group owners may not appoint another group owner
This commit is contained in:
Sam Saffron
2015-11-10 00:52:04 +11:00
parent 13bf6a6d7b
commit 6dd4bc7d57
27 changed files with 384 additions and 234 deletions

View File

@ -107,58 +107,30 @@ class Admin::GroupsController < Admin::AdminController
render json: success_json
end
def add_members
def add_owners
group = Group.find(params.require(:id))
return can_not_modify_automatic if group.automatic
if params[:usernames].present?
users = User.where(username: params[:usernames].split(","))
elsif params[:user_ids].present?
users = User.find(params[:user_ids].split(","))
elsif params[:user_emails].present?
users = User.where(email: params[:user_emails].split(","))
else
raise Discourse::InvalidParameters.new('user_ids or usernames or user_emails must be present')
end
users = User.where(username: params[:usernames].split(","))
users.each do |user|
if !group.users.include?(user)
group.add(user)
else
return render_json_error I18n.t('groups.errors.member_already_exist', username: user.username)
end
group.group_users.where(user_id: user.id).update_all(owner: true)
end
if group.save
render json: success_json
else
render_json_error(group)
end
render json: success_json
end
def remove_member
def remove_owner
group = Group.find(params.require(:id))
return can_not_modify_automatic if group.automatic
if params[:user_id].present?
user = User.find(params[:user_id])
elsif params[:username].present?
user = User.find_by_username(params[:username])
else
raise Discourse::InvalidParameters.new('user_id or username must be present')
end
user = User.find(params[:user_id].to_i)
group.group_users.where(user_id: user.id).update_all(owner: false)
user.primary_group_id = nil if user.primary_group_id == group.id
group.users.delete(user.id)
if group.save && user.save
render json: success_json
else
render_json_error(group)
end
render json: success_json
end
protected