pin/unpin for activities with expires_at option

This commit is contained in:
Alexander Strizhakov 2020-09-04 11:40:32 +03:00 committed by rinpatch
commit eb5ff715f7
5 changed files with 64 additions and 46 deletions

View file

@ -343,9 +343,4 @@ 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

View file

@ -2315,6 +2315,11 @@ defmodule Pleroma.User do
max_pinned_statuses = Config.get([:instance, :max_pinned_statuses], 0)
params = %{pinned_activities: user.pinned_activities ++ [id]}
# if pinned activity was scheduled for deletion, we remove job
if expiration = Pleroma.Workers.PurgeExpiredActivity.get_expiration(id) do
Oban.cancel_job(expiration.id)
end
user
|> cast(params, [:pinned_activities])
|> validate_length(:pinned_activities,
@ -2327,9 +2332,19 @@ defmodule Pleroma.User do
|> update_and_set_cache()
end
def remove_pinnned_activity(user, %Pleroma.Activity{id: id}) do
def remove_pinnned_activity(user, %Pleroma.Activity{id: id, data: data}) do
params = %{pinned_activities: List.delete(user.pinned_activities, id)}
# if pinned activity was scheduled for deletion, we reschedule it for deletion
if data["expires_at"] do
{:ok, expires_at, _} = DateTime.from_iso8601(data["expires_at"])
Pleroma.Workers.PurgeExpiredActivity.enqueue(%{
activity_id: id,
expires_at: expires_at
})
end
user
|> cast(params, [:pinned_activities])
|> update_and_set_cache()

View file

@ -31,18 +31,8 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do
@impl true
def perform(%Oban.Job{args: %{"activity_id" => id}}) do
with %Activity{} = activity <- find_activity(id),
%Pleroma.User{} = user <- find_user(activity.object.data["actor"]),
false <- pinned_by_actor?(activity, user) do
%Pleroma.User{} = user <- find_user(activity.object.data["actor"]) 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
@ -74,12 +64,6 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do
end
end
defp pinned_by_actor?(activity, user) do
with true <- 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",