forked from mirrors/akkoma
36012ef6c1
If we didn't put some kind of lifetime requirement on these, I guess you could annoy people by sending large numbers of ephemeral posts that provoke notifications but then disappear before anyone can read them.
69 lines
1.8 KiB
Elixir
69 lines
1.8 KiB
Elixir
# Pleroma: A lightweight social networking server
|
|
# Copyright © 2019 Pleroma Authors <https://pleroma.social/>
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
defmodule Pleroma.ActivityExpiration do
|
|
use Ecto.Schema
|
|
|
|
alias Pleroma.Activity
|
|
alias Pleroma.ActivityExpiration
|
|
alias Pleroma.FlakeId
|
|
alias Pleroma.Repo
|
|
|
|
import Ecto.Changeset
|
|
import Ecto.Query
|
|
|
|
@type t :: %__MODULE__{}
|
|
@min_activity_lifetime :timer.hours(1)
|
|
|
|
schema "activity_expirations" do
|
|
belongs_to(:activity, Activity, type: FlakeId)
|
|
field(:scheduled_at, :naive_datetime)
|
|
end
|
|
|
|
def changeset(%ActivityExpiration{} = expiration, attrs) do
|
|
expiration
|
|
|> cast(attrs, [:scheduled_at])
|
|
|> validate_required([:scheduled_at])
|
|
|> validate_scheduled_at()
|
|
end
|
|
|
|
def get_by_activity_id(activity_id) do
|
|
ActivityExpiration
|
|
|> where([exp], exp.activity_id == ^activity_id)
|
|
|> Repo.one()
|
|
end
|
|
|
|
def create(%Activity{} = activity, scheduled_at) do
|
|
%ActivityExpiration{activity_id: activity.id}
|
|
|> changeset(%{scheduled_at: scheduled_at})
|
|
|> Repo.insert()
|
|
end
|
|
|
|
def due_expirations(offset \\ 0) do
|
|
naive_datetime =
|
|
NaiveDateTime.utc_now()
|
|
|> NaiveDateTime.add(offset, :millisecond)
|
|
|
|
ActivityExpiration
|
|
|> where([exp], exp.scheduled_at < ^naive_datetime)
|
|
|> Repo.all()
|
|
end
|
|
|
|
def validate_scheduled_at(changeset) 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"]
|
|
else
|
|
[]
|
|
end
|
|
end)
|
|
end
|
|
|
|
def expires_late_enough?(scheduled_at) do
|
|
now = NaiveDateTime.utc_now()
|
|
diff = NaiveDateTime.diff(scheduled_at, now, :millisecond)
|
|
diff >= @min_activity_lifetime
|
|
end
|
|
end
|