Refactor User.post_register_action/1 emails
[akkoma] / lib / pleroma / plugs / rate_limiter / limiter_supervisor.ex
1 defmodule Pleroma.Plugs.RateLimiter.LimiterSupervisor do
2 use DynamicSupervisor
3
4 import Cachex.Spec
5
6 def start_link(init_arg) do
7 DynamicSupervisor.start_link(__MODULE__, init_arg, name: __MODULE__)
8 end
9
10 def add_or_return_limiter(limiter_name, expiration) do
11 result =
12 DynamicSupervisor.start_child(
13 __MODULE__,
14 %{
15 id: String.to_atom("rl_#{limiter_name}"),
16 start:
17 {Cachex, :start_link,
18 [
19 limiter_name,
20 [
21 expiration:
22 expiration(
23 default: expiration,
24 interval: check_interval(expiration),
25 lazy: true
26 )
27 ]
28 ]}
29 }
30 )
31
32 case result do
33 {:ok, _pid} = result -> result
34 {:error, {:already_started, pid}} -> {:ok, pid}
35 _ -> result
36 end
37 end
38
39 @impl true
40 def init(_init_arg) do
41 DynamicSupervisor.init(strategy: :one_for_one)
42 end
43
44 defp check_interval(exp) do
45 (exp / 2)
46 |> Kernel.trunc()
47 |> Kernel.min(5000)
48 |> Kernel.max(1)
49 end
50 end