philomena/lib/philomena_web/controllers/activity_controller.ex

102 lines
2.4 KiB
Elixir
Raw Normal View History

2019-10-04 18:48:00 +02:00
defmodule PhilomenaWeb.ActivityController do
use PhilomenaWeb, :controller
alias Philomena.{Images, Images.Image, Images.Feature, Channels.Channel, Topics.Topic, Forums.Forum}
alias Philomena.Repo
import Ecto.Query
plug ImageFilter
def index(conn, _params) do
user = conn.assigns.current_user
filter = conn.assigns.compiled_filter
{:ok, image_query} = Images.Query.compile(user, "created_at.lte:3 minutes ago")
images =
Image.search_records(
%{
query: %{
bool: %{
must_not: filter,
must: image_query
}
},
2019-10-05 00:52:44 +02:00
size: 25,
2019-10-04 18:48:00 +02:00
sort: %{created_at: :desc}
},
Image |> preload([:tags])
)
top_scoring =
Image.search_records(
%{
query: %{
bool: %{
must_not: filter,
must: %{range: %{first_seen_at: %{gt: "now-3d"}}}
}
},
size: 4,
from: :rand.uniform(26) - 1,
sort: [%{score: :desc}, %{first_seen_at: :desc}]
},
Image |> preload([:tags])
)
2019-10-05 00:52:44 +02:00
watched = if !!user do
{:ok, watched_query} = Images.Query.compile(user, "my:watched")
2019-10-04 18:48:00 +02:00
Image.search_records(
%{
query: %{
bool: %{
must_not: filter,
must: watched_query
}
},
2019-10-05 00:52:44 +02:00
size: 25,
2019-10-04 18:48:00 +02:00
sort: %{created_at: :desc}
},
Image |> preload([:tags])
)
end
featured_image =
Image
|> join(:inner, [i], f in Feature, on: [id: f.image_id])
|> order_by([i, f], desc: f.created_at)
|> limit(1)
|> Repo.one()
2019-10-05 00:52:44 +02:00
streams =
Channel
|> where([c], c.nsfw == false)
|> where([c], not is_nil(c.last_fetched_at))
|> order_by(desc: :is_live, asc: :title)
|> limit(6)
|> Repo.all()
2019-10-04 18:48:00 +02:00
topics =
Topic
2019-10-05 00:52:44 +02:00
|> join(:inner, [t], f in Forum, on: [id: t.forum_id])
2019-10-04 18:48:00 +02:00
|> where([t, _f], t.hidden_from_users == false)
2019-10-05 00:56:51 +02:00
|> where([t, _f], fragment("? !~ ?", t.title, "NSFW"))
2019-10-04 18:48:00 +02:00
|> where([_t, f], f.access_level == "normal")
|> order_by(desc: :last_replied_to_at)
|> preload([:forum, last_post: :user])
|> limit(6)
2019-10-05 00:52:44 +02:00
|> Repo.all()
2019-10-04 18:48:00 +02:00
render(
conn,
"index.html",
images: images,
top_scoring: top_scoring,
watched: watched,
featured_image: featured_image,
2019-10-05 00:52:44 +02:00
streams: streams,
2019-10-04 18:48:00 +02:00
topics: topics
)
end
end