Add unfav to Mastodon API.
authorRoger Braun <roger@rogerbraun.net>
Sat, 9 Sep 2017 16:30:02 +0000 (18:30 +0200)
committerRoger Braun <roger@rogerbraun.net>
Sat, 9 Sep 2017 16:30:02 +0000 (18:30 +0200)
lib/pleroma/web/common_api/common_api.ex
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
lib/pleroma/web/router.ex
lib/pleroma/web/twitter_api/twitter_api.ex
lib/pleroma/web/twitter_api/twitter_api_controller.ex
test/web/mastodon_api/mastodon_api_controller_test.exs
test/web/twitter_api/twitter_api_test.exs

index 43cec91216115eb20b8eaa5242c562ba60db3569..b08138534ad7797e87a5f4836ffc5f7452389527 100644 (file)
@@ -33,6 +33,17 @@ defmodule Pleroma.Web.CommonAPI do
     end
   end
 
+  def unfavorite(id_or_ap_id, user) do
+    with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id),
+         false <- activity.data["actor"] == user.ap_id,
+         object <- Object.get_by_ap_id(activity.data["object"]["id"]) do
+      ActivityPub.unlike(user, object)
+    else
+      _ ->
+        {:error, "Could not unfavorite"}
+    end
+  end
+
   # This is a hack for twidere.
   def get_by_id_or_ap_id(id) do
     activity = Repo.get(Activity, id) || Activity.get_create_activity_by_object_ap_id(id)
index c0ae3fd233ebd22dda8b2a6f267b26f1ea55eebe..84b94b35227a846efac56fffcc4797e5cc27c0aa 100644 (file)
@@ -89,7 +89,14 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
   end
 
   def fav_status(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do
-    with {:ok, _announce, %{data: %{"id" => id}}} = CommonAPI.favorite(ap_id_or_id, user),
+    with {:ok, _fav, %{data: %{"id" => id}}} = CommonAPI.favorite(ap_id_or_id, user),
+         %Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id) do
+      render conn, StatusView, "status.json", %{activity: activity, for: user, as: :activity}
+    end
+  end
+
+  def unfav_status(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do
+    with {:ok, %{data: %{"id" => id}}} = CommonAPI.unfavorite(ap_id_or_id, user),
          %Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id) do
       render conn, StatusView, "status.json", %{activity: activity, for: user, as: :activity}
     end
index 33b51fd345e45ce4427b501cbfb4b802c505cf8a..33c3aa53d0d4b7baae74e087fd5f783330577aef 100644 (file)
@@ -60,6 +60,7 @@ defmodule Pleroma.Web.Router do
 
     post "/statuses/:id/reblog", MastodonAPIController, :reblog_status
     post "/statuses/:id/favourite", MastodonAPIController, :fav_status
+    post "/statuses/:id/unfavourite", MastodonAPIController, :unfav_status
   end
 
   scope "/api", Pleroma.Web do
index 0c77e092cf6a4e718628c35326335e33d6711723..657823d1db281a21254165e76146afc3bb70403a 100644 (file)
@@ -115,19 +115,6 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
     end
   end
 
-  def unfavorite(%User{} = user, %Activity{data: %{"object" => object}} = activity) do
-    object = Object.get_by_ap_id(object["id"])
-
-    {:ok, object} = ActivityPub.unlike(user, object)
-    new_data = activity.data
-    |> Map.put("object", object.data)
-
-    status = %{activity | data: new_data}
-    |> activity_to_status(%{for: user})
-
-    {:ok, status}
-  end
-
   def repeat(%User{} = user, ap_id_or_id) do
     with {:ok, _announce, %{data: %{"id" => id}}} = CommonAPI.repeat(ap_id_or_id, user),
          %Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id),
@@ -144,6 +131,14 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
     end
   end
 
+  def unfav(%User{} = user, ap_id_or_id) do
+    with {:ok, %{data: %{"id" => id}}} = CommonAPI.unfavorite(ap_id_or_id, user),
+         %Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id),
+         status <- activity_to_status(activity, %{for: user}) do
+      {:ok, status}
+    end
+  end
+
   def upload(%Plug.Upload{} = file, format \\ "xml") do
     {:ok, object} = ActivityPub.upload(file)
 
index 7da1291b07d9427d509cabd44c0051899502128b..62a2b4f500787fbb56b3b119546a0ec18ec39026 100644 (file)
@@ -155,12 +155,9 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
   end
 
   def unfavorite(%{assigns: %{user: user}} = conn, %{"id" => id}) do
-    activity = get_by_id_or_ap_id(id)
-    {:ok, status} = TwitterAPI.unfavorite(user, activity)
-    response = Poison.encode!(status)
-
-    conn
-    |> json_reply(200, response)
+    with {:ok, status} <- TwitterAPI.unfav(user, id) do
+      json(conn, status)
+    end
   end
 
   def retweet(%{assigns: %{user: user}} = conn, %{"id" => id}) do
index 9af49da123b050b75b1e06c9905e041b6fed6d9d..dc925e2c8e769872d3ed126ec623b05e7965d79a 100644 (file)
@@ -3,7 +3,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
 
   alias Pleroma.Web.TwitterAPI.TwitterAPI
   alias Pleroma.{Repo, User, Activity}
-  alias Pleroma.Web.OStatus
+  alias Pleroma.Web.{OStatus, CommonAPI}
 
   import Pleroma.Factory
 
@@ -149,4 +149,20 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
       assert activity.id == id
     end
   end
+
+  describe "unfavoriting" do
+    test "unfavorites a status and returns it", %{conn: conn} do
+      activity = insert(:note_activity)
+      user = insert(:user)
+
+      {:ok, _, _} = CommonAPI.favorite(activity.id, user)
+
+      conn = conn
+      |> assign(:user, user)
+      |> post("/api/v1/statuses/#{activity.id}/unfavourite")
+
+      assert %{"id" => id, "favourites_count" => 0, "favourited" => false} = json_response(conn, 200)
+      assert activity.id == id
+    end
+  end
 end
index a9494f424b0d2c6881b4bb2094a358ae380c77e8..d5c94d2c7d1f5a8a58e4cb7f3b60b0be37b34759 100644 (file)
@@ -280,7 +280,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
     updated_activity = Activity.get_by_ap_id(note_activity.data["id"])
     assert ActivityRepresenter.to_map(updated_activity, %{user: activity_user, for: user})["fave_num"] == 1
 
-    {:ok, status} = TwitterAPI.unfavorite(user, note_activity)
+    {:ok, status} = TwitterAPI.unfav(user, note_activity.id)
 
     assert status["fave_num"] == 0
   end