Allow to join an open group

Also:

* Refactor interacting with a remote event so that you can interact with
  a remote group as well
* Add a setting for group admins to pick between an open and invite-only
  group
* Fix new groups without posts/todos/resources/events/conversations URL
  set
* Repair local groups that haven't got their
  posts/todos/resources/events/conversations URL set
* Add a scheduled job to refresh remote groups every hour
* Add a user setting to pick when to receive notifications when there's
  new members to approve (will be used when this feature is available)
* Fix pagination for members

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2020-11-06 11:34:32 +01:00
parent 7baad7cafc
commit 7c11807c14
74 changed files with 1174 additions and 626 deletions

View File

@@ -640,6 +640,15 @@ defmodule Mobilizon.Actors do
|> Repo.stream()
end
@doc """
Lists the groups.
"""
@spec list_groups_for_stream :: Enum.t()
def list_external_groups_for_stream do
external_groups_query()
|> Repo.stream()
end
@doc """
Returns the list of groups an actor is member of.
"""
@@ -720,6 +729,13 @@ defmodule Mobilizon.Actors do
)
end
@doc """
Gets the default member role depending on the event join options.
"""
@spec get_default_member_role(Actor.t()) :: :member | :not_approved
def get_default_member_role(%Actor{openness: :open}), do: :member
def get_default_member_role(%Actor{openness: _}), do: :not_approved
@doc """
Gets a single member of an actor (for example a group).
"""
@@ -859,7 +875,7 @@ defmodule Mobilizon.Actors do
end
@doc """
Returns the list of administrator members for a group.
Returns a paginated list of administrator members for a group.
"""
@spec list_administrator_members_for_group(integer | String.t(), integer | nil, integer | nil) ::
Page.t()
@@ -869,6 +885,16 @@ defmodule Mobilizon.Actors do
|> Page.build_page(page, limit)
end
@doc """
Returns the complete list of administrator members for a group.
"""
@spec list_all_administrator_members_for_group(integer | String.t()) :: [Member.t()]
def list_all_administrator_members_for_group(id) do
id
|> administrator_members_for_group_query()
|> Repo.all()
end
@doc """
Returns the list of all group ids where the actor_id is the last administrator.
"""
@@ -1400,6 +1426,11 @@ defmodule Mobilizon.Actors do
)
end
@spec external_groups_query :: Ecto.Query.t()
defp external_groups_query do
where(Actor, [a], a.type == ^:Group and not is_nil(a.domain))
end
@spec list_members_for_user_query(integer()) :: Ecto.Query.t()
defp list_members_for_user_query(user_id) do
from(
@@ -1422,11 +1453,10 @@ defmodule Mobilizon.Actors do
@spec members_for_group_query(integer | String.t()) :: Ecto.Query.t()
defp members_for_group_query(group_id) do
from(
m in Member,
where: m.parent_id == ^group_id,
preload: [:parent, :actor]
)
Member
|> where(parent_id: ^group_id)
|> order_by(desc: :updated_at)
|> preload([:parent, :actor])
end
@spec group_external_member_actor_query(integer()) :: Ecto.Query.t()