# frozen_string_literal: true
class UserAliasesController < DashboardController
def create
sanitized_params = alias_params
target = extract_community_or_server(sanitized_params)
return render json: {}, status: :not_found if target.nil?
# This was a nice side effect of the design. This can be community_id or server_id
server_or_community = target.class.to_s.downcase
user_alias = current_user.id_aliases.create!(
"#{server_or_community}_id" => target.id,
value: sanitized_params[:value]
)
render json: {id: user_alias.uuid}, status: :ok
end
def update
sanitized_params = alias_params
user_alias = current_user.id_aliases.where(uuid: sanitized_params[:id]).first
return render json: {}, status: :not_found if user_alias.nil?
target = extract_community_or_server(sanitized_params)
return render json: {}, status: :not_found if target.nil?
# Reset both targets in case the user decided to switch
user_alias.server_id = nil
user_alias.community_id = nil
# This was a nice side effect of the design. This can be community_id or server_id
server_or_community = target.class.to_s.downcase
user_alias.update!(
"#{server_or_community}_id" => target.id,
value: sanitized_params[:value]
)
render json: {}, status: :ok
end
def destroy
# A rare instance where I don't really care about security here.
# What are they gonna do? Delete their own aliases? ;)
current_user.id_aliases.where(uuid: params[:id]).first&.destroy
render json: {}, status: :ok
end
private
def alias_params
params.require(:user_alias).permit(:id, :type, :value, target: {})
end
def extract_community_or_server(data)
target_id = data.dig(:target, :id)
case data[:type]
when "community"
Community.find_by_community_id(target_id)
when "server"
Server.find_by_server_id(target_id)
else
nil
end
end
end