Change schema a bit
Closes #29 Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -8,6 +8,12 @@ defenum(Mobilizon.Actors.ActorTypeEnum, :actor_type, [
|
||||
:Service
|
||||
])
|
||||
|
||||
defenum(Mobilizon.Actors.ActorOpennesssEnum, :openness, [
|
||||
:invite_only,
|
||||
:moderated,
|
||||
:open
|
||||
])
|
||||
|
||||
defmodule Mobilizon.Actors.Actor do
|
||||
@moduledoc """
|
||||
Represents an actor (local and remote actors)
|
||||
@@ -42,6 +48,7 @@ defmodule Mobilizon.Actors.Actor do
|
||||
field(:suspended, :boolean, default: false)
|
||||
field(:avatar_url, :string)
|
||||
field(:banner_url, :string)
|
||||
# field(:openness, Mobilizon.Actors.ActorOpennesssEnum, default: :moderated)
|
||||
many_to_many(:followers, Actor, join_through: Follower)
|
||||
has_many(:organized_events, Event, foreign_key: :organizer_actor_id)
|
||||
many_to_many(:memberships, Actor, join_through: Member)
|
||||
|
||||
@@ -10,10 +10,12 @@ defmodule Mobilizon.Actors do
|
||||
|
||||
alias Mobilizon.Service.ActivityPub
|
||||
|
||||
@doc false
|
||||
def data() do
|
||||
Dataloader.Ecto.new(Repo, query: &query/2)
|
||||
end
|
||||
|
||||
@doc false
|
||||
def query(queryable, _params) do
|
||||
queryable
|
||||
end
|
||||
@@ -312,14 +314,51 @@ defmodule Mobilizon.Actors do
|
||||
if preload, do: Repo.preload(actor, [:followers]), else: actor
|
||||
end
|
||||
|
||||
def get_actor_by_name(name) do
|
||||
case String.split(name, "@") do
|
||||
[name] ->
|
||||
Repo.one(from(a in Actor, where: a.preferred_username == ^name and is_nil(a.domain)))
|
||||
@doc """
|
||||
Get an actor by name
|
||||
|
||||
[name, domain] ->
|
||||
Repo.get_by(Actor, preferred_username: name, domain: domain)
|
||||
end
|
||||
## Examples
|
||||
iex> get_actor_by_name("tcit")
|
||||
%Mobilizon.Actors.Actor{preferred_username: "tcit", domain: nil}
|
||||
|
||||
iex> get_actor_by_name("tcit@social.tcit.fr")
|
||||
%Mobilizon.Actors.Actor{preferred_username: "tcit", domain: "social.tcit.fr"}
|
||||
|
||||
iex> get_actor_by_name("tcit", :Group)
|
||||
nil
|
||||
|
||||
"""
|
||||
@spec get_actor_by_name(String.t(), atom() | nil) :: Actor.t()
|
||||
def get_actor_by_name(name, type \\ nil) do
|
||||
# Base query
|
||||
query = from(a in Actor)
|
||||
|
||||
# If we have Person / Group information
|
||||
query =
|
||||
if type in [:Person, :Group] do
|
||||
from(a in query, where: a.type == ^type)
|
||||
else
|
||||
query
|
||||
end
|
||||
|
||||
# If the name is a remote actor
|
||||
query =
|
||||
case String.split(name, "@") do
|
||||
[name] -> do_get_actor_by_name(query, name)
|
||||
[name, domain] -> do_get_actor_by_name(query, name, domain)
|
||||
end
|
||||
|
||||
Repo.one(query)
|
||||
end
|
||||
|
||||
# Get actor by username and domain is nil
|
||||
defp do_get_actor_by_name(query, name) do
|
||||
from(a in query, where: a.preferred_username == ^name and is_nil(a.domain))
|
||||
end
|
||||
|
||||
# Get actor by username and domain
|
||||
defp do_get_actor_by_name(query, name, domain) do
|
||||
from(a in query, where: a.preferred_username == ^name and a.domain == ^domain)
|
||||
end
|
||||
|
||||
def get_local_actor_by_name(name) do
|
||||
@@ -331,17 +370,11 @@ defmodule Mobilizon.Actors do
|
||||
Repo.preload(actor, :organized_events)
|
||||
end
|
||||
|
||||
def get_actor_by_name_with_everything(name) do
|
||||
actor =
|
||||
case String.split(name, "@") do
|
||||
[name] ->
|
||||
Repo.one(from(a in Actor, where: a.preferred_username == ^name and is_nil(a.domain)))
|
||||
|
||||
[name, domain] ->
|
||||
Repo.one(from(a in Actor, where: a.preferred_username == ^name and a.domain == ^domain))
|
||||
end
|
||||
|
||||
Repo.preload(actor, :organized_events)
|
||||
@spec get_actor_by_name_with_everything(String.t(), atom() | nil) :: Actor.t()
|
||||
def get_actor_by_name_with_everything(name, type \\ nil) do
|
||||
name
|
||||
|> get_actor_by_name(type)
|
||||
|> Repo.preload(:organized_events)
|
||||
end
|
||||
|
||||
def get_or_fetch_by_url(url, preload \\ false) do
|
||||
@@ -394,6 +427,7 @@ defmodule Mobilizon.Actors do
|
||||
@doc """
|
||||
Find actors by their name or displayed name
|
||||
"""
|
||||
@spec find_actors_by_username_or_name(String.t(), integer(), integer()) :: list(Actor.t())
|
||||
def find_actors_by_username_or_name(username, page \\ 1, limit \\ 10)
|
||||
def find_actors_by_username_or_name("", _page, _limit), do: []
|
||||
|
||||
@@ -418,6 +452,7 @@ defmodule Mobilizon.Actors do
|
||||
end
|
||||
|
||||
@email_regex ~r/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
|
||||
@spec search(String.t()) :: {:ok, list(Actor.t())} | {:ok, []} | {:error, any()}
|
||||
def search(name) do
|
||||
# find already saved accounts
|
||||
case find_actors_by_username_or_name(name) do
|
||||
|
||||
@@ -23,7 +23,7 @@ defmodule Mobilizon.Events.Tag.TitleSlug do
|
||||
nil ->
|
||||
slug
|
||||
|
||||
_story ->
|
||||
_tag ->
|
||||
slug
|
||||
|> Mobilizon.Slug.increment_slug()
|
||||
|> build_unique_slug(changeset)
|
||||
@@ -51,8 +51,8 @@ defmodule Mobilizon.Events.Tag do
|
||||
def changeset(%Tag{} = tag, attrs) do
|
||||
tag
|
||||
|> cast(attrs, [:title])
|
||||
|> validate_required([:title])
|
||||
|> TitleSlug.maybe_generate_slug()
|
||||
|> validate_required([:title, :slug])
|
||||
|> TitleSlug.unique_constraint()
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user