otwarchive-symphonyarchive/app/controllers/orphans_controller.rb

91 lines
3.1 KiB
Ruby
Raw Normal View History

2026-03-11 22:22:11 +00:00
class OrphansController < ApplicationController
# You must be logged in to orphan works - relies on current_user data
before_action :users_only, except: [:index]
before_action :check_user_not_suspended, except: [:index]
before_action :load_pseuds, only: [:create]
before_action :load_orphans, only: [:create]
def index
@user = User.orphan_account
@works = @user.works
end
def new
if params[:work_id]
@to_be_orphaned = Work.find(params[:work_id])
check_one_owned(@to_be_orphaned, current_user.works)
elsif params[:work_ids]
@to_be_orphaned = Work.where(id: params[:work_ids]).to_a
check_all_owned(@to_be_orphaned, current_user.works)
elsif params[:series_id]
@to_be_orphaned = Series.find(params[:series_id])
check_one_owned(@to_be_orphaned, current_user.series)
elsif params[:pseud_id]
@to_be_orphaned = Pseud.find(params[:pseud_id])
check_one_owned(@to_be_orphaned, current_user.pseuds)
else
@to_be_orphaned = current_user
end
end
def create
use_default = params[:use_default] == "true"
Creatorship.orphan(@pseuds, @orphans, use_default)
flash[:notice] = ts("Orphaning was successful.")
redirect_to user_path(current_user)
end
protected
def show_orphan_permission_error
flash[:error] = ts("You don't have permission to orphan that!")
redirect_to root_path
end
# Given an ActiveRecord item and an ActiveRecord relation, check whether the
# item is in the relation. If not, show a flash error.
def check_one_owned(chosen_item, all_owned_items)
show_orphan_permission_error unless all_owned_items.exists?(chosen_item.id)
end
# Given a collection of ActiveRecords and an ActiveRecord relation, check
# whether all items in the collection are contained in the relation. If not,
# show a flash error.
def check_all_owned(chosen_items, all_owned_items)
chosen_ids = chosen_items.map(&:id)
owned_ids = all_owned_items.where(id: chosen_ids).pluck(:id)
unowned_ids = chosen_ids - owned_ids
show_orphan_permission_error if unowned_ids.any?
end
# Load the list of works or series into the @orphans variable, and verify
# that the current user owns the works/series in question.
def load_orphans
if params[:work_ids]
@orphans = Work.where(id: params[:work_ids]).to_a
check_all_owned(@orphans, current_user.works)
elsif params[:series_id]
@orphans = Series.where(id: params[:series_id]).to_a
check_all_owned(@orphans, current_user.series)
else
flash[:error] = ts("What did you want to orphan?")
redirect_to current_user
end
end
# If a pseud_id is specified, load it and check that it belongs to the
# current user. Otherwise, assume that the user wants to orphan with all of
# their pseuds.
def load_pseuds
if params[:pseud_id]
@pseuds = Pseud.where(id: params[:pseud_id]).to_a
check_all_owned(@pseuds, current_user.pseuds)
else
@pseuds = current_user.pseuds
# We don't need to check ownership here because these pseuds are
# guaranteed to be owned by the current user.
end
end
end