mobilizon/lib/graphql/api/groups.ex

51 lines
1.7 KiB
Elixir
Raw Normal View History

2020-01-26 21:11:16 +01:00
defmodule Mobilizon.GraphQL.API.Groups do
@moduledoc """
2019-09-22 16:26:23 +02:00
API for Groups.
"""
2019-09-22 16:26:23 +02:00
alias Mobilizon.Actors
2019-09-07 19:54:11 +02:00
alias Mobilizon.Actors.Actor
2020-01-22 02:14:42 +01:00
alias Mobilizon.Federation.ActivityPub
alias Mobilizon.Federation.ActivityPub.Activity
alias Mobilizon.Service.Formatter.HTML
@doc """
Create a group
"""
2020-01-26 21:11:16 +01:00
@spec create_group(map) :: {:ok, Activity.t(), Actor.t()} | any
def create_group(args) do
with preferred_username <-
args |> Map.get(:preferred_username) |> HTML.strip_tags() |> String.trim(),
{:existing_group, nil} <-
{:existing_group, Actors.get_local_actor_by_name(preferred_username)},
args <- args |> Map.put(:type, :Group),
{:ok, %Activity{} = activity, %Actor{} = group} <-
ActivityPub.create(:actor, args, true, %{"actor" => args.creator_actor.url}) do
{:ok, activity, group}
else
{:existing_group, _} ->
{:error, "A group with this name already exists"}
{:is_owned, nil} ->
{:error, "Actor id is not owned by authenticated user"}
end
end
@spec create_group(map) :: {:ok, Activity.t(), Actor.t()} | any
def update_group(%{id: id} = args) do
with {:existing_group, {:ok, %Actor{type: :Group} = group}} <-
{:existing_group, Actors.get_group_by_actor_id(id)},
{:ok, %Activity{} = activity, %Actor{} = group} <-
ActivityPub.update(group, args, true, %{"actor" => args.updater_actor.url}) do
{:ok, activity, group}
else
{:existing_group, _} ->
2019-09-02 10:50:00 +02:00
{:error, "A group with this name already exists"}
2019-09-07 19:54:11 +02:00
{:is_owned, nil} ->
2019-09-02 10:50:00 +02:00
{:error, "Actor id is not owned by authenticated user"}
end
end
end