Get membership status only for the current group
Closes #575 Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -934,7 +934,10 @@ defmodule Mobilizon.Federation.ActivityPub do
|
||||
do: Refresher.fetch_group(member.parent.url, member.actor)
|
||||
),
|
||||
Absinthe.Subscription.publish(Endpoint, member.actor,
|
||||
group_membership_changed: member.actor.id
|
||||
group_membership_changed: [
|
||||
Actor.preferred_username_and_domain(member.parent),
|
||||
member.actor.id
|
||||
]
|
||||
),
|
||||
member_as_data <- Convertible.model_to_as(member),
|
||||
audience <-
|
||||
|
||||
@@ -126,7 +126,9 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Actors do
|
||||
}),
|
||||
{:ok, _} <-
|
||||
Mobilizon.Service.Activity.Member.insert_activity(member, subject: "member_joined"),
|
||||
Absinthe.Subscription.publish(Endpoint, actor, group_membership_changed: actor.id),
|
||||
Absinthe.Subscription.publish(Endpoint, actor,
|
||||
group_membership_changed: [Actor.preferred_username_and_domain(group), actor.id]
|
||||
),
|
||||
join_data <- %{
|
||||
"type" => "Join",
|
||||
"id" => member.url,
|
||||
|
||||
@@ -5,11 +5,17 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Members do
|
||||
alias Mobilizon.Federation.ActivityPub
|
||||
alias Mobilizon.Federation.ActivityStream.Convertible
|
||||
alias Mobilizon.Service.Activity.Member, as: MemberActivity
|
||||
alias Mobilizon.Web.Endpoint
|
||||
require Logger
|
||||
import Mobilizon.Federation.ActivityPub.Utils, only: [make_update_data: 2]
|
||||
|
||||
def update(
|
||||
%Member{parent: %Actor{id: group_id}, id: member_id, role: current_role} = old_member,
|
||||
%Member{
|
||||
parent: %Actor{id: group_id} = group,
|
||||
id: member_id,
|
||||
role: current_role,
|
||||
actor: %Actor{id: actor_id} = actor
|
||||
} = old_member,
|
||||
%{role: updated_role} = args,
|
||||
%{moderator: %Actor{url: moderator_url, id: moderator_id} = moderator} = additional
|
||||
) do
|
||||
@@ -27,6 +33,9 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Members do
|
||||
moderator: moderator,
|
||||
subject: "member_updated"
|
||||
),
|
||||
Absinthe.Subscription.publish(Endpoint, actor,
|
||||
group_membership_changed: [Actor.preferred_username_and_domain(group), actor_id]
|
||||
),
|
||||
{:ok, true} <- Cachex.del(:activity_pub, "member_#{member_id}"),
|
||||
member_as_data <-
|
||||
Convertible.model_to_as(member),
|
||||
|
||||
@@ -6,9 +6,9 @@ defmodule Mobilizon.GraphQL.Resolvers.Person do
|
||||
import Mobilizon.Users.Guards
|
||||
|
||||
alias Mobilizon.{Actors, Events, Users}
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Actors.{Actor, Member}
|
||||
alias Mobilizon.Events.Participant
|
||||
alias Mobilizon.Storage.Page
|
||||
alias Mobilizon.Storage.{Page, Repo}
|
||||
alias Mobilizon.Users.User
|
||||
import Mobilizon.Web.Gettext
|
||||
|
||||
@@ -306,10 +306,33 @@ defmodule Mobilizon.GraphQL.Resolvers.Person do
|
||||
@doc """
|
||||
Returns the list of events this person is going to
|
||||
"""
|
||||
def person_memberships(%Actor{id: actor_id}, _args, %{context: %{current_user: user}}) do
|
||||
@spec person_memberships(Actor.t(), map(), map()) :: {:ok, Page.t()} | {:error, String.t()}
|
||||
def person_memberships(%Actor{id: actor_id}, %{group: group}, %{
|
||||
context: %{current_user: user}
|
||||
}) do
|
||||
with {:is_owned, %Actor{id: actor_id}} <- User.owns_actor(user, actor_id),
|
||||
%Actor{id: group_id} <- Actors.get_actor_by_name(group, :Group),
|
||||
{:ok, %Member{} = membership} <- Actors.get_member(actor_id, group_id),
|
||||
memberships <- %Page{
|
||||
total: 1,
|
||||
elements: [Repo.preload(membership, [:actor, :parent, :invited_by])]
|
||||
} do
|
||||
{:ok, memberships}
|
||||
else
|
||||
{:error, :member_not_found} ->
|
||||
{:ok, %Page{total: 0, elements: []}}
|
||||
|
||||
{:is_owned, nil} ->
|
||||
{:error, dgettext("errors", "Profile is not owned by authenticated user")}
|
||||
end
|
||||
end
|
||||
|
||||
def person_memberships(%Actor{id: actor_id}, %{page: page, limit: limit}, %{
|
||||
context: %{current_user: user}
|
||||
}) do
|
||||
with {:is_owned, %Actor{} = actor} <- User.owns_actor(user, actor_id),
|
||||
participations <- Actors.list_members_for_actor(actor) do
|
||||
{:ok, participations}
|
||||
memberships <- Actors.list_members_for_actor(actor, page, limit) do
|
||||
{:ok, memberships}
|
||||
else
|
||||
{:is_owned, nil} ->
|
||||
{:error, dgettext("errors", "Profile is not owned by authenticated user")}
|
||||
|
||||
@@ -70,7 +70,7 @@ defmodule Mobilizon.GraphQL.Schema.Actors.PersonType do
|
||||
field(:participations, :paginated_participant_list,
|
||||
description: "The list of events this person goes to"
|
||||
) do
|
||||
arg(:event_id, :id)
|
||||
arg(:event_id, :id, description: "Filter by event ID")
|
||||
|
||||
arg(:page, :integer,
|
||||
default_value: 1,
|
||||
@@ -86,6 +86,14 @@ defmodule Mobilizon.GraphQL.Schema.Actors.PersonType do
|
||||
field(:memberships, :paginated_member_list,
|
||||
description: "The list of group this person is member of"
|
||||
) do
|
||||
arg(:group, :string, description: "Filter by group federated username")
|
||||
|
||||
arg(:page, :integer,
|
||||
default_value: 1,
|
||||
description: "The page in the paginated memberships list"
|
||||
)
|
||||
|
||||
arg(:limit, :integer, default_value: 10, description: "The limit of memberships per page")
|
||||
resolve(&Person.person_memberships/3)
|
||||
end
|
||||
end
|
||||
@@ -225,9 +233,10 @@ defmodule Mobilizon.GraphQL.Schema.Actors.PersonType do
|
||||
@desc "Notify when a person's membership's status changed for a group"
|
||||
field :group_membership_changed, :person do
|
||||
arg(:person_id, non_null(:id), description: "The person's ID")
|
||||
arg(:group, non_null(:string), description: "The group's federated username")
|
||||
|
||||
config(fn args, _ ->
|
||||
{:ok, topic: args.person_id}
|
||||
{:ok, topic: [args.group, args.person_id]}
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user