2020-01-26 20:34:25 +01:00
|
|
|
defmodule Mobilizon.GraphQL.Resolvers.Picture do
|
2019-05-22 14:12:11 +02:00
|
|
|
@moduledoc """
|
|
|
|
Handles the picture-related GraphQL calls
|
|
|
|
"""
|
2020-01-26 21:11:16 +01:00
|
|
|
|
2019-09-07 19:54:11 +02:00
|
|
|
alias Mobilizon.Actors.Actor
|
2019-05-22 14:12:11 +02:00
|
|
|
alias Mobilizon.Media
|
|
|
|
alias Mobilizon.Media.Picture
|
2019-05-31 17:58:03 +02:00
|
|
|
alias Mobilizon.Users.User
|
2020-09-29 09:53:48 +02:00
|
|
|
import Mobilizon.Web.Gettext
|
2019-05-22 14:12:11 +02:00
|
|
|
|
|
|
|
@doc """
|
|
|
|
Get picture for an event's pic
|
|
|
|
"""
|
|
|
|
def picture(%{picture_id: picture_id} = _parent, _args, _resolution) do
|
2019-09-07 19:54:11 +02:00
|
|
|
with {:ok, picture} <- do_fetch_picture(picture_id), do: {:ok, picture}
|
2019-05-22 14:12:11 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
@doc """
|
|
|
|
Get picture for an event that has an attached
|
|
|
|
|
2020-01-26 21:36:50 +01:00
|
|
|
See Mobilizon.Web.Resolvers.Event.create_event/3
|
2019-05-22 14:12:11 +02:00
|
|
|
"""
|
2019-09-07 19:54:11 +02:00
|
|
|
def picture(%{picture: picture} = _parent, _args, _resolution), do: {:ok, picture}
|
2019-05-22 14:12:11 +02:00
|
|
|
def picture(_parent, %{id: picture_id}, _resolution), do: do_fetch_picture(picture_id)
|
2019-09-07 19:54:11 +02:00
|
|
|
def picture(_parent, _args, _resolution), do: {:ok, nil}
|
2019-05-22 14:12:11 +02:00
|
|
|
|
|
|
|
@spec do_fetch_picture(nil) :: {:error, nil}
|
|
|
|
defp do_fetch_picture(nil), do: {:error, nil}
|
|
|
|
|
|
|
|
@spec do_fetch_picture(String.t()) :: {:ok, Picture.t()} | {:error, :not_found}
|
|
|
|
defp do_fetch_picture(picture_id) do
|
2019-07-23 18:06:22 +02:00
|
|
|
case Media.get_picture(picture_id) do
|
2019-09-07 19:54:11 +02:00
|
|
|
%Picture{id: id, file: file} ->
|
2019-07-23 18:06:22 +02:00
|
|
|
{:ok,
|
|
|
|
%{
|
|
|
|
name: file.name,
|
|
|
|
url: file.url,
|
|
|
|
id: id,
|
|
|
|
content_type: file.content_type,
|
|
|
|
size: file.size
|
|
|
|
}}
|
|
|
|
|
2019-09-07 19:54:11 +02:00
|
|
|
_error ->
|
2020-09-29 09:53:48 +02:00
|
|
|
{:error, dgettext("errors", "Picture with ID %{id} was not found", id: picture_id)}
|
2019-05-22 14:12:11 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-01-26 20:34:25 +01:00
|
|
|
@spec upload_picture(map, map, map) :: {:ok, Picture.t()} | {:error, any}
|
2019-09-07 19:54:11 +02:00
|
|
|
def upload_picture(
|
|
|
|
_parent,
|
|
|
|
%{file: %Plug.Upload{} = file, actor_id: actor_id} = args,
|
|
|
|
%{context: %{current_user: user}}
|
|
|
|
) do
|
|
|
|
with {:is_owned, %Actor{}} <- User.owns_actor(user, actor_id),
|
2019-10-25 17:43:37 +02:00
|
|
|
{:ok, %{name: _name, url: url, content_type: content_type, size: size}} <-
|
2020-01-26 21:36:50 +01:00
|
|
|
Mobilizon.Web.Upload.store(file),
|
2019-06-03 17:13:47 +02:00
|
|
|
args <-
|
|
|
|
args
|
|
|
|
|> Map.put(:url, url)
|
|
|
|
|> Map.put(:size, size)
|
|
|
|
|> Map.put(:content_type, content_type),
|
2019-05-31 17:58:03 +02:00
|
|
|
{:ok, picture = %Picture{}} <-
|
|
|
|
Media.create_picture(%{"file" => args, "actor_id" => actor_id}) do
|
2019-06-03 17:13:47 +02:00
|
|
|
{:ok,
|
|
|
|
%{
|
|
|
|
name: picture.file.name,
|
|
|
|
url: picture.file.url,
|
|
|
|
id: picture.id,
|
|
|
|
content_type: picture.file.content_type,
|
|
|
|
size: picture.file.size
|
|
|
|
}}
|
2019-05-22 14:12:11 +02:00
|
|
|
else
|
2019-09-07 19:54:11 +02:00
|
|
|
{:is_owned, nil} ->
|
2020-09-29 09:53:48 +02:00
|
|
|
{:error, dgettext("errors", "Profile is not owned by authenticated user")}
|
2019-05-31 17:58:03 +02:00
|
|
|
|
2020-10-09 19:29:12 +02:00
|
|
|
{:error, :mime_type_not_allowed} ->
|
|
|
|
{:error, dgettext("errors", "File doesn't have an allowed MIME type.")}
|
|
|
|
|
2019-09-07 19:54:11 +02:00
|
|
|
error ->
|
|
|
|
{:error, error}
|
2019-05-22 14:12:11 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def upload_picture(_parent, _args, _resolution) do
|
2020-09-29 09:53:48 +02:00
|
|
|
{:error, dgettext("errors", "You need to login to upload a picture")}
|
2019-05-22 14:12:11 +02:00
|
|
|
end
|
|
|
|
end
|