37 lines
1013 B
Elixir
37 lines
1013 B
Elixir
|
defmodule Clacks.Timeline do
|
||
|
alias Clacks.{Repo, Actor, Activity, Paginator}
|
||
|
import Ecto.Query
|
||
|
|
||
|
@public "https://www.w3.org/ns/activitystreams#Public"
|
||
|
|
||
|
@spec actor_timeline(actor :: Actor.t(), only_public :: boolean(), params :: map()) :: [
|
||
|
Activity.t()
|
||
|
]
|
||
|
def actor_timeline(actor, only_public \\ true, params) do
|
||
|
Activity
|
||
|
|> restrict_to_actor(actor.ap_id)
|
||
|
|> restrict_to_types(["Create", "Announce"])
|
||
|
|> restirct_to_public(only_public)
|
||
|
|> Paginator.paginate(params)
|
||
|
|> Repo.all()
|
||
|
end
|
||
|
|
||
|
defp restrict_to_actor(query, actor_id) do
|
||
|
where(query, [a], fragment("?->>'actor'", a.data) == ^actor_id)
|
||
|
end
|
||
|
|
||
|
defp restrict_to_types(query, types) do
|
||
|
where(query, [a], fragment("?->>'type'", a.data) in ^types)
|
||
|
end
|
||
|
|
||
|
defp restirct_to_public(query, true) do
|
||
|
where(
|
||
|
query,
|
||
|
[a],
|
||
|
fragment("?->'to' \\? ?", a.data, @public) or fragment("?->'cc' \\? ?", a.data, @public)
|
||
|
)
|
||
|
end
|
||
|
|
||
|
defp restirct_to_public(query, false), do: query
|
||
|
end
|