First
[anni] / lib / pleroma / workers / purge_expired_filter.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 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 true
28   def perform(%Job{args: %{"filter_id" => id}}) do
29     Pleroma.Filter
30     |> Repo.get(id)
31     |> Repo.delete()
32   end
33
34   @impl Oban.Worker
35   def timeout(_job), do: :timer.seconds(5)
36
37   @spec get_expiration(pos_integer()) :: Job.t() | nil
38   def get_expiration(id) do
39     from(j in Job,
40       where: j.state == "scheduled",
41       where: j.queue == "filter_expiration",
42       where: fragment("?->'filter_id' = ?", j.args, ^id)
43     )
44     |> Repo.one()
45   end
46 end