Refresh subscriptions.
authorRoger Braun <roger@rogerbraun.net>
Wed, 10 May 2017 16:44:06 +0000 (18:44 +0200)
committerRoger Braun <roger@rogerbraun.net>
Wed, 10 May 2017 16:44:06 +0000 (18:44 +0200)
lib/pleroma/web/federator/federator.ex
lib/pleroma/web/websub/websub.ex
test/web/websub/websub_test.exs

index ab3313de103711632d89507ebc2df6f033c82ec1..fbf6ea6bec95a10258e827d0907a731e05b2d08e 100644 (file)
@@ -1,7 +1,7 @@
 defmodule Pleroma.Web.Federator do
   use GenServer
   alias Pleroma.User
-  alias Pleroma.Web.WebFinger
+  alias Pleroma.Web.{WebFinger, Websub}
   require Logger
 
   @websub Application.get_env(:pleroma, :websub)
@@ -9,14 +9,27 @@ defmodule Pleroma.Web.Federator do
   @max_jobs 10
 
   def start_link do
+    spawn(fn ->
+      Process.sleep(1000 * 60 * 1) # 10 minutes
+      enqueue(:refresh_subscriptions, nil)
+    end)
     GenServer.start_link(__MODULE__, {:sets.new(), :queue.new()}, name: __MODULE__)
   end
 
+  def handle(:refresh_subscriptions, _) do
+    Logger.debug("Federator running refresh subscriptions")
+    Websub.refresh_subscriptions()
+    spawn(fn ->
+      Process.sleep(1000 * 60 * 60) # 60 minutes
+      enqueue(:refresh_subscriptions, nil)
+    end)
+  end
+
   def handle(:publish, activity) do
     Logger.debug(fn -> "Running publish for #{activity.data["id"]}" end)
     with actor when not is_nil(actor) <- User.get_cached_by_ap_id(activity.data["actor"]) do
       Logger.debug(fn -> "Sending #{activity.data["id"]} out via websub" end)
-      Pleroma.Web.Websub.publish(Pleroma.Web.OStatus.feed_path(actor), actor, activity)
+      Websub.publish(Pleroma.Web.OStatus.feed_path(actor), actor, activity)
 
       {:ok, actor} = WebFinger.ensure_keys_present(actor)
       Logger.debug(fn -> "Sending #{activity.data["id"]} out via salmon" end)
index 7c8efa917f169182887119d6094c5c050e0167dc..5468758fd36e41326d1b51db8db86d8a918d45e4 100644 (file)
@@ -204,4 +204,19 @@ defmodule Pleroma.Web.Websub do
       {:error, websub}
     end
   end
+
+  def refresh_subscriptions(delta \\ 60 * 60 * 24) do
+    Logger.debug("Refreshing subscriptions")
+
+    cut_off = NaiveDateTime.add(NaiveDateTime.utc_now, delta)
+
+    query = from sub in WebsubClientSubscription,
+      where: sub.valid_until < ^cut_off and sub.state == "active"
+
+    subs = Repo.all(query)
+
+    Enum.map(subs, fn (sub) ->
+      request_subscription(sub)
+    end)
+  end
 end
index 48774dc692c28d3a2d63eae381a836b771c0e241..6f228bccc110bb9574e28475ef5ff2c8d6790f67 100644 (file)
@@ -7,7 +7,7 @@ end
 defmodule Pleroma.Web.WebsubTest do
   use Pleroma.DataCase
   alias Pleroma.Web.Websub
-  alias Pleroma.Web.Websub.WebsubServerSubscription
+  alias Pleroma.Web.Websub.{WebsubServerSubscription, WebsubClientSubscription}
   import Pleroma.Factory
   alias Pleroma.Web.Router.Helpers
 
@@ -174,4 +174,18 @@ defmodule Pleroma.Web.WebsubTest do
 
     signed = Websub.sign("secret", [["て"], ['す']])
   end
+
+  describe "renewing subscriptions" do
+    test "it renews subscriptions that have less than a day of time left" do
+      day = 60 * 60 * 24
+      now = NaiveDateTime.utc_now
+      still_good = insert(:websub_client_subscription, %{valid_until: NaiveDateTime.add(now, 2 * day), topic: "http://example.org/still_good", state: "active"})
+      needs_refresh = insert(:websub_client_subscription, %{valid_until: NaiveDateTime.add(now, day - 100), topic: "http://example.org/needs_refresh", state: "active"})
+
+      refresh = Websub.refresh_subscriptions()
+
+      assert still_good == Repo.get(WebsubClientSubscription, still_good.id)
+      refute needs_refresh == Repo.get(WebsubClientSubscription, needs_refresh.id)
+    end
+  end
 end