activity_expiration.ex (2104B)
1 # Pleroma: A lightweight social networking server 2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> 3 # SPDX-License-Identifier: AGPL-3.0-only 4 5 defmodule Pleroma.ActivityExpiration do 6 use Ecto.Schema 7 8 alias Pleroma.Activity 9 alias Pleroma.ActivityExpiration 10 alias Pleroma.Repo 11 12 import Ecto.Changeset 13 import Ecto.Query 14 15 @type t :: %__MODULE__{} 16 @min_activity_lifetime :timer.hours(1) 17 18 schema "activity_expirations" do 19 belongs_to(:activity, Activity, type: FlakeId.Ecto.CompatType) 20 field(:scheduled_at, :naive_datetime) 21 end 22 23 def changeset(%ActivityExpiration{} = expiration, attrs, validate_scheduled_at) do 24 expiration 25 |> cast(attrs, [:scheduled_at]) 26 |> validate_required([:scheduled_at]) 27 |> validate_scheduled_at(validate_scheduled_at) 28 end 29 30 def get_by_activity_id(activity_id) do 31 ActivityExpiration 32 |> where([exp], exp.activity_id == ^activity_id) 33 |> Repo.one() 34 end 35 36 def create(%Activity{} = activity, scheduled_at, validate_scheduled_at \\ true) do 37 %ActivityExpiration{activity_id: activity.id} 38 |> changeset(%{scheduled_at: scheduled_at}, validate_scheduled_at) 39 |> Repo.insert() 40 end 41 42 def due_expirations(offset \\ 0) do 43 naive_datetime = 44 NaiveDateTime.utc_now() 45 |> NaiveDateTime.add(offset, :millisecond) 46 47 ActivityExpiration 48 |> where([exp], exp.scheduled_at < ^naive_datetime) 49 |> limit(50) 50 |> preload(:activity) 51 |> Repo.all() 52 |> Enum.reject(fn %{activity: activity} -> 53 Activity.pinned_by_actor?(activity) 54 end) 55 end 56 57 def validate_scheduled_at(changeset, false), do: changeset 58 59 def validate_scheduled_at(changeset, true) do 60 validate_change(changeset, :scheduled_at, fn _, scheduled_at -> 61 if not expires_late_enough?(scheduled_at) do 62 [scheduled_at: "an ephemeral activity must live for at least one hour"] 63 else 64 [] 65 end 66 end) 67 end 68 69 def expires_late_enough?(scheduled_at) do 70 now = NaiveDateTime.utc_now() 71 diff = NaiveDateTime.diff(scheduled_at, now, :millisecond) 72 diff > @min_activity_lifetime 73 end 74 end