Refactor posting and make character limit configurable.
authorRoger Braun <rbraun@Bobble.local>
Fri, 15 Sep 2017 12:17:36 +0000 (14:17 +0200)
committerRoger Braun <rbraun@Bobble.local>
Fri, 15 Sep 2017 12:17:36 +0000 (14:17 +0200)
12 files changed:
config/config.exs
lib/pleroma/web/common_api/common_api.ex
lib/pleroma/web/common_api/utils.ex [moved from lib/pleroma/web/twitter_api/utils.ex with 77% similarity]
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
lib/pleroma/web/ostatus/handlers/note_handler.ex
lib/pleroma/web/twitter_api/controllers/util_controller.ex
lib/pleroma/web/twitter_api/representers/activity_representer.ex
lib/pleroma/web/twitter_api/twitter_api.ex
lib/pleroma/web/twitter_api/views/user_view.ex
test/web/common_api/common_api_utils_test.exs [moved from test/web/twitter_api/twitter_api_utils_test.exs with 87% similarity]
test/web/twitter_api/twitter_api_test.exs
test/web/twitter_api/views/user_view_test.exs

index 3861f99014ce38d61f2ca68f29444d805fdf4f14..6696a49023a97f6276fe84db0afb7bc7eb3271cf 100644 (file)
@@ -43,7 +43,8 @@ version = with {version, 0} <- System.cmd("git", ["rev-parse", "HEAD"]) do
 config :pleroma, :instance,
   version: version,
   name: "Pleroma",
-  email: "example@example.com"
+  email: "example@example.com",
+  limit: 5000
 
 # Import environment specific config. This must remain at the bottom
 # of this file so it overrides the configuration defined above.
index b08138534ad7797e87a5f4836ffc5f7452389527..4abf36876c9f29cc2ab09ce57778b9ba039ba745 100644 (file)
@@ -1,6 +1,9 @@
 defmodule Pleroma.Web.CommonAPI do
-  alias Pleroma.{Repo, Activity, Object}
+  alias Pleroma.{Repo, Activity, Object, User}
   alias Pleroma.Web.ActivityPub.ActivityPub
+  alias Pleroma.Formatter
+
+  import Pleroma.Web.CommonAPI.Utils
 
   def delete(activity_id, user) do
     with %Activity{data: %{"object" => %{"id" => object_id}}} <- Repo.get(Activity, activity_id),
@@ -44,13 +47,22 @@ defmodule Pleroma.Web.CommonAPI do
     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)
-    if activity.data["type"] == "Create" do
-      activity
-    else
-      Activity.get_create_activity_by_object_ap_id(activity.data["object"])
+  @instance Application.get_env(:pleroma, :instance)
+  @limit Keyword.get(@instance, :limit)
+  def post(user, %{"status" => status} = data) do
+    with status <- String.trim(status),
+         length when length in 1..@limit <- String.length(status),
+         attachments <- attachments_from_ids(data["media_ids"]),
+         mentions <- Formatter.parse_mentions(status),
+         inReplyTo <- get_replied_to_activity(data["in_reply_to_status_id"]),
+         to <- to_for_user_and_mentions(user, mentions, inReplyTo),
+         content_html <- make_content_html(status, mentions, attachments),
+         context <- make_context(inReplyTo),
+         tags <- Formatter.parse_tags(status),
+         object <- make_note_data(user.ap_id, to, context, content_html, attachments, inReplyTo, tags) do
+      res = ActivityPub.create(to, user, context, object)
+      User.update_note_count(user)
+      res
     end
   end
 end
similarity index 77%
rename from lib/pleroma/web/twitter_api/utils.ex
rename to lib/pleroma/web/common_api/utils.ex
index 0555880310f851e21d8a278ddb1d6dd8310e41bc..0d8b39d70022548f1dae5e768b0265397deb38e2 100644 (file)
@@ -1,22 +1,52 @@
-defmodule Pleroma.Web.TwitterAPI.Utils do
+defmodule Pleroma.Web.CommonAPI.Utils do
   alias Pleroma.{Repo, Object, Formatter, User, Activity}
   alias Pleroma.Web.ActivityPub.Utils
   alias Calendar.Strftime
 
