Connect attachments with objects, not activities.
[akkoma] / lib / pleroma / web / activity_pub / activity_pub.ex
index e7427affbf58eccbacf75889290b1bfb0b2c8c3d..b01def6939937e59d6ff96747e2943f4631bb3fe 100644 (file)
@@ -1,6 +1,6 @@
 defmodule Pleroma.Web.ActivityPub.ActivityPub do
   alias Pleroma.Repo
-  alias Pleroma.Activity
+  alias Pleroma.{Activity, Object, Upload}
   import Ecto.Query
 
   def insert(map) when is_map(map) do
@@ -8,6 +8,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
 
     map = if map["object"] do
       object = Map.put_new_lazy(map["object"], "id", &generate_object_id/0)
+      Repo.insert!(%Object{data: object})
       Map.put(map, "object", object)
     else
       map
@@ -17,19 +18,19 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
   end
 
   def generate_activity_id do
-    host =
-      Application.get_env(:pleroma, Pleroma.Web.Endpoint)
-      |> Keyword.fetch!(:url)
-      |> Keyword.fetch!(:host)
-    "https://#{host}/activities/#{Ecto.UUID.generate}"
+    generate_id("activities")
+  end
+
+  def generate_context_id do
+    generate_id("contexts")
   end
 
   def generate_object_id do
-    host =
-      Application.get_env(:pleroma, Pleroma.Web.Endpoint)
-      |> Keyword.fetch!(:url)
-      |> Keyword.fetch!(:host)
-    "https://#{host}/objects/#{Ecto.UUID.generate}"
+    generate_id("objects")
+  end
+
+  def generate_id(type) do
+    "#{Pleroma.Web.base_url()}/#{type}/#{Ecto.UUID.generate}"
   end
 
   def fetch_public_activities(opts \\ %{}) do
@@ -56,4 +57,15 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
     Repo.all(query)
     |> Enum.reverse
   end
+
+  def fetch_activities_for_context(context) do
+    query = from activity in Activity,
+      where: fragment("? @> ?", activity.data, ^%{ context: context })
+    Repo.all(query)
+  end
+
+  def upload(%Plug.Upload{} = file) do
+    data = Upload.store(file)
+    Repo.insert(%Object{data: data})
+  end
 end