[#210] TwitterAPI: implemented /api/media/metadata/create
authorIvan Tashkinov <ivantashkinov@gmail.com>
Tue, 4 Dec 2018 15:35:57 +0000 (18:35 +0300)
committerIvan Tashkinov <ivantashkinov@gmail.com>
Tue, 4 Dec 2018 15:35:57 +0000 (18:35 +0300)
to allow uploads description (alt text) setting.

lib/pleroma/web/router.ex
lib/pleroma/web/twitter_api/twitter_api_controller.ex
test/web/twitter_api/twitter_api_controller_test.exs

index d6a9d57798882186235eb00d9f317740be970351..b7c79d2eb06d1668b8b2fa54937b64371e5853b4 100644 (file)
@@ -324,6 +324,7 @@ defmodule Pleroma.Web.Router do
 
     post("/statusnet/media/upload", TwitterAPI.Controller, :upload)
     post("/media/upload", TwitterAPI.Controller, :upload_json)
+    post("/media/metadata/create", TwitterAPI.Controller, :update_media)
 
     post("/favorites/create/:id", TwitterAPI.Controller, :favorite)
     post("/favorites/create", TwitterAPI.Controller, :favorite)
index 961250d921e7a0ee9fd9cb2194203597481611fc..a9e45f91e06514dc4f609d88d164e19f1003a106 100644 (file)
@@ -4,7 +4,7 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
   alias Pleroma.Web.TwitterAPI.{TwitterAPI, UserView, ActivityView, NotificationView}
   alias Pleroma.Web.CommonAPI
   alias Pleroma.Web.CommonAPI.Utils, as: CommonUtils
-  alias Pleroma.{Repo, Activity, User, Notification}
+  alias Pleroma.{Repo, Activity, Object, User, Notification}
   alias Pleroma.Web.ActivityPub.ActivityPub
   alias Pleroma.Web.ActivityPub.Utils
   alias Ecto.Changeset
@@ -226,6 +226,22 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
     end
   end
 
+  @doc "https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-metadata-create"
+  def update_media(%{assigns: %{user: _}} = conn, %{"media_id" => id} = data) do
+    description = get_in(data, ["alt_text", "text"]) || data["name"] || data["description"]
+
+    with %Object{} = object <- Repo.get(Object, id), is_binary(description) do
+      new_data = Map.put(object.data, "name", description)
+
+      change = Object.change(object, %{data: new_data})
+      {:ok, _} = Repo.update(change)
+    end
+
+    conn
+    |> put_status(:no_content)
+    |> json("")
+  end
+
   def upload(conn, %{"media" => media}) do
     response = TwitterAPI.upload(media)
 
index a6495ffc17998d6389959a02ee4fa4327bd3f1b5..8faa4b58ed79d5cdd0bd97c7d39047523cb95d84 100644 (file)
@@ -1253,4 +1253,24 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
       assert [user.id, user_two.id, user_three.id] == Enum.map(resp, fn %{"id" => id} -> id end)
     end
   end
+
+  describe "POST /api/media/metadata/create" do
+    test "it updates `data[name]` of referenced Object with provided value", %{conn: conn} do
+      user = insert(:user)
+      object = insert(:note)
+      description = "Informative description of the image. Initial: #{object.data["name"]}}"
+
+      _conn =
+        conn
+        |> assign(:user, user)
+        |> post("/api/media/metadata/create.json", %{
+          "media_id" => object.id,
+          "alt_text" => %{"text" => description}
+        })
+        |> json_response(:no_content)
+
+      object = Repo.get!(Object, object.id)
+      assert object.data["name"] == description
+    end
+  end
 end