refactor(media): use UUID instead of ID for media retrieval in GraphQL
Fixes #1760
This commit is contained in:
@@ -258,9 +258,14 @@ defmodule Mobilizon.Events.Event do
|
||||
|
||||
# In case the provided picture is an existing one
|
||||
@spec put_picture(Changeset.t(), map) :: Changeset.t()
|
||||
defp put_picture(%Changeset{} = changeset, %{picture: %{media_id: id} = _picture}) do
|
||||
%Media{} = picture = Medias.get_media!(id)
|
||||
put_assoc(changeset, :picture, picture)
|
||||
defp put_picture(%Changeset{} = changeset, %{picture: %{media_uuid: uuid} = _picture}) do
|
||||
case Medias.get_media_by_uuid(uuid) do
|
||||
%Media{} = picture ->
|
||||
put_assoc(changeset, :picture, picture)
|
||||
|
||||
nil ->
|
||||
add_error(changeset, :picture, "Media with UUID #{uuid} not found")
|
||||
end
|
||||
end
|
||||
|
||||
# In case it's a new picture
|
||||
|
||||
@@ -5,7 +5,7 @@ defmodule Mobilizon.Medias.Media do
|
||||
|
||||
use Ecto.Schema
|
||||
|
||||
import Ecto.Changeset, only: [cast: 3, cast_embed: 2]
|
||||
import Ecto.Changeset
|
||||
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Discussions.Comment
|
||||
@@ -15,14 +15,19 @@ defmodule Mobilizon.Medias.Media do
|
||||
alias Mobilizon.Posts.Post
|
||||
|
||||
@type t :: %__MODULE__{
|
||||
uuid: Ecto.UUID.t(),
|
||||
file: File.t(),
|
||||
metadata: Metadata.t(),
|
||||
actor: Actor.t()
|
||||
}
|
||||
|
||||
@attrs [:actor_id]
|
||||
@attrs [:actor_id, :uuid]
|
||||
|
||||
schema "medias" do
|
||||
# We need read_after_writes because the uuid is generated by
|
||||
# the database gen_random_uuid() function
|
||||
field(:uuid, Ecto.UUID, read_after_writes: true)
|
||||
|
||||
embeds_one(:file, File, on_replace: :update)
|
||||
|
||||
embeds_one(:metadata, Metadata, on_replace: :update)
|
||||
@@ -44,5 +49,6 @@ defmodule Mobilizon.Medias.Media do
|
||||
|> cast(attrs, @attrs)
|
||||
|> cast_embed(:file)
|
||||
|> cast_embed(:metadata)
|
||||
|> unique_constraint(:uuid)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -29,6 +29,12 @@ defmodule Mobilizon.Medias do
|
||||
@spec get_media!(integer | String.t()) :: Media.t()
|
||||
def get_media!(id), do: Repo.get!(Media, id)
|
||||
|
||||
@doc """
|
||||
Get a single media by uuid.
|
||||
"""
|
||||
@spec get_media_by_uuid(String.t()) :: Media.t() | nil
|
||||
def get_media_by_uuid(uuid), do: Repo.get_by(Media, uuid: uuid)
|
||||
|
||||
@doc """
|
||||
Get a media by its URL.
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user