Attach actor to pictures entity
This commit is contained in:
@@ -5,9 +5,11 @@ defmodule Mobilizon.Media.Picture do
|
||||
use Ecto.Schema
|
||||
import Ecto.Changeset
|
||||
alias Mobilizon.Media.File
|
||||
alias Mobilizon.Actors.Actor
|
||||
|
||||
schema "pictures" do
|
||||
embeds_one(:file, File, on_replace: :update)
|
||||
belongs_to(:actor, Actor)
|
||||
|
||||
timestamps()
|
||||
end
|
||||
@@ -15,7 +17,7 @@ defmodule Mobilizon.Media.Picture do
|
||||
@doc false
|
||||
def changeset(picture, attrs) do
|
||||
picture
|
||||
|> cast(attrs, [])
|
||||
|> cast(attrs, [:actor_id])
|
||||
|> cast_embed(:file)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -149,6 +149,18 @@ defmodule Mobilizon.Users.User do
|
||||
def is_confirmed(%User{confirmed_at: nil} = _user), do: {:error, :unconfirmed}
|
||||
def is_confirmed(%User{} = user), do: {:ok, user}
|
||||
|
||||
@doc """
|
||||
Returns whether an user owns an actor
|
||||
"""
|
||||
@spec owns_actor(struct(), String.t()) :: {:is_owned, false} | {:is_owned, true, Actor.t()}
|
||||
def owns_actor(%User{} = user, actor_id) when is_binary(actor_id) do
|
||||
case Integer.parse(actor_id) do
|
||||
{actor_id, ""} -> owns_actor(user, actor_id)
|
||||
_ -> {:is_owned, false}
|
||||
end
|
||||
end
|
||||
|
||||
@spec owns_actor(struct(), integer()) :: {:is_owned, false} | {:is_owned, true, Actor.t()}
|
||||
def owns_actor(%User{actors: actors}, actor_id) do
|
||||
case Enum.find(actors, fn a -> a.id == actor_id end) do
|
||||
nil -> {:is_owned, false}
|
||||
|
||||
@@ -4,6 +4,7 @@ defmodule MobilizonWeb.Resolvers.Picture do
|
||||
"""
|
||||
alias Mobilizon.Media
|
||||
alias Mobilizon.Media.Picture
|
||||
alias Mobilizon.Users.User
|
||||
|
||||
@doc """
|
||||
Get picture for an event's pic
|
||||
@@ -43,16 +44,21 @@ defmodule MobilizonWeb.Resolvers.Picture do
|
||||
end
|
||||
|
||||
@spec upload_picture(map(), map(), map()) :: {:ok, Picture.t()} | {:error, any()}
|
||||
def upload_picture(_parent, %{file: %Plug.Upload{} = file} = args, %{
|
||||
def upload_picture(_parent, %{file: %Plug.Upload{} = file, actor_id: actor_id} = args, %{
|
||||
context: %{
|
||||
current_user: _user
|
||||
current_user: user
|
||||
}
|
||||
}) do
|
||||
with {:ok, %{"url" => [%{"href" => url}]}} <- MobilizonWeb.Upload.store(file),
|
||||
with {:is_owned, true, _actor} <- User.owns_actor(user, actor_id),
|
||||
{:ok, %{"url" => [%{"href" => url}]}} <- MobilizonWeb.Upload.store(file),
|
||||
args <- Map.put(args, :url, url),
|
||||
{:ok, picture = %Picture{}} <- Media.create_picture(%{"file" => args}) do
|
||||
{:ok, picture = %Picture{}} <-
|
||||
Media.create_picture(%{"file" => args, "actor_id" => actor_id}) do
|
||||
{:ok, %{name: picture.file.name, url: picture.file.url, id: picture.id}}
|
||||
else
|
||||
{:is_owned, false} ->
|
||||
{:error, "Actor id is not owned by authenticated user"}
|
||||
|
||||
err ->
|
||||
{:error, err}
|
||||
end
|
||||
|
||||
@@ -31,7 +31,7 @@ defmodule MobilizonWeb.Router do
|
||||
end
|
||||
|
||||
pipeline :browser do
|
||||
plug(Plug.Static, at: "/", from: "priv/static")
|
||||
plug(Plug.Static, at: "/", from: "priv/static/js")
|
||||
plug(:accepts, ["html"])
|
||||
plug(:fetch_session)
|
||||
plug(:fetch_flash)
|
||||
|
||||
@@ -26,6 +26,7 @@ defmodule MobilizonWeb.Schema.PictureType do
|
||||
field(:name, non_null(:string))
|
||||
field(:alt, :string)
|
||||
field(:file, non_null(:upload))
|
||||
field(:actor_id, :id)
|
||||
end
|
||||
|
||||
object :picture_queries do
|
||||
@@ -42,6 +43,7 @@ defmodule MobilizonWeb.Schema.PictureType do
|
||||
arg(:name, non_null(:string))
|
||||
arg(:alt, :string)
|
||||
arg(:file, non_null(:upload))
|
||||
arg(:actor_id, non_null(:id))
|
||||
resolve(&Picture.upload_picture/3)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -176,6 +176,9 @@ defmodule Mobilizon.Service.ActivityPub.Utils do
|
||||
# Repo.one(query)
|
||||
# end
|
||||
|
||||
@doc """
|
||||
Save picture data from %Plug.Upload{} and return AS Link data.
|
||||
"""
|
||||
def make_picture_data(%Plug.Upload{} = picture) do
|
||||
with {:ok, picture} <- MobilizonWeb.Upload.store(picture) do
|
||||
picture
|
||||
@@ -184,6 +187,10 @@ defmodule Mobilizon.Service.ActivityPub.Utils do
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Convert a picture model into an AS Link representation
|
||||
"""
|
||||
# TODO: Move me to Mobilizon.Service.ActivityPub.Converters
|
||||
def make_picture_data(%Picture{file: file} = _picture) do
|
||||
%{
|
||||
"type" => "Document",
|
||||
@@ -198,6 +205,9 @@ defmodule Mobilizon.Service.ActivityPub.Utils do
|
||||
}
|
||||
end
|
||||
|
||||
@doc """
|
||||
Save picture data from raw data and return AS Link data.
|
||||
"""
|
||||
def make_picture_data(%{picture: picture}) do
|
||||
with {:ok, %{"url" => [%{"href" => url}]}} <- MobilizonWeb.Upload.store(picture.file),
|
||||
{:ok, %Picture{file: _file} = pic} <-
|
||||
@@ -205,7 +215,8 @@ defmodule Mobilizon.Service.ActivityPub.Utils do
|
||||
"file" => %{
|
||||
"url" => url,
|
||||
"name" => picture.name
|
||||
}
|
||||
},
|
||||
"actor_id" => picture.actor_id
|
||||
}) do
|
||||
make_picture_data(pic)
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user