DEV: extract leave_group method from the group#remove_member method (#13823)

* Copy remove_member to new `leave` method

* Remove unneeded code from the leave method

* Rearrange the leave method

* Remove unneeded code from the remove_member method

* Add tests

* Implement on the client side
This commit is contained in:
Andrei Prigorshnev
2021-07-22 20:14:18 +04:00
committed by GitHub
parent 27211ee7bb
commit 8bc01c1bb5
5 changed files with 83 additions and 27 deletions

View File

@ -464,7 +464,7 @@ class GroupsController < ApplicationController
def remove_member
group = Group.find_by(id: params[:id])
raise Discourse::NotFound unless group
group.public_exit ? ensure_logged_in : guardian.ensure_can_edit!(group)
guardian.ensure_can_edit!(group)
# Maintain backwards compatibility
params[:usernames] = params[:username] if params[:username].present?
@ -475,16 +475,6 @@ class GroupsController < ApplicationController
'user_ids or usernames or user_emails must be present'
) if users.empty?
if group.public_exit
if !guardian.can_log_group_changes?(group) && current_user != users.first
raise Discourse::InvalidAccess
end
unless current_user.staff?
RateLimiter.new(current_user, "public_group_membership", 3, 1.minute).performed!
end
end
removed_users = []
skipped_users = []
@ -507,6 +497,21 @@ class GroupsController < ApplicationController
)
end
def leave
ensure_logged_in
unless current_user.staff?
RateLimiter.new(current_user, "public_group_membership", 3, 1.minute).performed!
end
group = Group.find_by(id: params[:id])
raise Discourse::NotFound unless group
raise Discourse::InvalidAccess unless group.public_exit
if group.remove(current_user)
GroupActionLogger.new(current_user, group).log_remove_user_from_group(current_user)
end
end
MAX_NOTIFIED_OWNERS ||= 20
def request_membership