Merge branch 'feature/follow-by-screen-name' of ssh.gitgud.io:dtluna/pleroma into...
[akkoma] / lib / pleroma / web / twitter_api / twitter_api.ex
index 557faf4543683d663e5fe4ba9c922d9f349f8c71..e02c0766fbc8ba9225ee5026bc37195c058657ed 100644 (file)
@@ -13,6 +13,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
     context = ActivityPub.generate_context_id
 
     content = HtmlSanitizeEx.strip_tags(data["status"])
+    |> String.replace("\n", "<br>")
 
     mentions = parse_mentions(content)
 
@@ -79,6 +80,11 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
     |> activities_to_statuses(%{for: user})
   end
 
+  def fetch_user_statuses(user, opts \\ %{}) do
+    ActivityPub.fetch_activities([], opts)
+    |> activities_to_statuses(%{for: user})
+  end
+
   def fetch_conversation(user, id) do
     query = from activity in Activity,
       where: fragment("? @> ?", activity.data, ^%{ statusnetConversationId: id}),
@@ -102,8 +108,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
     end
   end
 
-  def follow(%User{} = follower, followed_id) do
-    with %User{} = followed <- Repo.get(User, followed_id),
+  def follow(%User{} = follower, params) do
+    with { :ok, %User{} = followed } <- get_user(params),
          { :ok, follower } <- User.follow(follower, followed),
          { :ok, activity } <- ActivityPub.insert(%{
            "type" => "Follow",
@@ -113,6 +119,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
          })
     do
       { :ok, follower, followed, activity }
+    else
+      err -> err
     end
   end
 
@@ -121,6 +129,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
          { :ok, follower } <- User.unfollow(follower, followed)
     do
       { :ok, follower, followed }
+    else
+      err -> err
     end
   end
 
@@ -243,12 +253,37 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
       {:ok, UserRepresenter.to_map(user)}
     else
       {:error, changeset} ->
-        errors = Ecto.Changeset.traverse_errors(changeset, fn {msg, opts} -> msg end)
-        |> Poison.encode!
+        errors = Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end)
+      |> Poison.encode!
         {:error, %{error: errors}}
     end
   end
 
+  def get_user(user \\ nil, params) do
+    case params do
+      %{ "user_id" => user_id } ->
+        case target = Repo.get(User, user_id) do
+          nil ->
+            {:error, "No user with such user_id"}
+          _ ->
+            {:ok, target}
+        end
+      %{ "screen_name" => nickname } ->
+        case target = Repo.get_by(User, nickname: nickname) do
+          nil ->
+            {:error, "No user with such screen_name"}
+          _ ->
+            {:ok, target}
+        end
+      _ ->
+        if user do
+          {:ok, user}
+        else
+          {:error, "You need to specify screen_name or user_id"}
+        end
+    end
+  end
+
   defp activities_to_statuses(activities, opts) do
     Enum.map(activities, fn(activity) ->
       activity_to_status(activity, opts)