fix random results unintentionally hitting hidden images

This commit is contained in:
byte[] 2021-02-25 01:44:31 -05:00
parent 21dcd0c9df
commit 351cb282bf

View file

@ -3,57 +3,42 @@ defmodule PhilomenaWeb.Image.RandomController do
alias PhilomenaWeb.ImageSorter alias PhilomenaWeb.ImageSorter
alias PhilomenaWeb.ImageScope alias PhilomenaWeb.ImageScope
alias PhilomenaWeb.ImageLoader
alias Philomena.Elasticsearch alias Philomena.Elasticsearch
alias Philomena.Images.Query
alias Philomena.Images.Image alias Philomena.Images.Image
def index(conn, params) do def index(conn, params) do
user = conn.assigns.current_user
filter = conn.assigns.compiled_filter
scope = ImageScope.scope(conn) scope = ImageScope.scope(conn)
query = query(user, params)
random_id = random_image_id(query, filter)
if random_id do search_definition =
redirect(conn, to: Routes.image_path(conn, :show, random_id, scope)) ImageLoader.search_string(
else conn,
redirect(conn, to: Routes.image_path(conn, :index)) query_string(params),
pagination: %{page_size: 1},
sorts: &ImageSorter.parse_sort(%{"sf" => "random"}, &1)
)
case unwrap_random_result(search_definition) do
nil ->
redirect(conn, to: Routes.image_path(conn, :index))
random_id ->
redirect(conn, to: Routes.image_path(conn, :show, random_id, scope))
end end
end end
defp query(user, %{"q" => q}) do defp query_string(%{"q" => query}), do: query
{:ok, query} = Query.compile(user, q) defp query_string(_params), do: "*"
query defp unwrap_random_result({:ok, {definition, _tags}}) do
end definition
defp query(_user, _), do: %{match_all: %{}}
defp random_image_id(query, filter) do
%{query: query, sorts: sort} = ImageSorter.parse_sort(%{"sf" => "random"}, query)
Image
|> Elasticsearch.search_definition(
%{
query: %{
bool: %{
must: query,
must_not: [
filter,
%{term: %{hidden_from_users: true}}
]
}
},
sort: sort
},
%{page_size: 1}
)
|> Elasticsearch.search_records(Image) |> Elasticsearch.search_records(Image)
|> Enum.to_list() |> Enum.to_list()
|> unwrap() |> unwrap()
end end
defp unwrap_random_result(_definition), do: nil
defp unwrap([image]), do: image.id defp unwrap([image]), do: image.id
defp unwrap([]), do: nil defp unwrap([]), do: nil
end end