135 lines
5.1 KiB
Ruby
135 lines
5.1 KiB
Ruby
class CollectionParticipantsController < ApplicationController
|
|
before_action :users_only
|
|
before_action :load_collection
|
|
before_action :load_participant, only: [:update, :destroy]
|
|
before_action :allowed_to_promote, only: [:update]
|
|
before_action :allowed_to_destroy, only: [:destroy]
|
|
before_action :has_other_owners, only: [:update, :destroy]
|
|
before_action :collection_maintainers_only, only: [:index, :add, :update]
|
|
|
|
cache_sweeper :collection_sweeper
|
|
|
|
def owners_required
|
|
flash[:error] = t("collection_participants.validation.owners_required")
|
|
redirect_to collection_participants_path(@collection)
|
|
false
|
|
end
|
|
|
|
def load_collection
|
|
@collection = Collection.find_by!(name: params[:collection_id])
|
|
end
|
|
|
|
def load_participant
|
|
@participant = @collection.collection_participants.find(params[:id])
|
|
end
|
|
|
|
def allowed_to_promote
|
|
@new_role = collection_participant_params[:participant_role]
|
|
@participant.user_allowed_to_promote?(current_user, @new_role) || not_allowed(@collection)
|
|
end
|
|
|
|
def allowed_to_destroy
|
|
@participant.user_allowed_to_destroy?(current_user) || not_allowed(@collection)
|
|
end
|
|
|
|
def has_other_owners
|
|
!@participant.is_owner? || (@collection.owners != [@participant.pseud]) || owners_required
|
|
end
|
|
|
|
## ACTIONS
|
|
|
|
def join
|
|
unless @collection
|
|
flash[:error] = t('no_collection', default: "Which collection did you want to join?")
|
|
redirect_to(request.env["HTTP_REFERER"] || root_path) and return
|
|
end
|
|
participants = CollectionParticipant.in_collection(@collection).for_user(current_user) unless current_user.nil?
|
|
if participants.empty?
|
|
@participant = CollectionParticipant.new(
|
|
collection: @collection,
|
|
pseud: current_user.default_pseud,
|
|
participant_role: CollectionParticipant::NONE
|
|
)
|
|
@participant.save
|
|
flash[:notice] = t('applied_to_join_collection', default: "You have applied to join %{collection}.", collection: @collection.title)
|
|
else
|
|
participants.each do |participant|
|
|
if participant.is_invited?
|
|
participant.approve_membership!
|
|
flash[:notice] = t('collection_participants.accepted_invite', default: "You are now a member of %{collection}.", collection: @collection.title)
|
|
redirect_to(request.env["HTTP_REFERER"] || root_path) and return
|
|
end
|
|
end
|
|
|
|
flash[:notice] = t('collection_participants.no_invitation', default: "You have already joined (or applied to) this collection.")
|
|
end
|
|
|
|
redirect_to(request.env["HTTP_REFERER"] || root_path)
|
|
end
|
|
|
|
def index
|
|
@collection_participants = @collection.collection_participants.reject {|p| p.pseud.nil?}.sort_by {|participant| participant.pseud.name.downcase }
|
|
end
|
|
|
|
def update
|
|
if @participant.update(collection_participant_params)
|
|
flash[:notice] = t('collection_participants.update_success', default: "Updated %{participant}.", participant: @participant.pseud.name)
|
|
else
|
|
flash[:error] = t(".failure", participant: @participant.pseud.name)
|
|
end
|
|
redirect_to collection_participants_path(@collection)
|
|
end
|
|
|
|
def destroy
|
|
@participant.destroy
|
|
flash[:notice] = t('collection_participants.destroy', default: "Removed %{participant} from collection.", participant: @participant.pseud.name)
|
|
redirect_to(request.env["HTTP_REFERER"] || root_path)
|
|
end
|
|
|
|
def add
|
|
@participants_added = []
|
|
@participants_invited = []
|
|
pseud_results = Pseud.parse_bylines(params[:participants_to_invite])
|
|
pseud_results[:pseuds].each do |pseud|
|
|
if @collection.participants.include?(pseud)
|
|
participant = CollectionParticipant.where(collection_id: @collection.id, pseud_id: pseud.id).first
|
|
if participant && participant.is_none?
|
|
@participants_added << participant if participant.approve_membership!
|
|
end
|
|
else
|
|
participant = CollectionParticipant.new(collection: @collection, pseud: pseud, participant_role: CollectionParticipant::MEMBER)
|
|
@participants_invited << participant if participant.save
|
|
end
|
|
end
|
|
|
|
if @participants_invited.empty? && @participants_added.empty?
|
|
if pseud_results[:banned_pseuds].present?
|
|
flash[:error] = ts("%{name} cannot participate in challenges.",
|
|
name: pseud_results[:banned_pseuds].to_sentence
|
|
)
|
|
else
|
|
flash[:error] = ts("We couldn't find anyone new by that name to add.")
|
|
end
|
|
else
|
|
flash[:notice] = ""
|
|
end
|
|
|
|
unless @participants_invited.empty?
|
|
@participants_invited = @participants_invited.sort_by {|participant| participant.pseud.name.downcase }
|
|
flash[:notice] += ts("New members invited: ") + @participants_invited.collect(&:pseud).collect(&:byline).join(', ')
|
|
end
|
|
|
|
unless @participants_added.empty?
|
|
@participants_added = @participants_added.sort_by {|participant| participant.pseud.name.downcase }
|
|
flash[:notice] += ts("Members added: ") + @participants_added.collect(&:pseud).collect(&:byline).join(', ')
|
|
end
|
|
|
|
redirect_to collection_participants_path(@collection)
|
|
end
|
|
|
|
private
|
|
|
|
def collection_participant_params
|
|
params.require(:collection_participant).permit(:participant_role)
|
|
end
|
|
end
|