mirror of
https://github.com/philomena-dev/philomena.git
synced 2024-11-27 13:47:58 +01:00
add related endpoint and controller
This commit is contained in:
parent
31e7727648
commit
3cd51526d9
5 changed files with 77 additions and 0 deletions
61
lib/philomena_web/controllers/image/related_controller.ex
Normal file
61
lib/philomena_web/controllers/image/related_controller.ex
Normal file
|
@ -0,0 +1,61 @@
|
|||
defmodule PhilomenaWeb.Image.RelatedController do
|
||||
use PhilomenaWeb, :controller
|
||||
|
||||
alias PhilomenaWeb.ImageLoader
|
||||
alias Philomena.Interactions
|
||||
alias Philomena.Images.Image
|
||||
|
||||
plug PhilomenaWeb.CanaryMapPlug, index: :show
|
||||
plug :load_and_authorize_resource, model: Image, id_name: "image_id", persisted: true, preload: [:tags, :faves]
|
||||
|
||||
def index(conn, _params) do
|
||||
image = conn.assigns.image
|
||||
user = conn.assigns.current_user
|
||||
|
||||
tags_to_match =
|
||||
image.tags
|
||||
|> Enum.reject(& &1.category == "rating")
|
||||
|> Enum.sort_by(& &1.images_count)
|
||||
|> Enum.take(10)
|
||||
|> Enum.map(& &1.id)
|
||||
|
||||
low_count_tags =
|
||||
tags_to_match
|
||||
|> Enum.take(5)
|
||||
|> Enum.map(&%{term: %{tag_ids: &1}})
|
||||
|
||||
high_count_tags =
|
||||
tags_to_match
|
||||
|> Enum.take(-5)
|
||||
|> Enum.map(&%{term: %{tag_ids: &1}})
|
||||
|
||||
favs_to_match =
|
||||
image.faves
|
||||
|> Enum.take(11)
|
||||
|> Enum.map(&%{term: %{favourited_by_user_ids: &1.user_id}})
|
||||
|
||||
query =
|
||||
%{
|
||||
bool: %{
|
||||
must: [
|
||||
%{bool: %{should: low_count_tags, boost: 2}},
|
||||
%{bool: %{should: high_count_tags, boost: 3, minimum_should_match: "5%"}},
|
||||
%{bool: %{should: favs_to_match, boost: 0.2, minimum_should_match: "5%"}}
|
||||
],
|
||||
must_not: %{term: %{id: image.id}}
|
||||
}
|
||||
}
|
||||
|
||||
{images, _tags} =
|
||||
ImageLoader.query(
|
||||
conn,
|
||||
query,
|
||||
sorts: [%{_score: :desc}],
|
||||
pagination: %{conn.assigns.image_pagination | page_number: 1}
|
||||
)
|
||||
|
||||
interactions = Interactions.user_interactions(images, user)
|
||||
|
||||
render(conn, "index.html", title: "##{image.id} - Related Images", layout_class: "wide", images: images, interactions: interactions)
|
||||
end
|
||||
end
|
|
@ -275,6 +275,7 @@ defmodule PhilomenaWeb.Router do
|
|||
resources "/random", RandomController, only: [:index]
|
||||
end
|
||||
resources "/images", ImageController, only: [:index, :show, :new, :create] do
|
||||
resources "/related", Image.RelatedController, only: [:index]
|
||||
resources "/comments", Image.CommentController, only: [:index, :show, :create] do
|
||||
resources "/reports", Image.Comment.ReportController, only: [:new, :create]
|
||||
resources "/history", Image.Comment.HistoryController, only: [:index]
|
||||
|
|
11
lib/philomena_web/templates/image/related/index.html.slime
Normal file
11
lib/philomena_web/templates/image/related/index.html.slime
Normal file
|
@ -0,0 +1,11 @@
|
|||
.block#imagelist-container
|
||||
.block__header
|
||||
.block__header__title.hide-mobile
|
||||
' Viewing related images for
|
||||
strong>
|
||||
| #
|
||||
= @image.id
|
||||
|
||||
.block__content.js-resizable-media-container
|
||||
= for image <- @images do
|
||||
= render PhilomenaWeb.ImageView, "_image_box.html", image: image, link: Routes.image_path(@conn, :show, image), size: :thumb, conn: @conn
|
3
lib/philomena_web/views/image/related_view.ex
Normal file
3
lib/philomena_web/views/image/related_view.ex
Normal file
|
@ -0,0 +1,3 @@
|
|||
defmodule PhilomenaWeb.Image.RelatedView do
|
||||
use PhilomenaWeb, :view
|
||||
end
|
|
@ -81,6 +81,7 @@ defmodule PowLockout.Phoenix.ControllerCallbacks do
|
|||
|> Conn.assign(:changeset, Plug.change_user(conn, conn.params["user"]))
|
||||
|> Controller.put_flash(:error, messages(conn).invalid_credentials(conn))
|
||||
|> Controller.render("new.html")
|
||||
|> Conn.halt()
|
||||
end
|
||||
|
||||
@doc """
|
||||
|
|
Loading…
Reference in a new issue