Work on actors
* Implement group GraphQL APIs * Change Actors changeset to properly set urls * Remove old actors indexes and add some new ones Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
55
lib/mobilizon_web/resolvers/group.ex
Normal file
55
lib/mobilizon_web/resolvers/group.ex
Normal file
@@ -0,0 +1,55 @@
|
||||
defmodule MobilizonWeb.Resolvers.Group do
|
||||
alias Mobilizon.Actors
|
||||
alias Mobilizon.Actors.{Actor}
|
||||
alias Mobilizon.Service.ActivityPub
|
||||
require Logger
|
||||
|
||||
@doc """
|
||||
Find a group
|
||||
"""
|
||||
def find_group(_parent, %{preferred_username: name}, _resolution) do
|
||||
case ActivityPub.find_or_make_group_from_nickname(name) do
|
||||
{:ok, actor} ->
|
||||
{:ok, actor}
|
||||
|
||||
_ ->
|
||||
{:error, "Group with name #{name} not found"}
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Lists all groups
|
||||
"""
|
||||
def list_groups(_parent, _args, _resolution) do
|
||||
{:ok, Actors.list_groups}
|
||||
end
|
||||
|
||||
@doc """
|
||||
Create a new group. The creator is automatically added as admin
|
||||
"""
|
||||
def create_group(
|
||||
_parent,
|
||||
%{preferred_username: preferred_username, creator_username: actor_username},
|
||||
%{
|
||||
context: %{current_user: user}
|
||||
}
|
||||
) do
|
||||
|
||||
with %Actor{id: actor_id} <- Actors.get_local_actor_by_name(actor_username),
|
||||
{:user_actor, true} <-
|
||||
{:user_actor, actor_id in Enum.map(Actors.get_actors_for_user(user), & &1.id)},
|
||||
{:ok, %Actor{} = group} <- Actors.create_group(%{preferred_username: preferred_username}) do
|
||||
{:ok, group}
|
||||
else
|
||||
{:error, %Ecto.Changeset{errors: [url: {"has already been taken", []}]}} ->
|
||||
{:error, :group_name_not_available}
|
||||
err ->
|
||||
Logger.error(inspect(err))
|
||||
err
|
||||
end
|
||||
end
|
||||
|
||||
def create_group(_parent, _args, _resolution) do
|
||||
{:error, "You need to be logged-in to create a group"}
|
||||
end
|
||||
end
|
||||
@@ -1,7 +1,8 @@
|
||||
defmodule MobilizonWeb.Resolvers.Actor do
|
||||
defmodule MobilizonWeb.Resolvers.Person do
|
||||
alias Mobilizon.Actors
|
||||
alias Mobilizon.Service.ActivityPub
|
||||
|
||||
@deprecated "Use find_person/3 or find_group/3 instead"
|
||||
def find_actor(_parent, %{preferred_username: name}, _resolution) do
|
||||
case ActivityPub.find_or_make_actor_from_nickname(name) do
|
||||
{:ok, actor} ->
|
||||
@@ -25,19 +26,6 @@ defmodule MobilizonWeb.Resolvers.Actor do
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Find a person
|
||||
"""
|
||||
def find_group(_parent, %{preferred_username: name}, _resolution) do
|
||||
case ActivityPub.find_or_make_group_from_nickname(name) do
|
||||
{:ok, actor} ->
|
||||
{:ok, actor}
|
||||
|
||||
_ ->
|
||||
{:error, "Group with name #{name} not found"}
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Returns the current actor for the currently logged-in user
|
||||
"""
|
||||
@@ -398,6 +398,11 @@ defmodule MobilizonWeb.Schema do
|
||||
resolve(&Resolvers.Event.list_events/3)
|
||||
end
|
||||
|
||||
@desc "Get all groups"
|
||||
field :groups, list_of(:group) do
|
||||
resolve(&Resolvers.Group.list_groups/3)
|
||||
end
|
||||
|
||||
@desc "Search through events, persons and groups"
|
||||
field :search, list_of(:search_result) do
|
||||
arg(:search, non_null(:string))
|
||||
@@ -418,6 +423,12 @@ defmodule MobilizonWeb.Schema do
|
||||
resolve(&Resolvers.Event.list_participants_for_event/3)
|
||||
end
|
||||
|
||||
@desc "Get a group by it's preferred username"
|
||||
field :group, :group do
|
||||
arg(:preferred_username, non_null(:string))
|
||||
resolve(&Resolvers.Group.find_group/3)
|
||||
end
|
||||
|
||||
@desc "Get an user"
|
||||
field :user, :user do
|
||||
arg(:id, non_null(:id))
|
||||
@@ -431,13 +442,13 @@ defmodule MobilizonWeb.Schema do
|
||||
|
||||
@desc "Get the current actor for the logged-in user"
|
||||
field :logged_person, :person do
|
||||
resolve(&Resolvers.Actor.get_current_person/3)
|
||||
resolve(&Resolvers.Person.get_current_person/3)
|
||||
end
|
||||
|
||||
@desc "Get a person"
|
||||
@desc "Get a person by it's preferred username"
|
||||
field :person, :person do
|
||||
arg(:preferred_username, non_null(:string))
|
||||
resolve(&Resolvers.Actor.find_person/3)
|
||||
resolve(&Resolvers.Person.find_person/3)
|
||||
end
|
||||
|
||||
@desc "Get the list of categories"
|
||||
@@ -529,6 +540,17 @@ defmodule MobilizonWeb.Schema do
|
||||
resolve(&Resolvers.User.change_default_actor/3)
|
||||
end
|
||||
|
||||
@desc "Create a group"
|
||||
field :create_group, :group do
|
||||
arg(:preferred_username, non_null(:string), description: "The name for the group")
|
||||
arg(:name, :string, description: "The displayed name for the group")
|
||||
|
||||
arg(:creator_username, :string,
|
||||
description: "The actor's username which will be the admin (otherwise user's default one)"
|
||||
)
|
||||
resolve(&Resolvers.Group.create_group/3)
|
||||
end
|
||||
|
||||
# @desc "Upload a picture"
|
||||
# field :upload_picture, :picture do
|
||||
# arg(:file, non_null(:upload))
|
||||
|
||||
Reference in New Issue
Block a user