otwarchive-symphonyarchive/app/controllers/challenge_claims_controller.rb
2026-03-11 22:22:11 +00:00

148 lines
4.3 KiB
Ruby
Executable file

class ChallengeClaimsController < ApplicationController
before_action :users_only
before_action :load_collection, except: [:index]
before_action :collection_owners_only, except: [:index, :show, :create, :destroy]
before_action :load_claim_from_id, only: [:show, :destroy]
before_action :load_challenge, except: [:index]
before_action :allowed_to_destroy, only: [:destroy]
# PERMISSIONS AND STATUS CHECKING
def load_challenge
if @collection
@challenge = @collection.challenge
elsif @challenge_claim
@challenge = @challenge_claim.collection.challenge
end
no_challenge and return unless @challenge
end
def no_challenge
flash[:error] = ts("What challenge did you want to work with?")
redirect_to collection_path(@collection) rescue redirect_to '/'
false
end
def load_claim_from_id
@challenge_claim = ChallengeClaim.find(params[:id])
no_claim and return unless @challenge_claim
end
def no_claim
flash[:error] = ts("What claim did you want to work on?")
if @collection
redirect_to collection_path(@collection) rescue redirect_to '/'
else
redirect_to user_path(@user) rescue redirect_to '/'
end
false
end
def load_user
@user = User.find_by(login: params[:user_id]) if params[:user_id]
no_user and return unless @user
end
def no_user
flash[:error] = ts("What user were you trying to work with?")
redirect_to "/" and return
false
end
def owner_only
unless @user == @challenge_claim.claiming_user
flash[:error] = ts("You aren't the claimer of that prompt.")
redirect_to "/" and return false
end
end
def allowed_to_destroy
@challenge_claim.user_allowed_to_destroy?(current_user) || not_allowed(@collection)
end
# ACTIONS
def index
if !(@collection = Collection.find_by(name: params[:collection_id])).nil? && @collection.closed? && !@collection.user_is_maintainer?(current_user)
flash[:notice] = ts("This challenge is currently closed to new posts.")
end
if params[:collection_id]
return unless load_collection
@challenge = @collection.challenge
not_allowed(@collection) unless user_scoped? || @challenge.user_allowed_to_see_assignments?(current_user)
@claims = ChallengeClaim.unposted_in_collection(@collection)
@claims = @claims.where(claiming_user_id: current_user.id) if user_scoped?
# sorting
set_sort_order
if params[:sort] == "claimer"
@claims = @claims.order_by_offering_pseud(@sort_direction)
else
@claims = @claims.order(@sort_order)
end
elsif params[:user_id] && (@user = User.find_by(login: params[:user_id]))
if current_user == @user
@claims = @user.request_claims.order_by_date.unposted
if params[:posted]
@claims = @user.request_claims.order_by_date.posted
end
if params[:collection_id] && (@collection = Collection.find_by(name: params[:collection_id]))
@claims = @claims.in_collection(@collection)
end
else
flash[:error] = ts("You aren't allowed to see that user's claims.")
redirect_to '/' and return
end
end
@claims = @claims.paginate page: params[:page], per_page: ArchiveConfig.ITEMS_PER_PAGE
end
def show
# this is here just as a failsafe, this path should not be used
redirect_to collection_prompt_path(@collection, @challenge_claim.request_prompt)
end
def create
# create a new claim
prompt = @collection.prompts.find(params[:prompt_id])
claim = prompt.request_claims.build(claiming_user: current_user)
if claim.save
flash[:notice] = "New claim made."
else
flash[:error] = "We couldn't save the new claim."
end
redirect_to collection_claims_path(@collection, for_user: true)
end
def destroy
redirect_path = collection_claims_path(@collection)
flash[:notice] = ts("The claim was deleted.")
if @challenge_claim.claiming_user == current_user
redirect_path = collection_claims_path(@collection, for_user: true)
flash[:notice] = ts("Your claim was deleted.")
end
begin
@challenge_claim.destroy
rescue
flash.delete(:notice)
flash[:error] = ts("We couldn't delete that right now, sorry! Please try again later.")
end
redirect_to redirect_path
end
private
def user_scoped?
params[:for_user].to_s.casecmp?("true")
end
end