+  # 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)
+    if activity.data["type"] == "Create" do
+      activity
+    else
+      Activity.get_create_activity_by_object_ap_id(activity.data["object"])
+    end
+  end
+
+  def get_replied_to_activity(id) when not is_nil(id) do
+    Repo.get(Activity, id)
+  end
+  def get_replied_to_activity(_), do: nil
+
   def attachments_from_ids(ids) do
     Enum.map(ids || [], fn (media_id) ->
       Repo.get(Object, media_id).data
     end)
   end
 
-  defp shortname(name) do
-    if String.length(name) < 30 do
-      name
+  def to_for_user_and_mentions(user, mentions, inReplyTo) do
+    default_to = [
+      user.follower_address,
+      "https://www.w3.org/ns/activitystreams#Public"
+    ]
+
+    to = default_to ++ Enum.map(mentions, fn ({_, %{ap_id: ap_id}}) -> ap_id end)
+    if inReplyTo do
+      Enum.uniq([inReplyTo.data["actor"] | to])
     else
-      String.slice(name, 0..30) <> "…"
+      to
     end
   end
 
+  def make_content_html(status, mentions, attachments) do
+    status
+    |> format_input(mentions)
+    |> add_attachments(attachments)
+  end
+
+  def make_context(%Activity{data: %{"context" => context}}), do: context
+  def make_context(_), do: Utils.generate_context_id
+
   def add_attachments(text, attachments) do
     attachment_text = Enum.map(attachments, fn
       (%{"url" => [%{"href" => href} | _]}) ->
@@ -53,16 +83,6 @@ defmodule Pleroma.Web.TwitterAPI.Utils do
     end)
   end
 
