aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/media.ex
blob: d24807a9fbd3806ef7a0ea672cd207935b65e299 (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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
defmodule Pleroma.Media do
  use Ecto.Schema

  import Ecto.Changeset

  alias Pleroma.Media
  alias Pleroma.Repo
  alias Pleroma.User

  @derive {Jason.Encoder,
           only: [:href, :type, :media_type, :name, :blurhash, :meta, :object_id, :actor]}

  @type t() :: %__MODULE__{}

  schema "media" do
    field(:href, :string)
    field(:type, :string)
    field(:media_type, :string)
    field(:name, :string)
    field(:blurhash, :string)
    field(:meta, :map)
    field(:actor, :string)

    field(:removable, :boolean, virtual: true, default: false)

    belongs_to(:object, Pleroma.Object)

    timestamps()
  end

  def create_from_object_data(%{"url" => [url]} = data, %{actor: actor} = opts) do
    object_id = get_in(opts, [:object, "id"]) || Map.get(opts, :object_id)

    %Media{}
    |> changeset(%{
      href: url["href"],
      type: data["type"],
      media_type: url["mediaType"],
      name: data["name"],
      blurhash: nil,
      meta: %{},
      actor: actor,
      object_id: object_id
    })
    |> Repo.insert()
  end

  def get_by_id(nil), do: nil
  def get_by_id(id), do: Repo.get(Media, id)

  @spec authorize_access(Media.t(), User.t()) :: :ok | {:error, :forbidden}
  def authorize_access(%Media{actor: ap_id}, %User{ap_id: ap_id}), do: :ok

  def authorize_access(_media, %User{is_admin: is_admin?, is_moderator: is_moderator?})
      when true in [is_admin?, is_moderator?],
      do: :ok

  def authorize_access(_media, _user), do: {:error, :forbidden}

  def update(%Media{} = media, attrs \\ %{}) do
    media
    |> changeset(attrs)
    |> Repo.update()
  end

  def insert(%Media{} = media) do
    media
    |> changeset()
    |> Repo.insert()
  end

  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:href, :type, :media_type, :name, :blurhash, :meta, :actor, :object_id])
    |> validate_required([:href, :type, :media_type])
  end

  def to_object_form(%Media{} = media) do
    %{
      "id" => media.id,
      "url" => [
        %{
          "href" => media.href,
          "type" => media.type,
          "mediaType" => media.media_type
        }
      ],
      "name" => media.name,
      "type" => "Document",
      "blurhash" => media.blurhash,
      "mediaType" => media.media_type,
      "actor" => media.actor
    }
  end
end