dd6a22a689340f21b10cf809e5990d481ca36050
[akkoma] / lib / pleroma / workers / purge_expired_filter.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Workers.PurgeExpiredFilter do
6 @moduledoc """
7 Worker which purges expired filters
8 """
9
10 use Oban.Worker, queue: :filter_expiration, max_attempts: 1, unique: [period: :infinity]
11
12 import Ecto.Query
13
14 alias Oban.Job
15 alias Pleroma.Repo
16
17 @spec enqueue(%{filter_id: integer(), expires_at: DateTime.t()}) ::
18 {:ok, Job.t()} | {:error, Ecto.Changeset.t()}
19 def enqueue(args) do
20 {scheduled_at, args} = Map.pop(args, :expires_at)
21
22 args
23 |> new(scheduled_at: scheduled_at)
24 |> Oban.insert()
25 end
26
27 @impl Oban.Worker
28 def timeout(_job) do
29 Pleroma.Config.get([:workers, :timeout, :filter_expiration]) || :timer.minutes(1)
30 end
31
32 @impl true
33 def perform(%Job{args: %{"filter_id" => id}}) do
34 Pleroma.Filter
35 |> Repo.get(id)
36 |> Repo.delete()
37 end
38
39 @spec get_expiration(pos_integer()) :: Job.t() | nil
40 def get_expiration(id) do
41 from(j in Job,
42 where: j.state == "scheduled",
43 where: j.queue == "filter_expiration",
44 where: fragment("?->'filter_id' = ?", j.args, ^id)
45 )
46 |> Repo.one()
47 end
48 end