otwarchive-symphonyarchive/app/controllers/prompts_controller.rb

212 lines
6.4 KiB
Ruby
Raw Normal View History

2026-03-11 22:22:11 +00:00
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