Merge branch 'ensure-expiration-mix-task' into 'develop'
Add mix task to add expiration to all local statuses Closes #2020 See merge request pleroma/pleroma!2865
This commit is contained in:
commit
ad29a4f2cf
|
@ -97,4 +97,14 @@ but should only be run if necessary. **It is safe to cancel this.**
|
||||||
|
|
||||||
```sh tab="From Source"
|
```sh tab="From Source"
|
||||||
mix pleroma.database vacuum full
|
mix pleroma.database vacuum full
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Add expiration to all local statuses
|
||||||
|
|
||||||
|
```sh tab="OTP"
|
||||||
|
./bin/pleroma_ctl database ensure_expiration
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh tab="From Source"
|
||||||
|
mix pleroma.database ensure_expiration
|
||||||
|
```
|
||||||
|
|
|
@ -10,6 +10,7 @@ defmodule Mix.Tasks.Pleroma.Database do
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
require Logger
|
require Logger
|
||||||
require Pleroma.Constants
|
require Pleroma.Constants
|
||||||
|
import Ecto.Query
|
||||||
import Mix.Pleroma
|
import Mix.Pleroma
|
||||||
use Mix.Task
|
use Mix.Task
|
||||||
|
|
||||||
|
@ -53,8 +54,6 @@ def run(["update_users_following_followers_counts"]) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def run(["prune_objects" | args]) do
|
def run(["prune_objects" | args]) do
|
||||||
import Ecto.Query
|
|
||||||
|
|
||||||
{options, [], []} =
|
{options, [], []} =
|
||||||
OptionParser.parse(
|
OptionParser.parse(
|
||||||
args,
|
args,
|
||||||
|
@ -94,8 +93,6 @@ def run(["prune_objects" | args]) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def run(["fix_likes_collections"]) do
|
def run(["fix_likes_collections"]) do
|
||||||
import Ecto.Query
|
|
||||||
|
|
||||||
start_pleroma()
|
start_pleroma()
|
||||||
|
|
||||||
from(object in Object,
|
from(object in Object,
|
||||||
|
@ -130,4 +127,23 @@ def run(["vacuum", args]) do
|
||||||
|
|
||||||
Maintenance.vacuum(args)
|
Maintenance.vacuum(args)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def run(["ensure_expiration"]) do
|
||||||
|
start_pleroma()
|
||||||
|
days = Pleroma.Config.get([:mrf_activity_expiration, :days], 365)
|
||||||
|
|
||||||
|
Pleroma.Activity
|
||||||
|
|> join(:left, [a], u in assoc(a, :expiration))
|
||||||
|
|> where(local: true)
|
||||||
|
|> where([a, u], is_nil(u))
|
||||||
|
|> Pleroma.RepoStreamer.chunk_stream(100)
|
||||||
|
|> Stream.each(fn activities ->
|
||||||
|
Enum.each(activities, fn activity ->
|
||||||
|
expires_at = Timex.shift(activity.inserted_at, days: days)
|
||||||
|
|
||||||
|
Pleroma.ActivityExpiration.create(activity, expires_at, false)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|> Stream.run()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -20,11 +20,11 @@ defmodule Pleroma.ActivityExpiration do
|
||||||
field(:scheduled_at, :naive_datetime)
|
field(:scheduled_at, :naive_datetime)
|
||||||
end
|
end
|
||||||
|
|
||||||
def changeset(%ActivityExpiration{} = expiration, attrs) do
|
def changeset(%ActivityExpiration{} = expiration, attrs, validate_scheduled_at) do
|
||||||
expiration
|
expiration
|
||||||
|> cast(attrs, [:scheduled_at])
|
|> cast(attrs, [:scheduled_at])
|
||||||
|> validate_required([:scheduled_at])
|
|> validate_required([:scheduled_at])
|
||||||
|> validate_scheduled_at()
|
|> validate_scheduled_at(validate_scheduled_at)
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_by_activity_id(activity_id) do
|
def get_by_activity_id(activity_id) do
|
||||||
|
@ -33,9 +33,9 @@ def get_by_activity_id(activity_id) do
|
||||||
|> Repo.one()
|
|> Repo.one()
|
||||||
end
|
end
|
||||||
|
|
||||||
def create(%Activity{} = activity, scheduled_at) do
|
def create(%Activity{} = activity, scheduled_at, validate_scheduled_at \\ true) do
|
||||||
%ActivityExpiration{activity_id: activity.id}
|
%ActivityExpiration{activity_id: activity.id}
|
||||||
|> changeset(%{scheduled_at: scheduled_at})
|
|> changeset(%{scheduled_at: scheduled_at}, validate_scheduled_at)
|
||||||
|> Repo.insert()
|
|> Repo.insert()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -49,7 +49,9 @@ def due_expirations(offset \\ 0) do
|
||||||
|> Repo.all()
|
|> Repo.all()
|
||||||
end
|
end
|
||||||
|
|
||||||
def validate_scheduled_at(changeset) do
|
def validate_scheduled_at(changeset, false), do: changeset
|
||||||
|
|
||||||
|
def validate_scheduled_at(changeset, true) do
|
||||||
validate_change(changeset, :scheduled_at, fn _, scheduled_at ->
|
validate_change(changeset, :scheduled_at, fn _, scheduled_at ->
|
||||||
if not expires_late_enough?(scheduled_at) do
|
if not expires_late_enough?(scheduled_at) do
|
||||||
[scheduled_at: "an ephemeral activity must live for at least one hour"]
|
[scheduled_at: "an ephemeral activity must live for at least one hour"]
|
||||||
|
|
|
@ -127,4 +127,43 @@ test "it turns OrderedCollection likes into empty arrays" do
|
||||||
assert Enum.empty?(Object.get_by_id(object2.id).data["likes"])
|
assert Enum.empty?(Object.get_by_id(object2.id).data["likes"])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "ensure_expiration" do
|
||||||
|
test "it adds to expiration old statuses" do
|
||||||
|
%{id: activity_id1} = insert(:note_activity)
|
||||||
|
|
||||||
|
%{id: activity_id2} =
|
||||||
|
insert(:note_activity, %{inserted_at: NaiveDateTime.from_iso8601!("2015-01-23 23:50:07")})
|
||||||
|
|
||||||
|
%{id: activity_id3} = activity3 = insert(:note_activity)
|
||||||
|
|
||||||
|
expires_at =
|
||||||
|
NaiveDateTime.utc_now()
|
||||||
|
|> NaiveDateTime.add(60 * 61, :second)
|
||||||
|
|> NaiveDateTime.truncate(:second)
|
||||||
|
|
||||||
|
Pleroma.ActivityExpiration.create(activity3, expires_at)
|
||||||
|
|
||||||
|
Mix.Tasks.Pleroma.Database.run(["ensure_expiration"])
|
||||||
|
|
||||||
|
expirations =
|
||||||
|
Pleroma.ActivityExpiration
|
||||||
|
|> order_by(:activity_id)
|
||||||
|
|> Repo.all()
|
||||||
|
|
||||||
|
assert [
|
||||||
|
%Pleroma.ActivityExpiration{
|
||||||
|
activity_id: ^activity_id1
|
||||||
|
},
|
||||||
|
%Pleroma.ActivityExpiration{
|
||||||
|
activity_id: ^activity_id2,
|
||||||
|
scheduled_at: ~N[2016-01-23 23:50:07]
|
||||||
|
},
|
||||||
|
%Pleroma.ActivityExpiration{
|
||||||
|
activity_id: ^activity_id3,
|
||||||
|
scheduled_at: ^expires_at
|
||||||
|
}
|
||||||
|
] = expirations
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue