Skip to content

Commit

Permalink
fix random results unintentionally hitting hidden images
Browse files Browse the repository at this point in the history
  • Loading branch information
liamwhite committed Feb 25, 2021
1 parent 21dcd0c commit 351cb28
Showing 1 changed file with 21 additions and 36 deletions.
57 changes: 21 additions & 36 deletions lib/philomena_web/controllers/image/random_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,57 +3,42 @@ defmodule PhilomenaWeb.Image.RandomController do

alias PhilomenaWeb.ImageSorter
alias PhilomenaWeb.ImageScope
alias PhilomenaWeb.ImageLoader
alias Philomena.Elasticsearch
alias Philomena.Images.Query
alias Philomena.Images.Image

def index(conn, params) do
user = conn.assigns.current_user
filter = conn.assigns.compiled_filter

scope = ImageScope.scope(conn)
query = query(user, params)
random_id = random_image_id(query, filter)

if random_id do
redirect(conn, to: Routes.image_path(conn, :show, random_id, scope))
else
redirect(conn, to: Routes.image_path(conn, :index))
end
end
search_definition =
ImageLoader.search_string(
conn,
query_string(params),
pagination: %{page_size: 1},
sorts: &ImageSorter.parse_sort(%{"sf" => "random"}, &1)
)

defp query(user, %{"q" => q}) do
{:ok, query} = Query.compile(user, q)
case unwrap_random_result(search_definition) do
nil ->
redirect(conn, to: Routes.image_path(conn, :index))

query
random_id ->
redirect(conn, to: Routes.image_path(conn, :show, random_id, scope))
end
end

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}
)
defp query_string(%{"q" => query}), do: query
defp query_string(_params), do: "*"

defp unwrap_random_result({:ok, {definition, _tags}}) do
definition
|> Elasticsearch.search_records(Image)
|> Enum.to_list()
|> unwrap()
end

defp unwrap_random_result(_definition), do: nil

defp unwrap([image]), do: image.id
defp unwrap([]), do: nil
end

0 comments on commit 351cb28

Please sign in to comment.