Merge branch 'fix/parse-user-bio' into 'develop'
authorlambda <pleromagit@rogerbraun.net>
Mon, 3 Dec 2018 16:31:00 +0000 (16:31 +0000)
committerlambda <pleromagit@rogerbraun.net>
Mon, 3 Dec 2018 16:31:00 +0000 (16:31 +0000)
Parse user's bio on register

See merge request pleroma/pleroma!492

lib/pleroma/user.ex
lib/pleroma/web/mastodon_api/mastodon_api_controller.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_controller_test.exs
test/web/twitter_api/twitter_api_test.exs

index 76712b4bf6bd071571f1fc3da44f0f6b97adf062..3bd92c15706591addbadd2abd4d90421eb5e71a5 100644 (file)
@@ -4,6 +4,8 @@ defmodule Pleroma.User do
   import Ecto.{Changeset, Query}
   alias Pleroma.{Repo, User, Object, Web, Activity, Notification}
   alias Comeonin.Pbkdf2
+  alias Pleroma.Formatter
+  alias Pleroma.Web.CommonAPI.Utils, as: CommonUtils
   alias Pleroma.Web.{OStatus, Websub, OAuth}
   alias Pleroma.Web.ActivityPub.{Utils, ActivityPub}
 
@@ -802,4 +804,18 @@ defmodule Pleroma.User do
         :error
     end
   end
+
+  def parse_bio(bio, user \\ %User{info: %{source_data: %{}}}) 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)
+
+    CommonUtils.format_input(bio, mentions, tags, "text/plain") |> Formatter.emojify(emoji)
+  end
 end
index d19d55044531ea690e46b38f56290c55f2db4059..543fdf4161cad45020110262c1820abcc7d7ea3c 100644 (file)
@@ -55,7 +55,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     user_params =
       %{}
       |> add_if_present(params, "display_name", :name)
-      |> add_if_present(params, "note", :bio)
+      |> add_if_present(params, "note", :bio, fn value -> {:ok, User.parse_bio(value)} end)
       |> add_if_present(params, "avatar", :avatar, fn value ->
         with %Plug.Upload{} <- value,
              {:ok, object} <- ActivityPub.upload(value, type: :avatar) do
index 39a2974bb41b8413b83018d4e0eca1b1dd525607..c19a4f0849d6ce85862cdfce1f1d5cc48a886058 100644 (file)
@@ -132,7 +132,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
     params = %{
       nickname: params["nickname"],
       name: params["fullname"],
-      bio: params["bio"],
+      bio: User.parse_bio(params["bio"]),
       email: params["email"],
       password: params["password"],
       password_confirmation: params["confirm"]
index ff644dd7983e312d96c8ef7d2270698ae30dfcc5..961250d921e7a0ee9fd9cb2194203597481611fc 100644 (file)
@@ -448,27 +448,16 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
     User.Info.profile_update(user.info, info_params)
   end
 
-  defp add_profile_emoji(user, params) do
+  defp parse_profile_bio(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))
+      Map.put(params, "bio", User.parse_bio(bio, user))
     else
       params
     end
   end
 
   def update_profile(%{assigns: %{user: user}} = conn, params) do
-    params = add_profile_emoji(user, params)
+    params = parse_profile_bio(user, params)
     info_cng = build_info_cng(user, params)
 
     with changeset <- User.update_changeset(user, params),
index 7042a6acef38a4d5f907d09b3c943eaa1c3b1f53..098acb59ffa9a65dd3e8a0636929671cffe9ad65 100644 (file)
@@ -1253,14 +1253,21 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
   describe "updating credentials" do
     test "updates the user's bio", %{conn: conn} do
       user = insert(:user)
+      user2 = insert(:user)
 
       conn =
         conn
         |> assign(:user, user)
-        |> patch("/api/v1/accounts/update_credentials", %{"note" => "I drink #cofe"})
+        |> patch("/api/v1/accounts/update_credentials", %{
+          "note" => "I drink #cofe with @#{user2.nickname}"
+        })
 
       assert user = json_response(conn, 200)
-      assert user["note"] == "I drink #cofe"
+
+      assert user["note"] ==
+               "I drink <a href=\"http://localhost:4001/tag/cofe\">#cofe</a> with <span><a href=\"#{
+                 user2.ap_id
+               }\">@<span>#{user2.nickname}</span></a></span>"
     end
 
     test "updates the user's locking status", %{conn: conn} do
index 539876323f842e9501b544409bc0e9e7795397f7..a6495ffc17998d6389959a02ee4fa4327bd3f1b5 100644 (file)
@@ -955,18 +955,21 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
   describe "POST /api/account/update_profile.json" do
     test "it updates a user's profile", %{conn: conn} do
       user = insert(:user)
+      user2 = insert(:user)
 
       conn =
         conn
         |> assign(:user, user)
         |> post("/api/account/update_profile.json", %{
           "name" => "new name",
-          "description" => "new description"
+          "description" => "hi @#{user2.nickname}"
         })
 
       user = Repo.get!(User, user.id)
       assert user.name == "new name"
-      assert user.bio == "new description"
+
+      assert user.bio ==
+               "hi <span><a class='mention' href='#{user2.ap_id}'>@<span>#{user2.nickname}</span></a></span>"
 
       assert json_response(conn, 200) == UserView.render("user.json", %{user: user, for: user})
     end
index ec13b89d40f5bb8df7877873b69e4928b072e39c..28230699f3e29f33d3939436e4d187f71430011c 100644 (file)
@@ -257,6 +257,35 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
              UserView.render("show.json", %{user: fetched_user})
   end
 
+  test "it registers a new user and parses mentions in the bio" do
+    data1 = %{
+      "nickname" => "john",
+      "email" => "john@gmail.com",
+      "fullname" => "John Doe",
+      "bio" => "test",
+      "password" => "bear",
+      "confirm" => "bear"
+    }
+
+    {:ok, user1} = TwitterAPI.register_user(data1)
+
+    data2 = %{
+      "nickname" => "lain",
+      "email" => "lain@wired.jp",
+      "fullname" => "lain iwakura",
+      "bio" => "@john test",
+      "password" => "bear",
+      "confirm" => "bear"
+    }
+
+    {:ok, user2} = TwitterAPI.register_user(data2)
+
+    expected_text =
+      "<span><a class='mention' href='#{user1.ap_id}'>@<span>john</span></a></span> test"
+
+    assert user2.bio == expected_text
+  end
+
   @moduletag skip: "needs 'registrations_open: false' in config"
   test "it registers a new user via invite token and returns the user." do
     {:ok, token} = UserInviteToken.create_token()