Parse user's bio on register
authorMaxim Filippov <colixer@gmail.com>
Sun, 2 Dec 2018 19:03:53 +0000 (22:03 +0300)
committerMaxim Filippov <colixer@gmail.com>
Sun, 2 Dec 2018 19:03:53 +0000 (22:03 +0300)
lib/pleroma/user.ex
lib/pleroma/web/twitter_api/twitter_api.ex
lib/pleroma/web/twitter_api/twitter_api_controller.ex
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 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 89c176da77af298e173393531e7b6a06a19005ee..a1eb09a05d7a70f5456cbaac454b961542764b44 100644 (file)
@@ -949,18 +949,19 @@ 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..baeea5a9e6b2ec71cffc6ad0d65b1ee4e2287b59 100644 (file)
@@ -257,6 +257,34 @@ 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()