logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma

activity_expiration_worker.ex (1546B)


      1 # Pleroma: A lightweight social networking server
      2 # Copyright © 2019 Pleroma Authors <https://pleroma.social/>
      3 # SPDX-License-Identifier: AGPL-3.0-only
      4 
      5 defmodule Pleroma.ActivityExpirationWorker do
      6   alias Pleroma.Activity
      7   alias Pleroma.ActivityExpiration
      8   alias Pleroma.Config
      9   alias Pleroma.Repo
     10   alias Pleroma.User
     11   alias Pleroma.Web.CommonAPI
     12   require Logger
     13   use GenServer
     14   import Ecto.Query
     15 
     16   @schedule_interval :timer.minutes(1)
     17 
     18   def start_link(_) do
     19     GenServer.start_link(__MODULE__, nil)
     20   end
     21 
     22   @impl true
     23   def init(_) do
     24     if Config.get([ActivityExpiration, :enabled]) do
     25       schedule_next()
     26       {:ok, nil}
     27     else
     28       :ignore
     29     end
     30   end
     31 
     32   def perform(:execute, expiration_id) do
     33     try do
     34       expiration =
     35         ActivityExpiration
     36         |> where([e], e.id == ^expiration_id)
     37         |> Repo.one!()
     38 
     39       activity = Activity.get_by_id_with_object(expiration.activity_id)
     40       user = User.get_by_ap_id(activity.object.data["actor"])
     41       CommonAPI.delete(activity.id, user)
     42     rescue
     43       error ->
     44         Logger.error("#{__MODULE__} Couldn't delete expired activity: #{inspect(error)}")
     45     end
     46   end
     47 
     48   @impl true
     49   def handle_info(:perform, state) do
     50     ActivityExpiration.due_expirations(@schedule_interval)
     51     |> Enum.each(fn expiration ->
     52       PleromaJobQueue.enqueue(:activity_expiration, __MODULE__, [:execute, expiration.id])
     53     end)
     54 
     55     schedule_next()
     56     {:noreply, state}
     57   end
     58 
     59   defp schedule_next do
     60     Process.send_after(self(), :perform, @schedule_interval)
     61   end
     62 end