don't expire pinned posts
authorAlexander Strizhakov <alex.strizhakov@gmail.com>
Mon, 24 Aug 2020 10:43:02 +0000 (13:43 +0300)
committerrinpatch <rinpatch@sdf.org>
Thu, 10 Sep 2020 18:50:41 +0000 (21:50 +0300)
lib/pleroma/activity.ex
lib/pleroma/workers/purge_expired_activity.ex
test/workers/purge_expired_activity_test.exs

index 03cd3b8c0cd00d6db3ebf384c802b42d8585e5d1..84aba9572a7fb9bf49971eee41ca54ddcf9bde1b 100644 (file)
@@ -301,14 +301,14 @@ defmodule Pleroma.Activity do
     |> Repo.all()
   end
 
-  def follow_requests_for_actor(%Pleroma.User{ap_id: ap_id}) do
+  def follow_requests_for_actor(%User{ap_id: ap_id}) do
     ap_id
     |> Queries.by_object_id()
     |> Queries.by_type("Follow")
     |> where([a], fragment("? ->> 'state' = 'pending'", a.data))
   end
 
-  def following_requests_for_actor(%Pleroma.User{ap_id: ap_id}) do
+  def following_requests_for_actor(%User{ap_id: ap_id}) do
     Queries.by_type("Follow")
     |> where([a], fragment("?->>'state' = 'pending'", a.data))
     |> where([a], a.actor == ^ap_id)
@@ -343,4 +343,9 @@ defmodule Pleroma.Activity do
     actor = user_actor(activity)
     activity.id in actor.pinned_activities
   end
+
+  @spec pinned_by_actor?(Activity.t(), User.t()) :: boolean()
+  def pinned_by_actor?(%Activity{id: id}, %User{} = user) do
+    id in user.pinned_activities
+  end
 end
index 016b000c1704b264327456b59ac4415fcb54c551..ba005300883d15d1edfa1d984eefd250c5ef86a3 100644 (file)
@@ -21,8 +21,18 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do
   @impl true
   def perform(%Oban.Job{args: %{"activity_id" => id}}) do
     with %Pleroma.Activity{} = activity <- find_activity(id),
-         %Pleroma.User{} = user <- find_user(activity.object.data["actor"]) do
+         %Pleroma.User{} = user <- find_user(activity.object.data["actor"]),
+         false <- pinned_by_actor?(activity, user) do
       Pleroma.Web.CommonAPI.delete(activity.id, user)
+    else
+      :pinned_by_actor ->
+        # if activity is pinned, schedule deletion on next day
+        enqueue(%{activity_id: id, expires_at: DateTime.add(DateTime.utc_now(), 24 * 3600)})
+
+        :ok
+
+      error ->
+        error
     end
   end
 
@@ -54,6 +64,12 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do
     end
   end
 
+  defp pinned_by_actor?(activity, user) do
+    with true <- Pleroma.Activity.pinned_by_actor?(activity, user) do
+      :pinned_by_actor
+    end
+  end
+
   def get_expiration(id) do
     from(j in Oban.Job,
       where: j.state == "scheduled",
index 8b5dc9fd208d694d64cbd90f772fe35f3a3c4844..736d7d5673e4bbf7dc847b8cd19a13f35dd92306 100644 (file)
@@ -44,4 +44,25 @@ defmodule Pleroma.Workers.PurgeExpiredActivityTest do
 
     assert %Oban.Job{} = Pleroma.Workers.PurgeExpiredActivity.get_expiration(activity.id)
   end
+
+  test "don't delete pinned posts, schedule deletion on next day" do
+    activity = insert(:note_activity)
+
+    assert {:ok, _} =
+             PurgeExpiredActivity.enqueue(%{
+               activity_id: activity.id,
+               expires_at: DateTime.utc_now(),
+               validate: false
+             })
+
+    user = Pleroma.User.get_by_ap_id(activity.actor)
+    {:ok, activity} = Pleroma.Web.CommonAPI.pin(activity.id, user)
+
+    assert %{success: 1, failure: 0} ==
+             Oban.drain_queue(queue: :activity_expiration, with_scheduled: true)
+
+    job = Pleroma.Workers.PurgeExpiredActivity.get_expiration(activity.id)
+
+    assert DateTime.diff(job.scheduled_at, DateTime.add(DateTime.utc_now(), 24 * 3600)) in [0, 1]
+  end
 end