Better activities in ostatus.
authorRoger Braun <roger@rogerbraun.net>
Thu, 20 Apr 2017 08:16:06 +0000 (10:16 +0200)
committerRoger Braun <roger@rogerbraun.net>
Thu, 20 Apr 2017 08:16:06 +0000 (10:16 +0200)
lib/pleroma/web/ostatus/activity_representer.ex [new file with mode: 0644]
lib/pleroma/web/ostatus/feed_representer.ex
lib/pleroma/web/ostatus/ostatus_controller.ex
lib/pleroma/web/router.ex
lib/pleroma/web/websub/websub_server_subscription.ex [new file with mode: 0644]
priv/repo/migrations/20170418200143_create_webssub_server_subscription.exs [new file with mode: 0644]
test/web/ostatus/activity_representer_test.exs [new file with mode: 0644]
test/web/ostatus/feed_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 (file)
index 0000000..558c85d
--- /dev/null
@@ -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
index cb76022fe8e7e3e8006834ff32b99af713d3b8bd..def6844051da7382746906a39ae726417f6cd0e6 100644 (file)
@@ -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 @@ defmodule Pleroma.Web.OStatus.FeedRepresenter 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 @@ defmodule Pleroma.Web.OStatus.FeedRepresenter 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
index ff6d7301ac977ea4cf0a6d20e8d874a92568fa20..4db4a55e651f9550fc03c536aaaa6e4cb4a99c2d 100644 (file)
@@ -23,4 +23,8 @@ defmodule Pleroma.Web.OStatus.OStatusController do
     |> put_resp_content_type("application/atom+xml")
     |> send_resp(200, response)
   end
+
+  def temp(conn, params) do
+    IO.inspect(params)
+  end
 end
index cc1f0e165e6293c6d03e1e9b0c3a33b1441f88fc..e6d000881cfd454af5830d352d17eff8b04cc06e 100644 (file)
@@ -58,10 +58,11 @@ defmodule Pleroma.Web.Router 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 (file)
index 0000000..2562239
--- /dev/null
@@ -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 (file)
index 0000000..fe2fa23
--- /dev/null
@@ -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 (file)
index 0000000..16a9d3b
--- /dev/null
@@ -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 = """
+    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    <id>#{note_activity.data["id"]}</id>
+    <title>New note by #{user.nickname}</title>
+    <content type="html">#{note_activity.data["object"]["content"]}</content>
+    <published>#{inserted_at}</published>
+    <updated>#{updated_at}</updated>
+    """
+
+    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
index e252eca9f7cd63ed8791d44667f6b3f76d017b50..dddc63ebfbdc833b22089588647cf686ffeb81c6 100644 (file)
@@ -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 @@ defmodule Pleroma.Web.OStatus.FeedRepresenterTest 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 = """
     <feed xmlns="http://www.w3.org/2005/Atom" xmlns:activity="http://activitystrea.ms/spec/1.0/">
       <id>#{OStatus.feed_path(user)}</id>
       <title>#{user.nickname}'s timeline</title>
       <updated>#{most_recent_update}</updated>
-      <entries />
       <link rel="hub" href="#{OStatus.pubsub_path}" />
       <author>
         #{user_xml}
       </author>
+      <entry>
+        #{entry_xml}
+      </entry>
     </feed>
     """
     assert clean(res) == clean(expected)