Add fetching for recipients.
[akkoma] / lib / pleroma / web / activity_pub / activity_pub.ex
1 defmodule Pleroma.Web.ActivityPub.ActivityPub do
2 alias Pleroma.Repo
3 alias Pleroma.Activity
4 import Ecto.Query
5
6 def insert(map) when is_map(map) do
7 Repo.insert(%Activity{data: map})
8 end
9
10 def fetch_public_activities(opts \\ %{}) do
11 public = ["https://www.w3.org/ns/activitystreams#Public"]
12 fetch_activities(public, opts)
13 end
14
15 def fetch_activities(recipients, opts \\ %{}) do
16 since_id = opts["since_id"] || 0
17
18 query = from activity in Activity,
19 limit: 20,
20 order_by: [desc: :inserted_at]
21
22 query = Enum.reduce(recipients, query, fn (recipient, q) ->
23 map = %{ to: [recipient] }
24 from activity in q,
25 or_where: fragment(~s(? @> ?), activity.data, ^map)
26 end)
27
28 query = from activity in query,
29 where: activity.id > ^since_id
30
31 Repo.all(query)
32 |> Enum.reverse
33 end
34 end