From cc330421fd789f002d14e19692c4fbe75c0df4f2 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Thu, 20 Apr 2017 10:16:06 +0200 Subject: [PATCH] Better activities in ostatus. --- .../web/ostatus/activity_representer.ex | 20 ++++++++++ lib/pleroma/web/ostatus/feed_representer.ex | 10 +++-- lib/pleroma/web/ostatus/ostatus_controller.ex | 4 ++ lib/pleroma/web/router.ex | 5 ++- .../web/websub/websub_server_subscription.ex | 11 ++++++ ...143_create_webssub_server_subscription.exs | 15 ++++++++ .../web/ostatus/activity_representer_test.exs | 38 +++++++++++++++++++ test/web/ostatus/feed_representer_test.exs | 9 ++++- 8 files changed, 104 insertions(+), 8 deletions(-) create mode 100644 lib/pleroma/web/ostatus/activity_representer.ex create mode 100644 lib/pleroma/web/websub/websub_server_subscription.ex create mode 100644 priv/repo/migrations/20170418200143_create_webssub_server_subscription.exs create mode 100644 test/web/ostatus/activity_representer_test.exs diff --git a/lib/pleroma/web/ostatus/activity_representer.ex b/lib/pleroma/web/ostatus/activity_representer.ex new file mode 100644 index 000000000..558c85df4 --- /dev/null +++ b/lib/pleroma/web/ostatus/activity_representer.ex @@ -0,0 +1,20 @@ +defmodule Pleroma.Web.OStatus.ActivityRepresenter do + def to_simple_form(activity, user) do + h = fn(str) -> [to_charlist(str)] end + + updated_at = activity.updated_at + |> NaiveDateTime.to_iso8601 + inserted_at = activity.inserted_at + |> NaiveDateTime.to_iso8601 + + [ + {:"activity:object-type", ['http://activitystrea.ms/schema/1.0/note']}, + {:"activity:verb", ['http://activitystrea.ms/schema/1.0/post']}, + {:id, h.(activity.data["id"])}, + {:title, ['New note by #{user.nickname}']}, + {:content, [type: 'html'], h.(activity.data["object"]["content"])}, + {:published, h.(inserted_at)}, + {:updated, h.(updated_at)} + ] + end +end diff --git a/lib/pleroma/web/ostatus/feed_representer.ex b/lib/pleroma/web/ostatus/feed_representer.ex index cb76022fe..def684405 100644 --- a/lib/pleroma/web/ostatus/feed_representer.ex +++ b/lib/pleroma/web/ostatus/feed_representer.ex @@ -1,6 +1,6 @@ defmodule Pleroma.Web.OStatus.FeedRepresenter do alias Pleroma.Web.OStatus - alias Pleroma.Web.OStatus.UserRepresenter + alias Pleroma.Web.OStatus.{UserRepresenter, ActivityRepresenter} def to_simple_form(user, activities, users) do most_recent_update = List.first(activities).updated_at @@ -8,7 +8,10 @@ def to_simple_form(user, activities, users) do h = fn(str) -> [to_charlist(str)] end - entries = [] + entries = Enum.map(activities, fn(activity) -> + {:entry, ActivityRepresenter.to_simple_form(activity, user)} + end) + [{ :feed, [ xmlns: 'http://www.w3.org/2005/Atom', @@ -17,10 +20,9 @@ def to_simple_form(user, activities, users) do {:id, h.(OStatus.feed_path(user))}, {:title, ['#{user.nickname}\'s timeline']}, {:updated, h.(most_recent_update)}, - {:entries, []}, {:link, [rel: 'hub', href: h.(OStatus.pubsub_path)], []}, {:author, UserRepresenter.to_simple_form(user)} - ] + ] ++ entries }] end end diff --git a/lib/pleroma/web/ostatus/ostatus_controller.ex b/lib/pleroma/web/ostatus/ostatus_controller.ex index ff6d7301a..4db4a55e6 100644 --- a/lib/pleroma/web/ostatus/ostatus_controller.ex +++ b/lib/pleroma/web/ostatus/ostatus_controller.ex @@ -23,4 +23,8 @@ def feed(conn, %{"nickname" => nickname}) do |> put_resp_content_type("application/atom+xml") |> send_resp(200, response) end + + def temp(conn, params) do + IO.inspect(params) + end end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index cc1f0e165..e6d000881 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -58,10 +58,11 @@ def user_fetcher(username) do plug :accepts, ["xml", "atom"] end - scope "/users", Pleroma.Web do + scope "/", Pleroma.Web do pipe_through :ostatus - get "/:nickname/feed", OStatus.OStatusController, :feed + get "/users/:nickname/feed", OStatus.OStatusController, :feed + post "/push/hub", OStatus.OStatusController, :temp end scope "/.well-known", Pleroma.Web do diff --git a/lib/pleroma/web/websub/websub_server_subscription.ex b/lib/pleroma/web/websub/websub_server_subscription.ex new file mode 100644 index 000000000..2562239ad --- /dev/null +++ b/lib/pleroma/web/websub/websub_server_subscription.ex @@ -0,0 +1,11 @@ +defmodule Pleroma.Web.Websub.WebsubServerSubscription do + use Ecto.Schema + + schema "websub_server_subscriptions" do + field :topic, :string + field :callback, :string + field :secret, :string + field :valid_until, :naive_datetime + field :state, :string + end +end diff --git a/priv/repo/migrations/20170418200143_create_webssub_server_subscription.exs b/priv/repo/migrations/20170418200143_create_webssub_server_subscription.exs new file mode 100644 index 000000000..fe2fa2304 --- /dev/null +++ b/priv/repo/migrations/20170418200143_create_webssub_server_subscription.exs @@ -0,0 +1,15 @@ +defmodule Pleroma.Repo.Migrations.CreateWebsubServerSubscription do + use Ecto.Migration + + def change do + create table(:websub_server_subscriptions) do + add :topic, :string + add :callback, :string + add :secret, :string + add :valid_until, :naive_datetime + add :state, :string + + timestamps() + end + end +end diff --git a/test/web/ostatus/activity_representer_test.exs b/test/web/ostatus/activity_representer_test.exs new file mode 100644 index 000000000..16a9d3b00 --- /dev/null +++ b/test/web/ostatus/activity_representer_test.exs @@ -0,0 +1,38 @@ +defmodule Pleroma.Web.OStatus.ActivityRepresenterTest do + use Pleroma.DataCase + + alias Pleroma.Web.OStatus.ActivityRepresenter + alias Pleroma.User + + import Pleroma.Factory + + test "a note activity" do + note_activity = insert(:note_activity) + updated_at = note_activity.updated_at + |> NaiveDateTime.to_iso8601 + inserted_at = note_activity.inserted_at + |> NaiveDateTime.to_iso8601 + + user = User.get_cached_by_ap_id(note_activity.data["actor"]) + + expected = """ + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + #{note_activity.data["id"]} + New note by #{user.nickname} + #{note_activity.data["object"]["content"]} + #{inserted_at} + #{updated_at} + """ + + tuple = ActivityRepresenter.to_simple_form(note_activity, user) + + res = :xmerl.export_simple_content(tuple, :xmerl_xml) |> IO.iodata_to_binary + + assert clean(res) == clean(expected) + end + + defp clean(string) do + String.replace(string, ~r/\s/, "") + end +end diff --git a/test/web/ostatus/feed_representer_test.exs b/test/web/ostatus/feed_representer_test.exs index e252eca9f..dddc63ebf 100644 --- a/test/web/ostatus/feed_representer_test.exs +++ b/test/web/ostatus/feed_representer_test.exs @@ -2,7 +2,7 @@ defmodule Pleroma.Web.OStatus.FeedRepresenterTest do use Pleroma.DataCase import Pleroma.Factory alias Pleroma.User - alias Pleroma.Web.OStatus.{FeedRepresenter, UserRepresenter} + alias Pleroma.Web.OStatus.{FeedRepresenter, UserRepresenter, ActivityRepresenter} alias Pleroma.Web.OStatus test "returns a feed of the last 20 items of the user" do @@ -18,16 +18,21 @@ test "returns a feed of the last 20 items of the user" do user_xml = UserRepresenter.to_simple_form(user) |> :xmerl.export_simple_content(:xmerl_xml) + entry_xml = ActivityRepresenter.to_simple_form(note_activity, user) + |> :xmerl.export_simple_content(:xmerl_xml) + expected = """ #{OStatus.feed_path(user)} #{user.nickname}'s timeline #{most_recent_update} - #{user_xml} + + #{entry_xml} + """ assert clean(res) == clean(expected)