@@ -11,7 +11,9 @@ defmodule Mobilizon.GraphQL.API.Comments do
|
||||
@doc """
|
||||
Create a comment
|
||||
"""
|
||||
@spec create_comment(map) :: {:ok, Activity.t(), Comment.t()} | any
|
||||
@spec create_comment(map) ::
|
||||
{:ok, Activity.t(), Comment.t()}
|
||||
| {:error, :entity_tombstoned | atom() | Ecto.Changeset.t()}
|
||||
def create_comment(args) do
|
||||
args = extract_pictures_from_comment_body(args)
|
||||
Actions.Create.create(:comment, args, true)
|
||||
@@ -20,7 +22,8 @@ defmodule Mobilizon.GraphQL.API.Comments do
|
||||
@doc """
|
||||
Updates a comment
|
||||
"""
|
||||
@spec update_comment(Comment.t(), map()) :: {:ok, Activity.t(), Comment.t()} | any
|
||||
@spec update_comment(Comment.t(), map()) ::
|
||||
{:ok, Activity.t(), Comment.t()} | {:error, atom() | Ecto.Changeset.t()}
|
||||
def update_comment(%Comment{} = comment, args) do
|
||||
args = extract_pictures_from_comment_body(args)
|
||||
Actions.Update.update(comment, args, true)
|
||||
@@ -37,7 +40,9 @@ defmodule Mobilizon.GraphQL.API.Comments do
|
||||
@doc """
|
||||
Creates a discussion (or reply to a discussion)
|
||||
"""
|
||||
@spec create_discussion(map()) :: map()
|
||||
@spec create_discussion(map()) ::
|
||||
{:ok, Activity.t(), Discussion.t()}
|
||||
| {:error, :entity_tombstoned | atom | Ecto.Changeset.t()}
|
||||
def create_discussion(args) do
|
||||
args = extract_pictures_from_comment_body(args)
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ defmodule Mobilizon.GraphQL.Error do
|
||||
# Error Tuples
|
||||
# ------------
|
||||
# Regular errors
|
||||
@spec normalize(error | list(error) | String.t() | any()) :: t()
|
||||
@spec normalize(any()) :: t() | list(t())
|
||||
def normalize({:error, reason}) do
|
||||
handle(reason)
|
||||
end
|
||||
|
||||
@@ -106,7 +106,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Comment do
|
||||
case Discussions.get_comment_with_preload(comment_id) do
|
||||
%CommentModel{deleted_at: nil} = comment ->
|
||||
cond do
|
||||
{:comment_can_be_managed, true} == CommentModel.can_be_managed_by(comment, actor_id) ->
|
||||
{:comment_can_be_managed, true} ==
|
||||
{:comment_can_be_managed, CommentModel.can_be_managed_by?(comment, actor_id)} ->
|
||||
do_delete_comment(comment, actor)
|
||||
|
||||
role in [:moderator, :administrator] ->
|
||||
|
||||
@@ -107,28 +107,29 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
|
||||
}
|
||||
} = _resolution
|
||||
) do
|
||||
with {:member, true} <- {:member, Actors.is_member?(actor_id, group_id)},
|
||||
parent <- get_eventual_parent(args),
|
||||
{:own_check, true} <- {:own_check, check_resource_owned_by_group(parent, group_id)},
|
||||
{:ok, _, %Resource{} = resource} <-
|
||||
Actions.Create.create(
|
||||
:resource,
|
||||
args
|
||||
|> Map.put(:actor_id, group_id)
|
||||
|> Map.put(:creator_id, actor_id),
|
||||
true,
|
||||
%{}
|
||||
) do
|
||||
{:ok, resource}
|
||||
else
|
||||
{:error, _} ->
|
||||
{:error, dgettext("errors", "Error while creating resource")}
|
||||
if Actors.is_member?(actor_id, group_id) do
|
||||
parent = get_eventual_parent(args)
|
||||
|
||||
{:own_check, _} ->
|
||||
if check_resource_owned_by_group(parent, group_id) do
|
||||
case Actions.Create.create(
|
||||
:resource,
|
||||
args
|
||||
|> Map.put(:actor_id, group_id)
|
||||
|> Map.put(:creator_id, actor_id),
|
||||
true,
|
||||
%{}
|
||||
) do
|
||||
{:ok, _, %Resource{} = resource} ->
|
||||
{:ok, resource}
|
||||
|
||||
{:error, _err} ->
|
||||
{:error, dgettext("errors", "Error while creating resource")}
|
||||
end
|
||||
else
|
||||
{:error, dgettext("errors", "Parent resource doesn't belong to this group")}
|
||||
|
||||
{:member, _} ->
|
||||
{:error, dgettext("errors", "Profile is not member of group")}
|
||||
end
|
||||
else
|
||||
{:error, dgettext("errors", "Profile is not member of group")}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Tag do
|
||||
@doc """
|
||||
Retrieve the list of related tags for a parent tag
|
||||
"""
|
||||
@spec list_tags_for_post(Tag.t(), map(), Absinthe.Resolution.t()) :: {:ok, list(Tag.t())}
|
||||
@spec get_related_tags(Tag.t(), map(), Absinthe.Resolution.t()) :: {:ok, list(Tag.t())}
|
||||
def get_related_tags(%Tag{} = tag, _args, _resolution) do
|
||||
{:ok, Events.list_tag_neighbors(tag)}
|
||||
end
|
||||
|
||||
@@ -425,35 +425,39 @@ defmodule Mobilizon.GraphQL.Resolvers.User do
|
||||
def change_email(_parent, %{email: new_email, password: password}, %{
|
||||
context: %{current_user: %User{email: old_email} = user}
|
||||
}) do
|
||||
with {:can_change_password, true} <-
|
||||
{:can_change_password, Authenticator.can_change_email?(user)},
|
||||
{:current_password, {:ok, %User{}}} <-
|
||||
{:current_password, Authenticator.login(user.email, password)},
|
||||
{:same_email, false} <- {:same_email, new_email == old_email},
|
||||
{:email_valid, true} <- {:email_valid, Email.Checker.valid?(new_email)},
|
||||
{:ok, %User{} = user} <- Users.update_user_email(user, new_email) do
|
||||
user
|
||||
|> Email.User.send_email_reset_old_email()
|
||||
|> Email.Mailer.send_email_later()
|
||||
if Authenticator.can_change_email?(user) do
|
||||
case Authenticator.login(old_email, password) do
|
||||
{:ok, %User{}} ->
|
||||
if new_email != old_email do
|
||||
if Email.Checker.valid?(new_email) do
|
||||
case Users.update_user_email(user, new_email) do
|
||||
{:ok, %User{} = user} ->
|
||||
user
|
||||
|> Email.User.send_email_reset_old_email()
|
||||
|> Email.Mailer.send_email_later()
|
||||
|
||||
user
|
||||
|> Email.User.send_email_reset_new_email()
|
||||
|> Email.Mailer.send_email_later()
|
||||
user
|
||||
|> Email.User.send_email_reset_new_email()
|
||||
|> Email.Mailer.send_email_later()
|
||||
|
||||
{:ok, user}
|
||||
{:ok, user}
|
||||
|
||||
{:error, %Ecto.Changeset{} = err} ->
|
||||
Logger.debug(inspect(err))
|
||||
{:error, dgettext("errors", "Failed to update user email")}
|
||||
end
|
||||
else
|
||||
{:error, dgettext("errors", "The new email doesn't seem to be valid")}
|
||||
end
|
||||
else
|
||||
{:error, dgettext("errors", "The new email must be different")}
|
||||
end
|
||||
|
||||
{:error, _} ->
|
||||
{:error, dgettext("errors", "The password provided is invalid")}
|
||||
end
|
||||
else
|
||||
{:current_password, {:error, _}} ->
|
||||
{:error, dgettext("errors", "The password provided is invalid")}
|
||||
|
||||
{:same_email, true} ->
|
||||
{:error, dgettext("errors", "The new email must be different")}
|
||||
|
||||
{:email_valid, false} ->
|
||||
{:error, dgettext("errors", "The new email doesn't seem to be valid")}
|
||||
|
||||
{:error, %Ecto.Changeset{} = err} ->
|
||||
Logger.debug(inspect(err))
|
||||
{:error, dgettext("errors", "Failed to update user email")}
|
||||
{:error, dgettext("errors", "User cannot change email")}
|
||||
end
|
||||
end
|
||||
|
||||
@@ -635,14 +639,14 @@ defmodule Mobilizon.GraphQL.Resolvers.User do
|
||||
user,
|
||||
context
|
||||
) do
|
||||
with current_ip <- Map.get(context, :ip),
|
||||
now <- DateTime.utc_now() do
|
||||
Users.update_user(user, %{
|
||||
last_sign_in_at: current_sign_in_at || now,
|
||||
last_sign_in_ip: current_sign_in_ip || current_ip,
|
||||
current_sign_in_ip: current_ip,
|
||||
current_sign_in_at: now
|
||||
})
|
||||
end
|
||||
current_ip = Map.get(context, :ip)
|
||||
now = DateTime.utc_now()
|
||||
|
||||
Users.update_user(user, %{
|
||||
last_sign_in_at: current_sign_in_at || now,
|
||||
last_sign_in_ip: current_sign_in_ip || current_ip,
|
||||
current_sign_in_ip: current_ip,
|
||||
current_sign_in_at: now
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user