Add mastodon API endpoint for follow
authoreal <eal@waifu.club>
Wed, 25 Oct 2017 18:02:42 +0000 (21:02 +0300)
committereal <eal@waifu.club>
Sat, 28 Oct 2017 14:09:32 +0000 (17:09 +0300)
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
lib/pleroma/web/router.ex

index a01a199fb8a2f1d83c76f8c206ee618cf3127483..ea85e5bcecbde597dd97775fbbf814055ef8f8d3 100644 (file)
@@ -269,11 +269,13 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     end
   end
 
-  def follow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do
-    with %User{} = followed <- Repo.get(User, id),
-       {:ok, follower} <- User.follow(follower, followed),
-       {:ok, activity} <- ActivityPub.follow(follower, followed) do
+  def follow(%{assigns: %{user: follower}} = conn, params) do
+    with {:ok, %User{} = followed} <- get_user(params),
+         {:ok, follower} <- User.follow(follower, followed),
+         {:ok, activity} <- ActivityPub.follow(follower, followed) do
       render conn, AccountView, "relationship.json", %{user: follower, target: followed}
+    else
+      err -> err
     end
   end
 
@@ -338,4 +340,25 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     Logger.debug("Unimplemented, returning an empty array")
     json(conn, [])
   end
+
+  defp get_user(params) do
+    case params do
+      %{"uri" => uri} ->
+        case target = Repo.get_by(User, nickname: uri) do
+          nil ->
+            {:error, "No user with such nickname"}
+          _ ->
+            {:ok, target}
+        end
+      %{"id" => id} ->
+        case target = Repo.get(User, id) do
+          nil ->
+            {:error, "No user with such id"}
+          _ ->
+            {:ok, target}
+        end
+      _ ->
+        {:error, "You need to specify uri or id"}
+    end
+  end
 end
index cb818b3ccc1d6179f262ce2d9f379ee8a857db33..45c47eefb11eb8bd35e25a9878028cbd593839a0 100644 (file)
@@ -62,6 +62,8 @@ defmodule Pleroma.Web.Router do
     post "/accounts/:id/mute", MastodonAPIController, :relationship_noop
     post "/accounts/:id/unmute", MastodonAPIController, :relationship_noop
 
+    post "/follows", MastodonAPIController, :follow
+
     get "/blocks", MastodonAPIController, :empty_array
     get "/domain_blocks", MastodonAPIController, :empty_array
     get "/follow_requests", MastodonAPIController, :empty_array