Improve GraphQL documentation and cleanup API
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -3,11 +3,10 @@ defmodule Mobilizon.GraphQL.Resolvers.Comment do
|
||||
Handles the comment-related GraphQL calls.
|
||||
"""
|
||||
|
||||
alias Mobilizon.{Actors, Admin, Discussions, Events}
|
||||
alias Mobilizon.{Actors, Admin, Discussions, Events, Users}
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Discussions.Comment, as: CommentModel
|
||||
alias Mobilizon.Events.{Event, EventOptions}
|
||||
alias Mobilizon.Users
|
||||
alias Mobilizon.Users.User
|
||||
import Mobilizon.Web.Gettext
|
||||
|
||||
@@ -21,14 +20,14 @@ defmodule Mobilizon.GraphQL.Resolvers.Comment do
|
||||
|
||||
def create_comment(
|
||||
_parent,
|
||||
%{actor_id: actor_id, event_id: event_id} = args,
|
||||
%{event_id: event_id} = args,
|
||||
%{
|
||||
context: %{
|
||||
current_user: %User{} = user
|
||||
}
|
||||
}
|
||||
) do
|
||||
with {:is_owned, %Actor{} = _organizer_actor} <- User.owns_actor(user, actor_id),
|
||||
with %Actor{id: actor_id} <- Users.get_actor_for_user(user),
|
||||
{:find_event,
|
||||
{:ok,
|
||||
%Event{
|
||||
@@ -36,18 +35,15 @@ defmodule Mobilizon.GraphQL.Resolvers.Comment do
|
||||
organizer_actor_id: organizer_actor_id
|
||||
}}} <-
|
||||
{:find_event, Events.get_event(event_id)},
|
||||
{actor_id, ""} <- Integer.parse(actor_id),
|
||||
{:allowed, true} <-
|
||||
{:allowed, comment_moderation != :closed || actor_id == organizer_actor_id},
|
||||
args <- Map.put(args, :actor_id, actor_id),
|
||||
{:ok, _, %CommentModel{} = comment} <-
|
||||
Comments.create_comment(args) do
|
||||
{:ok, comment}
|
||||
else
|
||||
{:allowed, false} ->
|
||||
{:error, :unauthorized}
|
||||
|
||||
{:is_owned, nil} ->
|
||||
{:error, dgettext("errors", "Profile is not owned by authenticated user")}
|
||||
end
|
||||
end
|
||||
|
||||
@@ -107,9 +103,6 @@ defmodule Mobilizon.GraphQL.Resolvers.Comment do
|
||||
else
|
||||
%CommentModel{deleted_at: deleted_at} when not is_nil(deleted_at) ->
|
||||
{:error, dgettext("errors", "Comment is already deleted")}
|
||||
|
||||
{:is_owned, nil} ->
|
||||
{:error, dgettext("errors", "Profile is not owned by authenticated user")}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -62,6 +62,15 @@ defmodule Mobilizon.GraphQL.Resolvers.Discussion do
|
||||
end
|
||||
end
|
||||
|
||||
def get_discussion(_parent, _args, %{
|
||||
context: %{
|
||||
current_user: %User{} = _user
|
||||
}
|
||||
}),
|
||||
do:
|
||||
{:error,
|
||||
dgettext("errors", "You must provide either an ID or a slug to access a discussion")}
|
||||
|
||||
def get_discussion(_parent, _args, _resolution),
|
||||
do: {:error, dgettext("errors", "You need to be logged-in to access discussions")}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Event do
|
||||
Handles the event-related GraphQL calls.
|
||||
"""
|
||||
|
||||
alias Mobilizon.{Actors, Admin, Events}
|
||||
alias Mobilizon.{Actors, Admin, Events, Users}
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Config
|
||||
alias Mobilizon.Events.{Event, EventParticipantStats}
|
||||
@@ -74,10 +74,10 @@ defmodule Mobilizon.GraphQL.Resolvers.Event do
|
||||
"""
|
||||
def list_participants_for_event(
|
||||
%Event{id: event_id},
|
||||
%{page: page, limit: limit, roles: roles, actor_id: actor_id},
|
||||
%{page: page, limit: limit, roles: roles},
|
||||
%{context: %{current_user: %User{} = user}} = _resolution
|
||||
) do
|
||||
with {:is_owned, %Actor{} = _actor} <- User.owns_actor(user, actor_id),
|
||||
with %Actor{id: actor_id} <- Users.get_actor_for_user(user),
|
||||
# Check that moderator has right
|
||||
{:actor_approve_permission, true} <-
|
||||
{:actor_approve_permission, Events.moderator_for_event?(event_id, actor_id)} do
|
||||
@@ -96,9 +96,6 @@ defmodule Mobilizon.GraphQL.Resolvers.Event do
|
||||
participants = Events.list_participants_for_event(event_id, roles, page, limit)
|
||||
{:ok, participants}
|
||||
else
|
||||
{:is_owned, nil} ->
|
||||
{:error, dgettext("errors", "Moderator profile is not owned by authenticated user")}
|
||||
|
||||
{:actor_approve_permission, _} ->
|
||||
{:error,
|
||||
dgettext("errors", "Provided moderator profile doesn't have permission on this event")}
|
||||
@@ -191,8 +188,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Event do
|
||||
%{context: %{current_user: user}} = _resolution
|
||||
) do
|
||||
# See https://github.com/absinthe-graphql/absinthe/issues/490
|
||||
with args <- Map.put(args, :options, args[:options] || %{}),
|
||||
{:is_owned, %Actor{} = organizer_actor} <- User.owns_actor(user, organizer_actor_id),
|
||||
with {:is_owned, %Actor{} = organizer_actor} <- User.owns_actor(user, organizer_actor_id),
|
||||
args <- Map.put(args, :options, args[:options] || %{}),
|
||||
args_with_organizer <- Map.put(args, :organizer_actor, organizer_actor),
|
||||
{:ok, %Activity{data: %{"object" => %{"type" => "Event"}}}, %Event{} = event} <-
|
||||
API.Events.create_event(args_with_organizer) do
|
||||
@@ -257,12 +254,11 @@ defmodule Mobilizon.GraphQL.Resolvers.Event do
|
||||
"""
|
||||
def delete_event(
|
||||
_parent,
|
||||
%{event_id: event_id, actor_id: actor_id},
|
||||
%{event_id: event_id},
|
||||
%{context: %{current_user: %User{role: role} = user}}
|
||||
) do
|
||||
with {:ok, %Event{local: is_local} = event} <- Events.get_event_with_preload(event_id),
|
||||
{actor_id, ""} <- Integer.parse(actor_id),
|
||||
{:is_owned, %Actor{} = actor} <- User.owns_actor(user, actor_id) do
|
||||
%Actor{id: actor_id} = actor <- Users.get_actor_for_user(user) do
|
||||
cond do
|
||||
{:event_can_be_managed, true} == Event.can_be_managed_by(event, actor_id) ->
|
||||
do_delete_event(event, actor)
|
||||
@@ -281,9 +277,6 @@ defmodule Mobilizon.GraphQL.Resolvers.Event do
|
||||
else
|
||||
{:error, :event_not_found} ->
|
||||
{:error, dgettext("errors", "Event not found")}
|
||||
|
||||
{:is_owned, nil} ->
|
||||
{:error, dgettext("errors", "Profile is not owned by authenticated user")}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -121,10 +121,10 @@ defmodule Mobilizon.GraphQL.Resolvers.Group do
|
||||
}
|
||||
}
|
||||
) do
|
||||
with creator_actor_id <- Map.get(args, :creator_actor_id),
|
||||
{:is_owned, %Actor{} = creator_actor} <- User.owns_actor(user, creator_actor_id),
|
||||
with %Actor{id: creator_actor_id} = creator_actor <- Users.get_actor_for_user(user),
|
||||
args <- Map.update(args, :preferred_username, "", &String.downcase/1),
|
||||
args <- Map.put(args, :creator_actor, creator_actor),
|
||||
args <- Map.put(args, :creator_actor_id, creator_actor_id),
|
||||
args <- save_attached_pictures(args),
|
||||
{:ok, _activity, %Actor{type: :Group} = group} <-
|
||||
API.Groups.create_group(args) do
|
||||
@@ -132,9 +132,6 @@ defmodule Mobilizon.GraphQL.Resolvers.Group do
|
||||
else
|
||||
{:error, err} when is_binary(err) ->
|
||||
{:error, err}
|
||||
|
||||
{:is_owned, nil} ->
|
||||
{:error, dgettext("errors", "Creator profile is not owned by the current user")}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -76,9 +76,6 @@ defmodule Mobilizon.GraphQL.Resolvers.Member do
|
||||
{:ok, _activity, %Member{} = member} <- ActivityPub.invite(group, actor, target_actor) do
|
||||
{:ok, member}
|
||||
else
|
||||
{:is_owned, nil} ->
|
||||
{:error, dgettext("errors", "Profile is not owned by authenticated user")}
|
||||
|
||||
{:error, :group_not_found} ->
|
||||
{:error, dgettext("errors", "Group not found")}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Participant do
|
||||
@moduledoc """
|
||||
Handles the participation-related GraphQL calls.
|
||||
"""
|
||||
alias Mobilizon.{Actors, Config, Crypto, Events}
|
||||
alias Mobilizon.{Actors, Config, Crypto, Events, Users}
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Events.{Event, Participant}
|
||||
alias Mobilizon.GraphQL.API.Participations
|
||||
@@ -206,7 +206,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Participant do
|
||||
|
||||
def update_participation(
|
||||
_parent,
|
||||
%{id: participation_id, moderator_actor_id: moderator_actor_id, role: new_role},
|
||||
%{id: participation_id, role: new_role},
|
||||
%{
|
||||
context: %{
|
||||
current_user: user
|
||||
@@ -214,7 +214,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Participant do
|
||||
}
|
||||
) do
|
||||
# Check that moderator provided is rightly authenticated
|
||||
with {:is_owned, moderator_actor} <- User.owns_actor(user, moderator_actor_id),
|
||||
with %Actor{id: moderator_actor_id} = moderator_actor <- Users.get_actor_for_user(user),
|
||||
# Check that participation already exists
|
||||
{:has_participation, %Participant{role: old_role} = participation} <-
|
||||
{:has_participation, Events.get_participant(participation_id)},
|
||||
@@ -227,9 +227,6 @@ defmodule Mobilizon.GraphQL.Resolvers.Participant do
|
||||
Participations.update(participation, moderator_actor, new_role) do
|
||||
{:ok, participation}
|
||||
else
|
||||
{:is_owned, nil} ->
|
||||
{:error, dgettext("errors", "Moderator profile is not owned by authenticated user")}
|
||||
|
||||
{:has_participation, nil} ->
|
||||
{:error, dgettext("errors", "Participant not found")}
|
||||
|
||||
|
||||
@@ -5,12 +5,10 @@ defmodule Mobilizon.GraphQL.Resolvers.Person do
|
||||
|
||||
import Mobilizon.Users.Guards
|
||||
|
||||
alias Mobilizon.Actors
|
||||
alias Mobilizon.{Actors, Events, Users}
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Events
|
||||
alias Mobilizon.Events.Participant
|
||||
alias Mobilizon.Storage.Page
|
||||
alias Mobilizon.Users
|
||||
alias Mobilizon.Users.User
|
||||
import Mobilizon.Web.Gettext
|
||||
|
||||
|
||||
@@ -4,9 +4,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Picture do
|
||||
"""
|
||||
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Media
|
||||
alias Mobilizon.{Media, Users}
|
||||
alias Mobilizon.Media.Picture
|
||||
alias Mobilizon.Users.User
|
||||
import Mobilizon.Web.Gettext
|
||||
|
||||
@doc """
|
||||
@@ -46,10 +45,10 @@ defmodule Mobilizon.GraphQL.Resolvers.Picture do
|
||||
@spec upload_picture(map, map, map) :: {:ok, Picture.t()} | {:error, any}
|
||||
def upload_picture(
|
||||
_parent,
|
||||
%{file: %Plug.Upload{} = file, actor_id: actor_id} = args,
|
||||
%{file: %Plug.Upload{} = file} = args,
|
||||
%{context: %{current_user: user}}
|
||||
) do
|
||||
with {:is_owned, %Actor{}} <- User.owns_actor(user, actor_id),
|
||||
with %Actor{id: actor_id} <- Users.get_actor_for_user(user),
|
||||
{:ok, %{name: _name, url: url, content_type: content_type, size: size}} <-
|
||||
Mobilizon.Web.Upload.store(file),
|
||||
args <-
|
||||
@@ -68,9 +67,6 @@ defmodule Mobilizon.GraphQL.Resolvers.Picture do
|
||||
size: picture.file.size
|
||||
}}
|
||||
else
|
||||
{:is_owned, nil} ->
|
||||
{:error, dgettext("errors", "Profile is not owned by authenticated user")}
|
||||
|
||||
{:error, :mime_type_not_allowed} ->
|
||||
{:error, dgettext("errors", "File doesn't have an allowed MIME type.")}
|
||||
|
||||
|
||||
@@ -5,10 +5,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Report do
|
||||
|
||||
import Mobilizon.Users.Guards
|
||||
|
||||
alias Mobilizon.Actors
|
||||
alias Mobilizon.{Actors, Config, Reports, Users}
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Config
|
||||
alias Mobilizon.Reports
|
||||
alias Mobilizon.Reports.{Note, Report}
|
||||
alias Mobilizon.Users.User
|
||||
import Mobilizon.Web.Gettext
|
||||
@@ -48,16 +46,14 @@ defmodule Mobilizon.GraphQL.Resolvers.Report do
|
||||
"""
|
||||
def create_report(
|
||||
_parent,
|
||||
%{reporter_id: reporter_id} = args,
|
||||
args,
|
||||
%{context: %{current_user: %User{} = user}} = _resolution
|
||||
) do
|
||||
with {:is_owned, %Actor{}} <- User.owns_actor(user, reporter_id),
|
||||
{:ok, _, %Report{} = report} <- API.Reports.report(args) do
|
||||
with %Actor{id: reporter_id} <- Users.get_actor_for_user(user),
|
||||
{:ok, _, %Report{} = report} <-
|
||||
args |> Map.put(:reporter_id, reporter_id) |> API.Reports.report() do
|
||||
{:ok, report}
|
||||
else
|
||||
{:is_owned, nil} ->
|
||||
{:error, dgettext("errors", "Reporter profile is not owned by authenticated user")}
|
||||
|
||||
_error ->
|
||||
{:error, dgettext("errors", "Error while saving report")}
|
||||
end
|
||||
@@ -65,47 +61,37 @@ defmodule Mobilizon.GraphQL.Resolvers.Report do
|
||||
|
||||
def create_report(
|
||||
_parent,
|
||||
%{reporter_id: reporter_id} = args,
|
||||
args,
|
||||
_resolution
|
||||
) do
|
||||
with {:anonymous_reporting_allowed, true} <-
|
||||
{:anonymous_reporting_allowed, Config.anonymous_reporting?()},
|
||||
{:wrong_id, true} <- {:wrong_id, reporter_id == to_string(Config.anonymous_actor_id())},
|
||||
{:ok, _, %Report{} = report} <- API.Reports.report(args) do
|
||||
{:ok, _, %Report{} = report} <-
|
||||
args |> Map.put(:reporter_id, Config.anonymous_actor_id()) |> API.Reports.report() do
|
||||
{:ok, report}
|
||||
else
|
||||
{:anonymous_reporting_allowed, _} ->
|
||||
{:error, dgettext("errors", "You need to be logged-in to create reports")}
|
||||
|
||||
{:wrong_id, _} ->
|
||||
{:error, dgettext("errors", "Reporter ID does not match the anonymous profile id")}
|
||||
|
||||
_error ->
|
||||
{:error, dgettext("errors", "Error while saving report")}
|
||||
end
|
||||
end
|
||||
|
||||
def create_report(_parent, _args, _resolution) do
|
||||
{:error, dgettext("errors", "You need to be logged-in to create reports")}
|
||||
end
|
||||
|
||||
@doc """
|
||||
Update a report's status
|
||||
"""
|
||||
def update_report(
|
||||
_parent,
|
||||
%{report_id: report_id, moderator_id: moderator_id, status: status},
|
||||
%{report_id: report_id, status: status},
|
||||
%{context: %{current_user: %User{role: role} = user}}
|
||||
)
|
||||
when is_moderator(role) do
|
||||
with {:is_owned, %Actor{} = actor} <- User.owns_actor(user, moderator_id),
|
||||
with %Actor{} = actor <- Users.get_actor_for_user(user),
|
||||
%Report{} = report <- Mobilizon.Reports.get_report(report_id),
|
||||
{:ok, %Report{} = report} <- API.Reports.update_report_status(actor, report, status) do
|
||||
{:ok, report}
|
||||
else
|
||||
{:is_owned, nil} ->
|
||||
{:error, dgettext("errors", "Profile is not owned by authenticated user")}
|
||||
|
||||
_error ->
|
||||
{:error, dgettext("errors", "Error while updating report")}
|
||||
end
|
||||
@@ -117,11 +103,11 @@ defmodule Mobilizon.GraphQL.Resolvers.Report do
|
||||
|
||||
def create_report_note(
|
||||
_parent,
|
||||
%{report_id: report_id, moderator_id: moderator_id, content: content},
|
||||
%{report_id: report_id, content: content},
|
||||
%{context: %{current_user: %User{role: role} = user}}
|
||||
)
|
||||
when is_moderator(role) do
|
||||
with {:is_owned, %Actor{}} <- User.owns_actor(user, moderator_id),
|
||||
with %Actor{id: moderator_id} <- Users.get_actor_for_user(user),
|
||||
%Report{} = report <- Reports.get_report(report_id),
|
||||
%Actor{} = moderator <- Actors.get_local_actor_with_preload(moderator_id),
|
||||
{:ok, %Note{} = note} <- API.Reports.create_report_note(report, moderator, content) do
|
||||
@@ -131,11 +117,11 @@ defmodule Mobilizon.GraphQL.Resolvers.Report do
|
||||
|
||||
def delete_report_note(
|
||||
_parent,
|
||||
%{note_id: note_id, moderator_id: moderator_id},
|
||||
%{note_id: note_id},
|
||||
%{context: %{current_user: %User{role: role} = user}}
|
||||
)
|
||||
when is_moderator(role) do
|
||||
with {:is_owned, %Actor{}} <- User.owns_actor(user, moderator_id),
|
||||
with %Actor{id: moderator_id} <- Users.get_actor_for_user(user),
|
||||
%Note{} = note <- Reports.get_note(note_id),
|
||||
%Actor{} = moderator <- Actors.get_local_actor_with_preload(moderator_id),
|
||||
{:ok, %Note{} = note} <- API.Reports.delete_report_note(note, moderator) do
|
||||
|
||||
@@ -53,9 +53,6 @@ defmodule Mobilizon.GraphQL.Resolvers.Todos do
|
||||
%Page{} = page <- Todos.get_todos_for_todo_list(todo_list) do
|
||||
{:ok, page}
|
||||
else
|
||||
{:is_owned, nil} ->
|
||||
{:error, dgettext("errors", "Profile is not owned by authenticated user")}
|
||||
|
||||
{:member, _} ->
|
||||
{:error, dgettext("errors", "Profile is not member of group")}
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user