summaryrefslogtreecommitdiff
path: root/lib/pleroma/upload/filter.ex
blob: c677d4b9fcb107007ee4ae9fe9d1b00966fc69f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Upload.Filter do
  @moduledoc """
  Upload Filter behaviour

  This behaviour allows to run filtering actions just before a file is uploaded. This allows to:

  * morph in place the temporary file
  * change any field of a `Pleroma.Upload` struct
  * cancel/stop the upload
  """

  require Logger

  @callback filter(Pleroma.Upload.t()) ::
              {:ok, :filtered}
              | {:ok, :noop}
              | {:ok, :filtered, Pleroma.Upload.t()}
              | {:error, any()}

  @spec filter([module()], Pleroma.Upload.t()) :: {:ok, Pleroma.Upload.t()} | {:error, any()}

  def filter([], upload) do
    {:ok, upload}
  end

  def filter([filter | rest], upload) do
    case filter.filter(upload) do
      {:ok, :filtered} ->
        filter(rest, upload)

      {:ok, :filtered, upload} ->
        filter(rest, upload)

      {:ok, :noop} ->
        filter(rest, upload)

      error ->
        Logger.error("#{__MODULE__}: Filter #{filter} failed: #{inspect(error)}")
        error
    end
  end
end