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