Basic ObjectRepresenter.
[akkoma] / lib / pleroma / web / twitter_api / twitter_api.ex
index b982832480baea08c74e30af4bf2b6ad68e1f84d..0624e73aa0cd19bf860bda2268cb30eb9a6467ba 100644 (file)
@@ -3,6 +3,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
   alias Pleroma.Web.ActivityPub.ActivityPub
   alias Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter
 
+  import Ecto.Query
+
   def create_status(user = %User{}, data = %{}) do
     date = DateTime.utc_now() |> DateTime.to_iso8601
 
@@ -34,11 +36,15 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
                |> put_in(["object", "context"], context)
                |> put_in(["object", "inReplyTo"], inReplyTo.data["object"]["id"])
                |> put_in(["object", "inReplyToStatusId"], inReplyToId)
+               |> put_in(["statusnetConversationId"], inReplyTo.data["statusnetConversationId"])
+               |> put_in(["object", "statusnetConversationId"], inReplyTo.data["statusnetConversationId"])
                else _e ->
                  activity
                end
 
-    ActivityPub.insert(activity)
+    with {:ok, activity} <- ActivityPub.insert(activity) do
+      add_conversation_id(activity)
+    end
   end
 
   def fetch_friend_statuses(user, opts \\ %{}) do
@@ -51,6 +57,29 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
     |> activities_to_statuses(%{for: user})
   end
 
+  def fetch_conversation(user, id) do
+    query = from activity in Activity,
+      where: fragment("? @> ?", activity.data, ^%{ statusnetConversationId: id}),
+      limit: 1
+
+    with %Activity{} = activity <- Repo.one(query),
+         context <- activity.data["context"],
+         activities <- ActivityPub.fetch_activities_for_context(context),
+         statuses <- activities |> activities_to_statuses(%{for: user})
+    do
+      statuses
+    else e ->
+        IO.inspect(e)
+      []
+    end
+  end
+
+  def fetch_status(user, id) do
+    with %Activity{} = activity <- Repo.get(Activity, id) do
+      activity_to_status(activity, %{for: user})
+    end
+  end
+
   def follow(%User{} = follower, followed_id) do
     with %User{} = followed <- Repo.get(User, followed_id),
          { :ok, follower } <- User.follow(follower, followed)
@@ -67,11 +96,49 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
     end
   end
 
+  def upload(%Plug.Upload{} = file) do
+    {:ok, object} = ActivityPub.upload(file)
+
+    url = List.first(object.data["url"])
+    href = url["href"]
+    type = url["mediaType"]
+
+    # Fake this as good as possible...
+    """
+    <?xml version="1.0" encoding="UTF-8"?>
+    <rsp stat="ok" xmlns:atom="http://www.w3.org/2005/Atom">
+      <mediaid>#{object.id}</mediaid>
+      <media_id>#{object.id}</media_id>
+      <media_id_string>#{object.id}</media_id_string>
+      <media_url>#{href}</media_url>
+      <mediaurl>#{href}</mediaurl>
+      <atom:link rel="enclosure" href="#{href}" type="#{type}"></atom:link>
+    </rsp>
+    """
+  end
+
+  defp add_conversation_id(activity) do
+    if is_integer(activity.data["statusnetConversationId"]) do
+      {:ok, activity}
+    else
+      data = activity.data
+      |> put_in(["object", "statusnetConversationId"], activity.id)
+      |> put_in(["statusnetConversationId"], activity.id)
+
+      changeset = Ecto.Changeset.change(activity, data: data)
+      Repo.update(changeset)
+    end
+  end
+
   defp activities_to_statuses(activities, opts) do
     Enum.map(activities, fn(activity) ->
-      actor = get_in(activity.data, ["actor"])
-      user = Repo.get_by!(User, ap_id: actor)
-      ActivityRepresenter.to_map(activity, Map.merge(opts, %{user: user}))
+      activity_to_status(activity, opts)
     end)
   end
+
+  defp activity_to_status(activity, opts) do
+    actor = get_in(activity.data, ["actor"])
+    user = Repo.get_by!(User, ap_id: actor)
+    ActivityRepresenter.to_map(activity, Map.merge(opts, %{user: user}))
+  end
 end