otwarchive-symphonyarchive/app/controllers/related_works_controller.rb

97 lines
3.5 KiB
Ruby
Raw Permalink Normal View History

2026-03-11 22:22:11 +00:00
class RelatedWorksController < ApplicationController
before_action :load_user, only: [:index]
before_action :users_only, except: [:index]
before_action :get_instance_variables, except: [:index]
def index
@page_subtitle = t(".page_title", login: @user.login)
@translations_of_user = @user.related_works.posted.where(translation: true)
@remixes_of_user = @user.related_works.posted.where(translation: false)
@translations_by_user = @user.parent_work_relationships.posted.where(translation: true)
@remixes_by_user = @user.parent_work_relationships.posted.where(translation: false)
return if @user == current_user
# Extra constraints on what we display if someone else is viewing @user's
# related works page:
@translations_of_user = @translations_of_user.merge(Work.revealed.non_anon)
@remixes_of_user = @remixes_of_user.merge(Work.revealed.non_anon)
@translations_by_user = @translations_by_user.merge(Work.revealed.non_anon)
@remixes_by_user = @remixes_by_user.merge(Work.revealed.non_anon)
end
# GET /related_works/1
# GET /related_works/1.xml
def show
end
def update
# updates are done by the owner of the parent, to aprove or remove links on the parent work.
unless @user
if current_user_owns?(@child)
flash[:error] = ts("Sorry, but you don't have permission to do that. Try removing the link from your own work.")
redirect_back_or_default(user_related_works_path(current_user))
return
else
flash[:error] = ts("Sorry, but you don't have permission to do that.")
redirect_back_or_default(root_path)
return
end
end
# the assumption here is that any update is a toggle from what was before
@related_work.reciprocal = !@related_work.reciprocal?
if @related_work.update_attribute(:reciprocal, @related_work.reciprocal)
notice = @related_work.reciprocal? ? ts("Link was successfully approved") :
ts("Link was successfully removed")
flash[:notice] = notice
redirect_to(@related_work.parent)
else
flash[:error] = ts('Sorry, something went wrong.')
redirect_to(@related_work)
end
end
def destroy
# destroys are done by the owner of the child, to remove links to the parent work which also removes the link back if it exists.
unless current_user_owns?(@child)
if @user
flash[:error] = ts("Sorry, but you don't have permission to do that. You can only approve or remove the link from your own work.")
redirect_back_or_default(user_related_works_path(current_user))
return
else
flash[:error] = ts("Sorry, but you don't have permission to do that.")
redirect_back_or_default(root_path)
return
end
end
@related_work.destroy
redirect_back(fallback_location: user_related_works_path(current_user))
end
private
def load_user
if params[:user_id].blank?
flash[:error] = ts("Whose related works were you looking for?")
redirect_back_or_default(search_people_path)
else
@user = User.find_by(login: params[:user_id])
if @user.blank?
flash[:error] = ts("Sorry, we couldn't find that user")
redirect_back_or_default(root_path)
end
end
end
def get_instance_variables
@related_work = RelatedWork.find(params[:id])
@child = @related_work.work
if @related_work.parent.is_a? (Work)
@owners = @related_work.parent.pseuds.map(&:user)
@user = current_user if @owners.include?(current_user)
end
end
end