Merge branch 'feature/follow-by-screen-name' of ssh.gitgud.io:dtluna/pleroma into...
[akkoma] / lib / pleroma / web / twitter_api / twitter_api.ex
index 58f8bc1d3b7a14a715c9d67fc16535f85d7f350c..e02c0766fbc8ba9225ee5026bc37195c058657ed 100644 (file)
@@ -1,7 +1,7 @@
 defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
   alias Pleroma.{User, Activity, Repo, Object}
   alias Pleroma.Web.ActivityPub.ActivityPub
-  alias Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter
+  alias Pleroma.Web.TwitterAPI.Representers.{ActivityRepresenter, UserRepresenter}
 
   import Ecto.Query
 
@@ -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
 
@@ -227,6 +237,53 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
     end
   end
 
+  def register_user(params) do
+    params = %{
+      nickname: params["nickname"],
+      name: params["fullname"],
+      bio: params["bio"],
+      email: params["email"],
+      password: params["password"],
+      password_confirmation: params["confirm"]
+    }
+
+    changeset = User.register_changeset(%User{}, params)
+
+    with {:ok, user} <- Repo.insert(changeset) do
+      {:ok, UserRepresenter.to_map(user)}
+    else
+      {:error, changeset} ->
+        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)