mirror of
https://github.com/philomena-dev/philomena.git
synced 2025-02-01 03:46:44 +01:00
add ImageLoader
This commit is contained in:
parent
4635bd1c65
commit
2df262a1de
7 changed files with 105 additions and 138 deletions
|
@ -93,6 +93,7 @@ defmodule Philomena.Posts.Query do
|
||||||
bool_fields: mod_bool_fields,
|
bool_fields: mod_bool_fields,
|
||||||
custom_fields: user_custom,
|
custom_fields: user_custom,
|
||||||
transforms: user_transforms,
|
transforms: user_transforms,
|
||||||
|
aliases: mod_aliases,
|
||||||
default_field: default_field
|
default_field: default_field
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,51 +1,28 @@
|
||||||
defmodule PhilomenaWeb.ActivityController do
|
defmodule PhilomenaWeb.ActivityController do
|
||||||
use PhilomenaWeb, :controller
|
use PhilomenaWeb, :controller
|
||||||
|
|
||||||
|
alias PhilomenaWeb.ImageLoader
|
||||||
alias Philomena.{Images.Image, ImageFeatures.ImageFeature, Comments.Comment, Channels.Channel, Topics.Topic, Forums.Forum}
|
alias Philomena.{Images.Image, ImageFeatures.ImageFeature, Comments.Comment, Channels.Channel, Topics.Topic, Forums.Forum}
|
||||||
alias Philomena.Interactions
|
alias Philomena.Interactions
|
||||||
alias Philomena.Images
|
|
||||||
alias Philomena.Repo
|
alias Philomena.Repo
|
||||||
import Ecto.Query
|
import Ecto.Query
|
||||||
|
|
||||||
def index(conn, _params) do
|
def index(conn, _params) do
|
||||||
user = conn.assigns.current_user
|
user = conn.assigns.current_user
|
||||||
filter = conn.assigns.compiled_filter
|
|
||||||
{:ok, image_query} = Images.Query.compile(user, "created_at.lte:3 minutes ago")
|
|
||||||
|
|
||||||
images =
|
{:ok, images} =
|
||||||
Image.search_records(
|
ImageLoader.search_string(
|
||||||
%{
|
conn,
|
||||||
query: %{
|
"created_at.lte:3 minutes ago",
|
||||||
bool: %{
|
pagination: %{conn.assigns.image_pagination | page_number: 1}
|
||||||
must: image_query,
|
|
||||||
must_not: [
|
|
||||||
filter,
|
|
||||||
%{term: %{hidden_from_users: true}}
|
|
||||||
],
|
|
||||||
}
|
|
||||||
},
|
|
||||||
sort: %{created_at: :desc}
|
|
||||||
},
|
|
||||||
%{conn.assigns.image_pagination | page_number: 1},
|
|
||||||
Image |> preload([:tags])
|
|
||||||
)
|
)
|
||||||
|
|
||||||
top_scoring =
|
top_scoring =
|
||||||
Image.search_records(
|
ImageLoader.query(
|
||||||
%{
|
conn,
|
||||||
query: %{
|
%{range: %{first_seen_at: %{gt: "now-3d"}}},
|
||||||
bool: %{
|
sorts: [%{score: :desc}, %{first_seen_at: :desc}],
|
||||||
must: %{range: %{first_seen_at: %{gt: "now-3d"}}},
|
pagination: %{page_number: :rand.uniform(6), page_size: 4}
|
||||||
must_not: [
|
|
||||||
filter,
|
|
||||||
%{term: %{hidden_from_users: true}}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
sort: [%{score: :desc}, %{first_seen_at: :desc}]
|
|
||||||
},
|
|
||||||
%{page_number: :rand.uniform(6), page_size: 4},
|
|
||||||
Image |> preload([:tags])
|
|
||||||
)
|
)
|
||||||
|
|
||||||
comments =
|
comments =
|
||||||
|
@ -69,24 +46,14 @@ defmodule PhilomenaWeb.ActivityController do
|
||||||
)
|
)
|
||||||
|
|
||||||
watched = if !!user do
|
watched = if !!user do
|
||||||
{:ok, watched_query} = Images.Query.compile(user, "my:watched")
|
{:ok, watched_images} =
|
||||||
|
ImageLoader.search_string(
|
||||||
|
conn,
|
||||||
|
"my:watched",
|
||||||
|
pagination: %{conn.assigns.image_pagination | page_number: 1}
|
||||||
|
)
|
||||||
|
|
||||||
Image.search_records(
|
watched_images
|
||||||
%{
|
|
||||||
query: %{
|
|
||||||
bool: %{
|
|
||||||
must: watched_query,
|
|
||||||
must_not: [
|
|
||||||
filter,
|
|
||||||
%{term: %{hidden_from_users: true}}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
sort: %{created_at: :desc}
|
|
||||||
},
|
|
||||||
%{conn.assigns.image_pagination | page_number: 1},
|
|
||||||
Image |> preload([:tags])
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
featured_image =
|
featured_image =
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
defmodule PhilomenaWeb.ImageController do
|
defmodule PhilomenaWeb.ImageController do
|
||||||
use PhilomenaWeb, :controller
|
use PhilomenaWeb, :controller
|
||||||
|
|
||||||
|
alias PhilomenaWeb.ImageLoader
|
||||||
alias Philomena.{Images, Images.Image, Comments.Comment, Textile.Renderer}
|
alias Philomena.{Images, Images.Image, Comments.Comment, Textile.Renderer}
|
||||||
alias Philomena.Servers.ImageProcessor
|
alias Philomena.Servers.ImageProcessor
|
||||||
alias Philomena.Interactions
|
alias Philomena.Interactions
|
||||||
|
@ -18,17 +19,7 @@ defmodule PhilomenaWeb.ImageController do
|
||||||
plug PhilomenaWeb.AdvertPlug when action in [:show]
|
plug PhilomenaWeb.AdvertPlug when action in [:show]
|
||||||
|
|
||||||
def index(conn, _params) do
|
def index(conn, _params) do
|
||||||
query = conn.assigns.compiled_filter
|
images = ImageLoader.query(conn, %{match_all: %{}})
|
||||||
|
|
||||||
images =
|
|
||||||
Image.search_records(
|
|
||||||
%{
|
|
||||||
query: %{bool: %{must_not: [query, %{term: %{hidden_from_users: true}}]}},
|
|
||||||
sort: %{created_at: :desc}
|
|
||||||
},
|
|
||||||
conn.assigns.image_pagination,
|
|
||||||
Image |> preload([:tags, :user])
|
|
||||||
)
|
|
||||||
|
|
||||||
interactions =
|
interactions =
|
||||||
Interactions.user_interactions(images, conn.assigns.current_user)
|
Interactions.user_interactions(images, conn.assigns.current_user)
|
||||||
|
|
|
@ -1,53 +1,38 @@
|
||||||
defmodule PhilomenaWeb.ProfileController do
|
defmodule PhilomenaWeb.ProfileController do
|
||||||
use PhilomenaWeb, :controller
|
use PhilomenaWeb, :controller
|
||||||
|
|
||||||
alias Philomena.{Images, Images.Image, Users.User}
|
alias PhilomenaWeb.ImageLoader
|
||||||
import Ecto.Query
|
alias Philomena.Users.User
|
||||||
|
alias Philomena.Interactions
|
||||||
|
|
||||||
plug :load_and_authorize_resource, model: User, only: :show, id_field: "slug", preload: [awards: :badge, public_links: :tag]
|
plug :load_and_authorize_resource, model: User, only: :show, id_field: "slug", preload: [awards: :badge, public_links: :tag]
|
||||||
|
|
||||||
def show(conn, _params) do
|
def show(conn, _params) do
|
||||||
current_user = conn.assigns.current_user
|
current_user = conn.assigns.current_user
|
||||||
filter = conn.assigns.compiled_filter
|
|
||||||
user = conn.assigns.user
|
user = conn.assigns.user
|
||||||
|
|
||||||
{:ok, upload_query} = Images.Query.compile(current_user, "uploader_id:#{user.id}")
|
{:ok, recent_uploads} =
|
||||||
{:ok, fave_query} = Images.Query.compile(current_user, "faved_by_id:#{user.id}")
|
ImageLoader.search_string(
|
||||||
|
conn,
|
||||||
recent_uploads =
|
"uploader_id:#{user.id}",
|
||||||
Image.search_records(
|
pagination: %{page_number: 1, page_size: 6}
|
||||||
%{
|
|
||||||
query: %{
|
|
||||||
bool: %{
|
|
||||||
must_not: filter,
|
|
||||||
must: upload_query
|
|
||||||
}
|
|
||||||
},
|
|
||||||
sort: %{created_at: :desc}
|
|
||||||
},
|
|
||||||
%{page_number: 1, page_size: 6},
|
|
||||||
Image |> preload([:tags])
|
|
||||||
)
|
)
|
||||||
|
|
||||||
recent_faves =
|
{:ok, recent_faves} =
|
||||||
Image.search_records(
|
ImageLoader.search_string(
|
||||||
%{
|
conn,
|
||||||
query: %{
|
"faved_by_id:#{user.id}",
|
||||||
bool: %{
|
pagination: %{page_number: 1, page_size: 6}
|
||||||
must_not: filter,
|
|
||||||
must: fave_query
|
|
||||||
}
|
|
||||||
},
|
|
||||||
sort: %{created_at: :desc}
|
|
||||||
},
|
|
||||||
%{page_number: 1, page_size: 6},
|
|
||||||
Image |> preload([:tags])
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
interactions =
|
||||||
|
Interactions.user_interactions([recent_uploads, recent_faves], current_user)
|
||||||
|
|
||||||
render(
|
render(
|
||||||
conn,
|
conn,
|
||||||
"show.html",
|
"show.html",
|
||||||
user: user,
|
user: user,
|
||||||
|
interactions: interactions,
|
||||||
recent_uploads: recent_uploads,
|
recent_uploads: recent_uploads,
|
||||||
recent_faves: recent_faves,
|
recent_faves: recent_faves,
|
||||||
layout_class: "layout--wide"
|
layout_class: "layout--wide"
|
||||||
|
|
|
@ -1,42 +1,24 @@
|
||||||
defmodule PhilomenaWeb.SearchController do
|
defmodule PhilomenaWeb.SearchController do
|
||||||
use PhilomenaWeb, :controller
|
use PhilomenaWeb, :controller
|
||||||
|
|
||||||
alias Philomena.Images.{Image, Query}
|
alias PhilomenaWeb.ImageLoader
|
||||||
alias Philomena.ImageSorter
|
alias Philomena.ImageSorter
|
||||||
alias Philomena.Interactions
|
alias Philomena.Interactions
|
||||||
|
|
||||||
import Ecto.Query
|
|
||||||
|
|
||||||
def index(conn, params) do
|
def index(conn, params) do
|
||||||
filter = conn.assigns.compiled_filter
|
|
||||||
user = conn.assigns.current_user
|
user = conn.assigns.current_user
|
||||||
sort = ImageSorter.parse_sort(params)
|
sort = ImageSorter.parse_sort(params)
|
||||||
|
|
||||||
with {:ok, query} <- Query.compile(user, params["q"]) do
|
case ImageLoader.search_string(conn, params["q"], sorts: sort.sorts, queries: sort.queries) do
|
||||||
images =
|
{:ok, images} ->
|
||||||
Image.search_records(
|
interactions =
|
||||||
%{
|
Interactions.user_interactions(images, user)
|
||||||
query: %{bool: %{must: [query | sort.queries], must_not: [filter, %{term: %{hidden_from_users: true}}]}},
|
|
||||||
sort: sort.sorts
|
|
||||||
},
|
|
||||||
conn.assigns.image_pagination,
|
|
||||||
Image |> preload(:tags)
|
|
||||||
)
|
|
||||||
|
|
||||||
interactions =
|
|
||||||
Interactions.user_interactions(images, user)
|
|
||||||
|
|
||||||
conn
|
|
||||||
|> render("index.html", images: images, search_query: params["q"], interactions: interactions, layout_class: "layout--wide")
|
|
||||||
else
|
|
||||||
{:error, msg} ->
|
|
||||||
conn
|
conn
|
||||||
|> render("index.html",
|
|> render("index.html", images: images, search_query: params["q"], interactions: interactions, layout_class: "layout--wide")
|
||||||
images: [],
|
|
||||||
error: msg,
|
{:error, msg} ->
|
||||||
search_query: params["q"]
|
render(conn, "index.html", images: [], error: msg, search_query: params["q"])
|
||||||
)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
defmodule PhilomenaWeb.TagController do
|
defmodule PhilomenaWeb.TagController do
|
||||||
use PhilomenaWeb, :controller
|
use PhilomenaWeb, :controller
|
||||||
|
|
||||||
alias Philomena.{Images.Image, Tags, Tags.Tag}
|
alias PhilomenaWeb.ImageLoader
|
||||||
|
alias Philomena.{Tags, Tags.Tag}
|
||||||
alias Philomena.Textile.Renderer
|
alias Philomena.Textile.Renderer
|
||||||
alias Philomena.Interactions
|
alias Philomena.Interactions
|
||||||
alias Philomena.Repo
|
alias Philomena.Repo
|
||||||
|
@ -30,29 +31,16 @@ defmodule PhilomenaWeb.TagController do
|
||||||
end
|
end
|
||||||
|
|
||||||
def show(conn, %{"id" => slug}) do
|
def show(conn, %{"id" => slug}) do
|
||||||
|
user = conn.assigns.current_user
|
||||||
|
|
||||||
tag =
|
tag =
|
||||||
Tag
|
Tag
|
||||||
|> where(slug: ^slug)
|
|> where(slug: ^slug)
|
||||||
|> preload([:aliases, :implied_tags, :implied_by_tags, :dnp_entries, public_links: :user])
|
|> preload([:aliases, :implied_tags, :implied_by_tags, :dnp_entries, public_links: :user])
|
||||||
|> Repo.one()
|
|> Repo.one()
|
||||||
|
|
||||||
query = conn.assigns.compiled_filter
|
|
||||||
user = conn.assigns.current_user
|
|
||||||
|
|
||||||
images =
|
images =
|
||||||
Image.search_records(
|
ImageLoader.query(conn, %{term: %{"namespaced_tags.name" => tag.name}})
|
||||||
%{
|
|
||||||
query: %{
|
|
||||||
bool: %{
|
|
||||||
must_not: [query, %{term: %{hidden_from_users: true}}],
|
|
||||||
must: %{term: %{"namespaced_tags.name": tag.name}}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
sort: %{created_at: :desc}
|
|
||||||
},
|
|
||||||
conn.assigns.image_pagination,
|
|
||||||
Image |> preload([:tags, :user])
|
|
||||||
)
|
|
||||||
|
|
||||||
interactions =
|
interactions =
|
||||||
Interactions.user_interactions(images, user)
|
Interactions.user_interactions(images, user)
|
||||||
|
|
53
lib/philomena_web/image_loader.ex
Normal file
53
lib/philomena_web/image_loader.ex
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
defmodule PhilomenaWeb.ImageLoader do
|
||||||
|
alias Philomena.Images.{Image, Query}
|
||||||
|
import Ecto.Query
|
||||||
|
|
||||||
|
def search_string(conn, search_string, options \\ []) do
|
||||||
|
user = conn.assigns.current_user
|
||||||
|
|
||||||
|
with {:ok, tree} <- Query.compile(user, search_string) do
|
||||||
|
{:ok, query(conn, tree, options)}
|
||||||
|
else
|
||||||
|
error ->
|
||||||
|
error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def query(conn, body, options \\ []) do
|
||||||
|
sort_queries = Keyword.get(options, :queries, [])
|
||||||
|
sort_sorts = Keyword.get(options, :sorts, [%{created_at: :desc}])
|
||||||
|
pagination = Keyword.get(options, :pagination, conn.assigns.image_pagination)
|
||||||
|
|
||||||
|
user = conn.assigns.current_user
|
||||||
|
filter = conn.assigns.compiled_filter
|
||||||
|
filters = create_filters(user, filter)
|
||||||
|
|
||||||
|
Image.search_records(
|
||||||
|
%{
|
||||||
|
query: %{
|
||||||
|
bool: %{
|
||||||
|
must: List.flatten([body, sort_queries]),
|
||||||
|
must_not: filters
|
||||||
|
}
|
||||||
|
},
|
||||||
|
sort: sort_sorts
|
||||||
|
},
|
||||||
|
pagination,
|
||||||
|
Image |> preload(:tags)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp create_filters(user, filter) do
|
||||||
|
[
|
||||||
|
filter,
|
||||||
|
%{term: %{hidden_from_users: true}}
|
||||||
|
]
|
||||||
|
|> maybe_custom_hide(user)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp maybe_custom_hide(filters, %{id: id}),
|
||||||
|
do: [%{term: %{hidden_by_user_ids: id}} | filters]
|
||||||
|
|
||||||
|
defp maybe_custom_hide(filters, _user),
|
||||||
|
do: filters
|
||||||
|
end
|
Loading…
Reference in a new issue