Bladeren bron

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
note-update
lain 3 jaren geleden
bovenliggende
commit
ad29a4f2cf
4 gewijzigde bestanden met toevoegingen van 77 en 10 verwijderingen
  1. +11
    -1
      docs/administration/CLI_tasks/database.md
  2. +20
    -4
      lib/mix/tasks/pleroma/database.ex
  3. +7
    -5
      lib/pleroma/activity_expiration.ex
  4. +39
    -0
      test/tasks/database_test.exs

+ 11
- 1
docs/administration/CLI_tasks/database.md Bestand weergeven

@@ -97,4 +97,14 @@ but should only be run if necessary. **It is safe to cancel this.**

```sh tab="From Source"
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
```

+ 20
- 4
lib/mix/tasks/pleroma/database.ex Bestand weergeven

@@ -10,6 +10,7 @@ defmodule Mix.Tasks.Pleroma.Database do
alias Pleroma.User
require Logger
require Pleroma.Constants
import Ecto.Query
import Mix.Pleroma
use Mix.Task

@@ -53,8 +54,6 @@ defmodule Mix.Tasks.Pleroma.Database do
end

def run(["prune_objects" | args]) do
import Ecto.Query

{options, [], []} =
OptionParser.parse(
args,
@@ -94,8 +93,6 @@ defmodule Mix.Tasks.Pleroma.Database do
end

def run(["fix_likes_collections"]) do
import Ecto.Query

start_pleroma()

from(object in Object,
@@ -130,4 +127,23 @@ defmodule Mix.Tasks.Pleroma.Database do

Maintenance.vacuum(args)
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

+ 7
- 5
lib/pleroma/activity_expiration.ex Bestand weergeven

@@ -20,11 +20,11 @@ defmodule Pleroma.ActivityExpiration do
field(:scheduled_at, :naive_datetime)
end

def changeset(%ActivityExpiration{} = expiration, attrs) do
def changeset(%ActivityExpiration{} = expiration, attrs, validate_scheduled_at) do
expiration
|> cast(attrs, [:scheduled_at])
|> validate_required([:scheduled_at])
|> validate_scheduled_at()
|> validate_scheduled_at(validate_scheduled_at)
end

def get_by_activity_id(activity_id) do
@@ -33,9 +33,9 @@ defmodule Pleroma.ActivityExpiration do
|> Repo.one()
end

def create(%Activity{} = activity, scheduled_at) do
def create(%Activity{} = activity, scheduled_at, validate_scheduled_at \\ true) do
%ActivityExpiration{activity_id: activity.id}
|> changeset(%{scheduled_at: scheduled_at})
|> changeset(%{scheduled_at: scheduled_at}, validate_scheduled_at)
|> Repo.insert()
end

@@ -49,7 +49,9 @@ defmodule Pleroma.ActivityExpiration do
|> Repo.all()
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 ->
if not expires_late_enough?(scheduled_at) do
[scheduled_at: "an ephemeral activity must live for at least one hour"]


+ 39
- 0
test/tasks/database_test.exs Bestand weergeven

@@ -127,4 +127,43 @@ defmodule Mix.Tasks.Pleroma.DatabaseTest do
assert Enum.empty?(Object.get_by_id(object2.id).data["likes"])
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

Laden…
Annuleren
Opslaan