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
|