From 50409326a853db7bd9f538f0ddbec805c134920f Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Fri, 15 Sep 2017 14:17:36 +0200 Subject: [PATCH] Refactor posting and make character limit configurable. --- config/config.exs | 3 +- lib/pleroma/web/common_api/common_api.ex | 28 ++++++--- .../web/{twitter_api => common_api}/utils.ex | 58 ++++++++++++++----- .../mastodon_api/mastodon_api_controller.ex | 8 +-- .../web/ostatus/handlers/note_handler.ex | 4 +- .../controllers/util_controller.ex | 14 +++-- .../representers/activity_representer.ex | 3 +- lib/pleroma/web/twitter_api/twitter_api.ex | 35 +---------- .../web/twitter_api/views/user_view.ex | 2 +- .../common_api_utils_test.exs} | 4 +- test/web/twitter_api/twitter_api_test.exs | 3 +- test/web/twitter_api/views/user_view_test.exs | 3 +- 12 files changed, 87 insertions(+), 78 deletions(-) rename lib/pleroma/web/{twitter_api => common_api}/utils.ex (77%) rename test/web/{twitter_api/twitter_api_utils_test.exs => common_api/common_api_utils_test.exs} (87%) diff --git a/config/config.exs b/config/config.exs index 3861f9901..6696a4902 100644 --- a/config/config.exs +++ b/config/config.exs @@ -43,7 +43,8 @@ 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. diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index b08138534..4abf36876 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -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 @@ def unfavorite(id_or_ap_id, user) 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 diff --git a/lib/pleroma/web/twitter_api/utils.ex b/lib/pleroma/web/common_api/utils.ex similarity index 77% rename from lib/pleroma/web/twitter_api/utils.ex rename to lib/pleroma/web/common_api/utils.ex index 055588031..0d8b39d70 100644 --- a/lib/pleroma/web/twitter_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -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 @@ def add_user_links(text, mentions) 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 @@ def date_to_asctime(date) do "" end end + + defp shortname(name) do + if String.length(name) < 30 do + name + else + String.slice(name, 0..30) <> "…" + end + end end diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index fa7f24f2d..8b794fb61 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -133,15 +133,11 @@ def get_context(%{assigns: %{user: user}} = conn, %{"id" => id}) 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 diff --git a/lib/pleroma/web/ostatus/handlers/note_handler.ex b/lib/pleroma/web/ostatus/handlers/note_handler.ex index b2070ab23..0b06f8f02 100644 --- a/lib/pleroma/web/ostatus/handlers/note_handler.ex +++ b/lib/pleroma/web/ostatus/handlers/note_handler.ex @@ -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 @@ def handle_note(entry, doc \\ nil) 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), diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index 41881e742..25ed912c9 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -6,15 +6,16 @@ def help_test(conn, _params) do json(conn, "ok") end + @instance Application.get_env(:pleroma, :instance) def config(conn, _params) do case get_format(conn) do "xml" -> response = """ - #{Web.base_url} + #{Keyword.get(@instance, :name)} #{Web.base_url} - 5000 + #{Keyword.get(@instance, :limit)} """ @@ -24,22 +25,23 @@ def config(conn, _params) 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 = "Pleroma Dev" + response = "#{version}" conn |> put_resp_content_type("application/xml") |> send_resp(200, response) - _ -> json(conn, "Pleroma Dev") + _ -> json(conn, version) end end end diff --git a/lib/pleroma/web/twitter_api/representers/activity_representer.ex b/lib/pleroma/web/twitter_api/representers/activity_representer.ex index b0769de89..8f7b89175 100644 --- a/lib/pleroma/web/twitter_api/representers/activity_representer.ex +++ b/lib/pleroma/web/twitter_api/representers/activity_representer.ex @@ -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 diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index 657823d1d..017130370 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -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 diff --git a/lib/pleroma/web/twitter_api/views/user_view.ex b/lib/pleroma/web/twitter_api/views/user_view.ex index 932c018a6..f72e951eb 100644 --- a/lib/pleroma/web/twitter_api/views/user_view.ex +++ b/lib/pleroma/web/twitter_api/views/user_view.ex @@ -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) diff --git a/test/web/twitter_api/twitter_api_utils_test.exs b/test/web/common_api/common_api_utils_test.exs 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 ff03414d6..a159c0835 100644 --- a/test/web/twitter_api/twitter_api_utils_test.exs +++ b/test/web/common_api/common_api_utils_test.exs @@ -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 diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs index d5c94d2c7..1cf48dd4b 100644 --- a/test/web/twitter_api/twitter_api_test.exs +++ b/test/web/twitter_api/twitter_api_test.exs @@ -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 diff --git a/test/web/twitter_api/views/user_view_test.exs b/test/web/twitter_api/views/user_view_test.exs index 7b3289422..886af6b66 100644 --- a/test/web/twitter_api/views/user_view_test.exs +++ b/test/web/twitter_api/views/user_view_test.exs @@ -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