-  def make_content_html(status, mentions, attachments) do
-    status
-    |> format_input(mentions)
-    |> add_attachments(attachments)
-  end
-
-  def make_context(%Activity{data: %{"context" => context}}), do: context
-  def make_context(_), do: Utils.generate_context_id
-
-  # TODO: Move this to a more fitting space
   def make_note_data(actor, to, context, content_html, attachments, inReplyTo, tags) do
       object = %{
         "type" => "Note",
@@ -98,4 +118,12 @@ defmodule Pleroma.Web.TwitterAPI.Utils do
         ""
     end
   end
+
+  defp shortname(name) do
+    if String.length(name) < 30 do
+      name
+    else
+      String.slice(name, 0..30) <> "…"
+    end
+  end
 end
index fa7f24f2dc0ebf5751ec6b48840bfb7c100870ff..8b794fb61587a3e27bb828853b497973a54ae22b 100644 (file)
@@ -133,15 +133,11 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
   end
 
   def post_status(%{assigns: %{user: user}} = conn, %{"status" => status} = params) do
-    l = status |> String.trim |> String.length
-
     params = params
     |> Map.put("in_reply_to_status_id", params["in_reply_to_id"])
 
-    if l > 0 && l < 5000 do
-      {:ok, activity} = TwitterAPI.create_status(user, params)
-      render conn, StatusView, "status.json", %{activity: activity, for: user, as: :activity}
-    end
+    {:ok, activity} = CommonAPI.post(user, params)
+    render conn, StatusView, "status.json", %{activity: activity, for: user, as: :activity}
   end
 
   def delete_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do
index b2070ab23e1ecfb354a695e321445bc9ba954207..0b06f8f02d17c1fc4709bd503578d15572536146 100644 (file)
@@ -4,7 +4,7 @@ defmodule Pleroma.Web.OStatus.NoteHandler do
   alias Pleroma.{Object, User, Activity}
   alias Pleroma.Web.ActivityPub.ActivityPub
   alias Pleroma.Web.ActivityPub.Utils
-  alias Pleroma.Web.TwitterAPI
+  alias Pleroma.Web.CommonAPI
 
   @doc """
   Get the context for this note. Uses this:
@@ -92,7 +92,7 @@ defmodule Pleroma.Web.OStatus.NoteHandler do
          mentions <- get_mentions(entry),
          to <- make_to_list(actor, mentions),
          date <- XML.string_from_xpath("//published", entry),
-         note <- TwitterAPI.Utils.make_note_data(actor.ap_id, to, context, content_html, attachments, inReplyToActivity, []),
+         note <- CommonAPI.Utils.make_note_data(actor.ap_id, to, context, content_html, attachments, inReplyToActivity, []),
          note <- note |> Map.put("id", id) |> Map.put("tag", tags),
          note <- note |> Map.put("published", date),
          note <- add_external_url(note, entry),
index 41881e742c98e0fd6bc4174ea784f1b6b9eb246e..25ed912c926e8aba806ca651ecbc0d5cf80e1b4c 100644 (file)
@@ -6,15 +6,16 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do
     json(conn, "ok")
   end
 
+  @instance Application.get_env(:pleroma, :instance)
   def config(conn, _params) do
     case get_format(conn) do
       "xml" ->
         response = """
         <config>
           <site>
-            <name>#{Web.base_url}</name>
+            <name>#{Keyword.get(@instance, :name)}</name>
             <site>#{Web.base_url}</site>
-            <textlimit>5000</textlimit>
+            <textlimit>#{Keyword.get(@instance, :limit)}</textlimit>
           </site>
         </config>
         """
@@ -24,22 +25,23 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do
       _ ->
         json(conn, %{
               site: %{
-                name: Web.base_url,
+                name: Keyword.get(@instance, :name),
                 server: Web.base_url,
-                textlimit: 5000
+                textlimit: Keyword.get(@instance, :limit)
               }
              })
     end
   end
 
   def version(conn, _params) do
+    version = Keyword.get(@instance, :version)
     case get_format(conn) do
       "xml" ->
-        response = "<version>Pleroma Dev</version>"
+        response = "<version>#{version}</version>"
         conn
         |> put_resp_content_type("application/xml")
         |> send_resp(200, response)
-      _ -> json(conn, "Pleroma Dev")
+      _ -> json(conn, version)
     end
   end
 end
index b0769de8917b6823c35a6c6cdfe69e252f2392a4..8f7b89175f2da71beb7f1ae3e516882d289cfe25 100644 (file)
@@ -2,7 +2,8 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
   use Pleroma.Web.TwitterAPI.Representers.BaseRepresenter
   alias Pleroma.Web.TwitterAPI.Representers.ObjectRepresenter
   alias Pleroma.{Activity, User}
-  alias Pleroma.Web.TwitterAPI.{TwitterAPI, UserView, Utils}
+  alias Pleroma.Web.TwitterAPI.{TwitterAPI, UserView}
+  alias Pleroma.Web.CommonAPI.Utils
   alias Pleroma.Formatter
 
   defp user_by_ap_id(user_list, ap_id) do
index 657823d1db281a21254165e76146afc3bb70403a..01713037059f78106d40f42adf3f47474f2aa978 100644 (file)
@@ -6,43 +6,10 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
   alias Pleroma.Web.{OStatus, CommonAPI}
   alias Pleroma.Formatter
 
-  import Pleroma.Web.TwitterAPI.Utils
-
   @httpoison Application.get_env(:pleroma, :httpoison)
 
-  def to_for_user_and_mentions(user, mentions, inReplyTo) do
-    default_to = [
-      user.follower_address,
-      "https://www.w3.org/ns/activitystreams#Public"
-    ]
-
-    to = default_to ++ Enum.map(mentions, fn ({_, %{ap_id: ap_id}}) -> ap_id end)
-    if inReplyTo do
-      Enum.uniq([inReplyTo.data["actor"] | to])
-    else
-      to
-    end
-  end
-
-  def get_replied_to_activity(id) when not is_nil(id) do
-    Repo.get(Activity, id)
-  end
-
-  def get_replied_to_activity(_), do: nil
-
   def create_status(%User{} = user, %{"status" => status} = data) do
-    with attachments <- attachments_from_ids(data["media_ids"]),
-         mentions <- Formatter.parse_mentions(status),
-         inReplyTo <- get_replied_to_activity(data["in_reply_to_status_id"]),
-         to <- to_for_user_and_mentions(user, mentions, inReplyTo),
-         content_html <- make_content_html(status, mentions, attachments),
-         context <- make_context(inReplyTo),
-         tags <- Formatter.parse_tags(status),
-         object <- make_note_data(user.ap_id, to, context, content_html, attachments, inReplyTo, tags) do
-      res = ActivityPub.create(to, user, context, object)
-      User.update_note_count(user)
-      res
-    end
+    CommonAPI.post(user, data)
   end
 
   def fetch_friend_statuses(user, opts \\ %{}) do
index 932c018a6faf65db1ac7195f7131d91bc4c39a01..f72e951eb1dd276fe127fefe4b70521fdfaa6a96 100644 (file)
@@ -1,7 +1,7 @@
 defmodule Pleroma.Web.TwitterAPI.UserView do
   use Pleroma.Web, :view
   alias Pleroma.User
-  alias Pleroma.Web.TwitterAPI.Utils
+  alias Pleroma.Web.CommonAPI.Utils
 
   def render("show.json", %{user: user = %User{}} = assigns) do
     render_one(user, Pleroma.Web.TwitterAPI.UserView, "user.json", assigns)
similarity index 87%
rename from test/web/twitter_api/twitter_api_utils_test.exs
rename to test/web/common_api/common_api_utils_test.exs
index ff03414d6cac40ec460791866869b1b62515f3c0..a159c08355255d4831c0b054466b45fec1d79de8 100644 (file)
@@ -1,5 +1,5 @@
-defmodule Pleroma.Web.TwitterAPI.UtilsTest do
-  alias Pleroma.Web.TwitterAPI.Utils
+defmodule Pleroma.Web.CommonAPI.UtilsTest do
+  alias Pleroma.Web.CommonAPI.Utils
   use Pleroma.DataCase
 
   test "it adds attachment links to a given text and attachment set" do
index d5c94d2c7d1f5a8a58e4cb7f3b60b0be37b34759..1cf48dd4b0bcc8a2bbf701d72bc7ef0b9b9c1690 100644 (file)
@@ -1,7 +1,8 @@
 defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
   use Pleroma.DataCase
   alias Pleroma.Builders.{UserBuilder, ActivityBuilder}
-  alias Pleroma.Web.TwitterAPI.{TwitterAPI,UserView,Utils}
+  alias Pleroma.Web.TwitterAPI.{TwitterAPI, UserView}
+  alias Pleroma.Web.CommonAPI.Utils
   alias Pleroma.{Activity, User, Object, Repo}
   alias Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter
   alias Pleroma.Web.ActivityPub.ActivityPub
index 7b32894221fc0ffb7ffaf6391a9f0b564b5b2c0d..886af6b66cc72f06275e0cdc9dd06d623b80f373 100644 (file)
@@ -2,7 +2,8 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
   use Pleroma.DataCase
 
   alias Pleroma.User
-  alias Pleroma.Web.TwitterAPI.{UserView, Utils}
+  alias Pleroma.Web.TwitterAPI.UserView
+  alias Pleroma.Web.CommonAPI.Utils
   alias Pleroma.Builders.UserBuilder
 
   import Pleroma.Factory