summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Strizhakov <alex.strizhakov@gmail.com>2020-08-24 13:43:02 +0300
committerrinpatch <rinpatch@sdf.org>2020-09-10 21:50:41 +0300
commitde4c935071a47c78d873484b202e09dce5399570 (patch)
tree0c2fde482c9f08773ad5593173e0da61f1e6c856
parent9bf1065a06837b4c753549d89afe23a636a20972 (diff)
don't expire pinned posts
-rw-r--r--lib/pleroma/activity.ex9
-rw-r--r--lib/pleroma/workers/purge_expired_activity.ex18
-rw-r--r--test/workers/purge_expired_activity_test.exs21
3 files changed, 45 insertions, 3 deletions
diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex
index 03cd3b8c0..84aba9572 100644
--- a/lib/pleroma/activity.ex
+++ b/lib/pleroma/activity.ex
@@ -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
diff --git a/lib/pleroma/workers/purge_expired_activity.ex b/lib/pleroma/workers/purge_expired_activity.ex
index 016b000c1..ba0053008 100644
--- a/lib/pleroma/workers/purge_expired_activity.ex
+++ b/lib/pleroma/workers/purge_expired_activity.ex
@@ -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",
diff --git a/test/workers/purge_expired_activity_test.exs b/test/workers/purge_expired_activity_test.exs
index 8b5dc9fd2..736d7d567 100644
--- a/test/workers/purge_expired_activity_test.exs
+++ b/test/workers/purge_expired_activity_test.exs
@@ -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