211 lines
6.4 KiB
Ruby
211 lines
6.4 KiB
Ruby
class PromptsController < ApplicationController
|
|
|
|
before_action :users_only, except: [:show]
|
|
before_action :load_collection, except: [:index]
|
|
before_action :load_challenge, except: [:index]
|
|
before_action :load_prompt_from_id, only: [:show, :edit, :update, :destroy]
|
|
before_action :load_signup, except: [:index, :destroy, :show]
|
|
# before_action :promptmeme_only, except: [:index, :new]
|
|
before_action :allowed_to_destroy, only: [:destroy]
|
|
before_action :allowed_to_view, only: [:show]
|
|
before_action :signup_owner_only, only: [:edit, :update]
|
|
before_action :check_signup_open, only: [:new, :create, :edit, :update]
|
|
before_action :check_prompt_in_collection, only: [:show, :edit, :update, :destroy]
|
|
|
|
# def promptmeme_only
|
|
# unless @collection.challenge_type == "PromptMeme"
|
|
# flash[:error] = ts("Only available for prompt meme challenges, not gift exchanges")
|
|
# redirect_to collection_path(@collection) rescue redirect_to '/'
|
|
# end
|
|
# end
|
|
|
|
def load_challenge
|
|
@challenge = @collection.challenge
|
|
no_challenge and return unless @challenge
|
|
end
|
|
|
|
def no_challenge
|
|
flash[:error] = ts("What challenge did you want to sign up for?")
|
|
redirect_to collection_path(@collection) rescue redirect_to '/'
|
|
false
|
|
end
|
|
|
|
def load_signup
|
|
unless @challenge_signup
|
|
@challenge_signup = ChallengeSignup.in_collection(@collection).by_user(current_user).first
|
|
end
|
|
no_signup and return unless @challenge_signup
|
|
end
|
|
|
|
def no_signup
|
|
flash[:error] = ts("Please submit a basic sign-up with the required fields first.")
|
|
redirect_to new_collection_signup_path(@collection) rescue redirect_to '/'
|
|
false
|
|
end
|
|
|
|
def check_signup_open
|
|
signup_closed and return unless (@challenge.signup_open || @collection.user_is_owner?(current_user) || @collection.user_is_moderator?(current_user))
|
|
end
|
|
|
|
def signup_closed
|
|
flash[:error] = ts("Signup is currently closed: please contact a moderator for help.")
|
|
redirect_to @collection rescue redirect_to '/'
|
|
false
|
|
end
|
|
|
|
def signup_owner_only
|
|
not_signup_owner and return unless (@challenge_signup.pseud.user == current_user || (@collection.challenge_type == "GiftExchange" && !@challenge.signup_open && @collection.user_is_owner?(current_user)))
|
|
end
|
|
|
|
def maintainer_or_signup_owner_only
|
|
not_allowed(@collection) and return unless (@challenge_signup.pseud.user == current_user || @collection.user_is_maintainer?(current_user))
|
|
end
|
|
|
|
def not_signup_owner
|
|
flash[:error] = ts("You can't edit someone else's sign-up!")
|
|
redirect_to @collection
|
|
false
|
|
end
|
|
|
|
def allowed_to_destroy
|
|
@challenge_signup.user_allowed_to_destroy?(current_user) || not_allowed(@collection)
|
|
end
|
|
|
|
def load_prompt_from_id
|
|
@prompt = Prompt.find_by(id: params[:id])
|
|
if @prompt.nil?
|
|
no_prompt
|
|
return
|
|
end
|
|
@challenge_signup = @prompt.challenge_signup
|
|
end
|
|
|
|
def no_prompt
|
|
flash[:error] = ts("What prompt did you want to work on?")
|
|
redirect_to collection_path(@collection) rescue redirect_to '/'
|
|
false
|
|
end
|
|
|
|
def check_prompt_in_collection
|
|
unless @prompt.collection_id == @collection.id
|
|
flash[:error] = ts("Sorry, that prompt isn't associated with that collection.")
|
|
redirect_to @collection
|
|
end
|
|
end
|
|
|
|
def allowed_to_view
|
|
unless @challenge.user_allowed_to_see_prompt?(current_user, @prompt)
|
|
access_denied(redirect: @collection)
|
|
end
|
|
end
|
|
|
|
#### ACTIONS
|
|
|
|
def index
|
|
# this currently doesn't get called anywhere
|
|
# should probably list all the prompts in a given collection (instead of using challenge signup for that)
|
|
end
|
|
|
|
def show
|
|
end
|
|
|
|
def new
|
|
if params[:prompt_type] == "offer"
|
|
@index = @challenge_signup.offers.count
|
|
@prompt = @challenge_signup.offers.build
|
|
else
|
|
@index = @challenge_signup.requests.count
|
|
@prompt = @challenge_signup.requests.build
|
|
end
|
|
end
|
|
|
|
def edit
|
|
@index = @challenge_signup.send(@prompt.class.name.downcase.pluralize).index(@prompt)
|
|
end
|
|
|
|
def create
|
|
if params[:prompt_type] == "offer"
|
|
@prompt = @challenge_signup.offers.build(prompt_params)
|
|
else
|
|
@prompt = @challenge_signup.requests.build(prompt_params)
|
|
end
|
|
|
|
if @challenge_signup.save
|
|
flash[:notice] = ts("Prompt was successfully added.")
|
|
redirect_to collection_signup_path(@collection, @challenge_signup)
|
|
else
|
|
flash[:error] = ts("That prompt would make your overall sign-up invalid, sorry.")
|
|
redirect_to edit_collection_signup_path(@collection, @challenge_signup)
|
|
end
|
|
end
|
|
|
|
def update
|
|
if @prompt.update(prompt_params)
|
|
flash[:notice] = ts("Prompt was successfully updated.")
|
|
redirect_to collection_signup_path(@collection, @challenge_signup)
|
|
else
|
|
render action: :edit
|
|
end
|
|
end
|
|
|
|
def destroy
|
|
if !(@challenge.signup_open || @collection.user_is_maintainer?(current_user))
|
|
flash[:error] = ts("You cannot delete a prompt after sign-ups are closed. Please contact a moderator for help.")
|
|
else
|
|
if !@prompt.can_delete?
|
|
flash[:error] = ts("That would make your sign-up invalid, sorry! Please edit instead.")
|
|
else
|
|
@prompt.destroy
|
|
flash[:notice] = ts("Prompt was deleted.")
|
|
end
|
|
end
|
|
if @collection.user_is_maintainer?(current_user) && @collection.challenge_type == "PromptMeme"
|
|
redirect_to collection_requests_path(@collection)
|
|
elsif @prompt.challenge_signup
|
|
redirect_to collection_signup_path(@collection, @prompt.challenge_signup)
|
|
elsif @collection.user_is_maintainer?(current_user)
|
|
redirect_to collection_signups_path(@collection)
|
|
else
|
|
redirect_to @collection
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def prompt_params
|
|
params.require(:prompt).permit(
|
|
:title,
|
|
:url,
|
|
:anonymous,
|
|
:description,
|
|
:any_fandom,
|
|
:any_character,
|
|
:any_relationship,
|
|
:any_freeform,
|
|
:any_category,
|
|
:any_rating,
|
|
:any_archive_warning,
|
|
tag_set_attributes: [
|
|
:fandom_tagnames,
|
|
:id,
|
|
:updated_at,
|
|
:character_tagnames,
|
|
:relationship_tagnames,
|
|
:freeform_tagnames,
|
|
:category_tagnames,
|
|
:rating_tagnames,
|
|
:archive_warning_tagnames,
|
|
fandom_tagnames: [],
|
|
character_tagnames: [],
|
|
relationship_tagnames: [],
|
|
freeform_tagnames: [],
|
|
category_tagnames: [],
|
|
rating_tagnames: [],
|
|
archive_warning_tagnames: []
|
|
],
|
|
optional_tag_set_attributes: [
|
|
:tagnames
|
|
]
|
|
)
|
|
end
|
|
end
|