Fix TwitterApiController.
authorlain <lain@soykaf.club>
Fri, 30 Nov 2018 16:07:37 +0000 (17:07 +0100)
committerlain <lain@soykaf.club>
Fri, 30 Nov 2018 16:07:37 +0000 (17:07 +0100)
lib/pleroma/user/info.ex
lib/pleroma/web/twitter_api/twitter_api_controller.ex
test/web/twitter_api/twitter_api_controller_test.exs

index 08370fe3c3f9e329fd4006f1ed7c856d52ff21b6..49387163a054a57cca8eace5dcdafc7a216b89d4 100644 (file)
@@ -114,6 +114,15 @@ defmodule Pleroma.User.Info do
     ])
   end
 
+  def profile_update(info, params) do
+    info
+    |> cast(params, [
+      :locked,
+      :no_rich_text,
+      :default_scope
+    ])
+  end
+
   def set_source_data(info, source_data) do
     params = %{source_data: source_data}
 
index 8a5cf5fcde40f10b2d68fb9c18a36edf06205c4c..b0bd98dbc7bb406a9bb71aa9262a36b83041c07f 100644 (file)
@@ -437,67 +437,52 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
     json(conn, [])
   end
 
-  def update_profile(%{assigns: %{user: user}} = conn, params) do
-    params =
-      if bio = params["description"] do
-        mentions = Formatter.parse_mentions(bio)
-        tags = Formatter.parse_tags(bio)
-
-        emoji =
-          (user.info["source_data"]["tag"] || [])
-          |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end)
-          |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} ->
-            {String.trim(name, ":"), url}
-          end)
-
-        bio_html = CommonUtils.format_input(bio, mentions, tags, "text/plain")
-        Map.put(params, "bio", bio_html |> Formatter.emojify(emoji))
-      else
-        params
-      end
-
-    user =
-      if locked = params["locked"] do
-        with locked <- locked == "true",
-             new_info <- Map.put(user.info, "locked", locked),
-             change <- User.info_changeset(user, %{info: new_info}),
-             {:ok, user} <- User.update_and_set_cache(change) do
-          user
+  defp build_info_cng(user, params) do
+    info_params =
+      ["no_rich_text", "locked"]
+      |> Enum.reduce(%{}, fn key, res ->
+        if value = params[key] do
+          Map.put(res, key, value == "true")
         else
-          _e -> user
+          res
         end
-      else
-        user
-      end
+      end)
 
-    user =
-      if no_rich_text = params["no_rich_text"] do
-        with no_rich_text <- no_rich_text == "true",
-             new_info <- Map.put(user.info, "no_rich_text", no_rich_text),
-             change <- User.info_changeset(user, %{info: new_info}),
-             {:ok, user} <- User.update_and_set_cache(change) do
-          user
-        else
-          _e -> user
-        end
+    info_params =
+      if value = params["default_scope"] do
+        Map.put(info_params, "default_scope", value)
       else
-        user
+        info_params
       end
 
-    user =
-      if default_scope = params["default_scope"] do
-        with new_info <- Map.put(user.info, "default_scope", default_scope),
-             change <- User.info_changeset(user, %{info: new_info}),
-             {:ok, user} <- User.update_and_set_cache(change) do
-          user
-        else
-          _e -> user
-        end
-      else
-        user
-      end
+    User.Info.profile_update(user.info, info_params)
+  end
+
+  defp add_profile_emoji(user, params) do
+    if bio = params["description"] do
+      mentions = Formatter.parse_mentions(bio)
+      tags = Formatter.parse_tags(bio)
+
+      emoji =
+        (user.info.source_data["tag"] || [])
+        |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end)
+        |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} ->
+          {String.trim(name, ":"), url}
+        end)
+
+      bio_html = CommonUtils.format_input(bio, mentions, tags, "text/plain")
+      Map.put(params, "bio", bio_html |> Formatter.emojify(emoji))
+    else
+      params
+    end
+  end
+
+  def update_profile(%{assigns: %{user: user}} = conn, params) do
+    params = add_profile_emoji(user, params)
+    info_cng = build_info_cng(user, params)
 
     with changeset <- User.update_changeset(user, params),
+         changeset <- Ecto.Changeset.put_embed(changeset, :info, info_cng),
          {:ok, user} <- User.update_and_set_cache(changeset) do
       CommonAPI.update(user)
       render(conn, UserView, "user.json", %{user: user, for: user})
index 9062f1c4ec92c8aa6a9f68eab89f44a991b7c20a..a76112e375f561eb659d59ba12acfc7ae998f276 100644 (file)
@@ -67,7 +67,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
 
   describe "GET /statuses/public_timeline.json" do
     test "returns statuses", %{conn: conn} do
-      {:ok, user} = UserBuilder.insert()
+      user = insert(:user)
       activities = ActivityBuilder.insert_list(30, %{}, %{user: user})
       ActivityBuilder.insert_list(10, %{}, %{user: user})
       since_id = List.last(activities).id
@@ -571,7 +571,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
         |> post("/api/blocks/destroy.json", %{user_id: blocked.id})
 
       current_user = Repo.get(User, current_user.id)
-      assert current_user.info["blocks"] == []
+      assert current_user.info.blocks == []
 
       assert json_response(conn, 200) ==
                UserView.render("show.json", %{user: blocked, for: current_user})
@@ -946,7 +946,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
         })
 
       user = Repo.get!(User, user.id)
-      assert user.info["locked"] == true
+      assert user.info.locked == true
 
       assert json_response(conn, 200) == UserView.render("user.json", %{user: user, for: user})
     end
@@ -962,7 +962,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
         })
 
       user = Repo.get!(User, user.id)
-      assert user.info["locked"] == false
+      assert user.info.locked == false
 
       assert json_response(conn, 200) == UserView.render("user.json", %{user: user, for: user})
     end
@@ -1136,7 +1136,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
       user = insert(:user, %{info: %{"locked" => true}})
       other_user = insert(:user)
 
-      {:ok, activity} = ActivityPub.follow(other_user, user)
+      {:ok, _activity} = ActivityPub.follow(other_user, user)
 
       user = Repo.get(User, user.id)
       other_user = Repo.get(User, other_user.id)
@@ -1158,7 +1158,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
       user = insert(:user, %{info: %{"locked" => true}})
       other_user = insert(:user)
 
-      {:ok, activity} = ActivityPub.follow(other_user, user)
+      {:ok, _activity} = ActivityPub.follow(other_user, user)
 
       user = Repo.get(User, user.id)
       other_user = Repo.get(User, other_user.id)
@@ -1181,7 +1181,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
       user = insert(:user, %{info: %{"locked" => true}})
       other_user = insert(:user)
 
-      {:ok, activity} = ActivityPub.follow(other_user, user)
+      {:ok, _activity} = ActivityPub.follow(other_user, user)
 
       user = Repo.get(User, user.id)
       other_user = Repo.get(User, other_user.id)