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:
@@ -80,9 +80,10 @@ defmodule Mobilizon.Actors.Actor do
|
||||
:banner_url,
|
||||
:user_id
|
||||
])
|
||||
|> put_change(:url, "#{MobilizonWeb.Endpoint.url()}/@#{attrs["preferred_username"]}")
|
||||
|> build_urls()
|
||||
|> validate_required([:preferred_username, :keys, :suspended, :url])
|
||||
|> unique_constraint(:preferred_username, name: :actors_preferred_username_domain_index)
|
||||
|> unique_constraint(:preferred_username, name: :actors_preferred_username_domain_type_index)
|
||||
|> unique_constraint(:url, name: :actors_url_index)
|
||||
end
|
||||
|
||||
def registration_changeset(%Actor{} = actor, attrs) do
|
||||
@@ -93,21 +94,15 @@ defmodule Mobilizon.Actors.Actor do
|
||||
:name,
|
||||
:summary,
|
||||
:keys,
|
||||
:keys,
|
||||
:suspended,
|
||||
:url,
|
||||
:type,
|
||||
:avatar_url,
|
||||
:user_id
|
||||
])
|
||||
|> unique_constraint(:preferred_username, name: :actors_preferred_username_domain_index)
|
||||
|> put_change(:url, "#{MobilizonWeb.Endpoint.url()}/@#{attrs.preferred_username}")
|
||||
|> put_change(:inbox_url, "#{MobilizonWeb.Endpoint.url()}/@#{attrs.preferred_username}/inbox")
|
||||
|> put_change(
|
||||
:outbox_url,
|
||||
"#{MobilizonWeb.Endpoint.url()}/@#{attrs.preferred_username}/outbox"
|
||||
)
|
||||
|> put_change(:shared_inbox_url, "#{MobilizonWeb.Endpoint.url()}/inbox")
|
||||
|> build_urls()
|
||||
|> unique_constraint(:preferred_username, name: :actors_preferred_username_domain_type_index)
|
||||
|> unique_constraint(:url, name: :actors_url_index)
|
||||
|> validate_required([:preferred_username, :keys, :suspended, :url, :type])
|
||||
end
|
||||
|
||||
@@ -142,7 +137,8 @@ defmodule Mobilizon.Actors.Actor do
|
||||
:preferred_username,
|
||||
:keys
|
||||
])
|
||||
|> unique_constraint(:preferred_username, name: :actors_preferred_username_domain_index)
|
||||
|> unique_constraint(:preferred_username, name: :actors_preferred_username_domain_type_index)
|
||||
|> unique_constraint(:url, name: :actors_url_index)
|
||||
|> validate_length(:summary, max: 5000)
|
||||
|> validate_length(:preferred_username, max: 100)
|
||||
|> put_change(:local, false)
|
||||
@@ -167,24 +163,36 @@ defmodule Mobilizon.Actors.Actor do
|
||||
:avatar_url,
|
||||
:banner_url
|
||||
])
|
||||
|> put_change(
|
||||
:outbox_url,
|
||||
"#{MobilizonWeb.Endpoint.url()}/@#{params["preferred_username"]}/outbox"
|
||||
)
|
||||
|> put_change(
|
||||
:inbox_url,
|
||||
"#{MobilizonWeb.Endpoint.url()}/@#{params["preferred_username"]}/inbox"
|
||||
)
|
||||
|> put_change(:shared_inbox_url, "#{MobilizonWeb.Endpoint.url()}/inbox")
|
||||
|> put_change(:url, "#{MobilizonWeb.Endpoint.url()}/@#{params["preferred_username"]}")
|
||||
|> build_urls(:Group)
|
||||
|> put_change(:domain, nil)
|
||||
|> put_change(:type, :Group)
|
||||
|> validate_required([:url, :outbox_url, :inbox_url, :type, :name, :preferred_username])
|
||||
|> validate_required([:url, :outbox_url, :inbox_url, :type, :preferred_username])
|
||||
|> unique_constraint(:preferred_username, name: :actors_preferred_username_domain_type_index)
|
||||
|> unique_constraint(:url, name: :actors_url_index)
|
||||
|> validate_length(:summary, max: 5000)
|
||||
|> validate_length(:preferred_username, max: 100)
|
||||
|> put_change(:local, true)
|
||||
end
|
||||
|
||||
@spec build_urls(Ecto.Changeset.t, atom()) :: Ecto.Changeset.t
|
||||
defp build_urls(changeset, type \\ :Person)
|
||||
defp build_urls(%Ecto.Changeset{changes: %{preferred_username: username}} = changeset, type) do
|
||||
symbol = if type == :Group, do: "~", else: "@"
|
||||
changeset
|
||||
|> put_change(
|
||||
:outbox_url,
|
||||
"#{MobilizonWeb.Endpoint.url()}/#{symbol}#{username}/outbox"
|
||||
)
|
||||
|> put_change(
|
||||
:inbox_url,
|
||||
"#{MobilizonWeb.Endpoint.url()}/#{symbol}#{username}/inbox"
|
||||
)
|
||||
|> put_change(:shared_inbox_url, "#{MobilizonWeb.Endpoint.url()}/inbox")
|
||||
|> put_change(:url, "#{MobilizonWeb.Endpoint.url()}/#{symbol}#{username}")
|
||||
end
|
||||
|
||||
defp build_urls(%Ecto.Changeset{} = changeset, _type), do: changeset
|
||||
|
||||
@doc """
|
||||
Get a public key for a given ActivityPub actor ID (url)
|
||||
"""
|
||||
|
||||
@@ -177,6 +177,8 @@ defmodule Mobilizon.Actors do
|
||||
|
||||
"""
|
||||
def create_group(attrs \\ %{}) do
|
||||
attrs = Map.put(attrs, :keys, create_keys())
|
||||
|
||||
%Actor{}
|
||||
|> Actor.group_creation(attrs)
|
||||
|> Repo.insert()
|
||||
@@ -211,7 +213,7 @@ defmodule Mobilizon.Actors do
|
||||
name: data.name
|
||||
]
|
||||
],
|
||||
conflict_target: [:preferred_username, :domain]
|
||||
conflict_target: [:preferred_username, :domain, :type]
|
||||
)
|
||||
|
||||
if preload, do: {:ok, Repo.preload(actor, [:followers])}, else: {:ok, actor}
|
||||
@@ -509,15 +511,19 @@ defmodule Mobilizon.Actors do
|
||||
end
|
||||
end
|
||||
|
||||
# Create a new RSA key
|
||||
@spec create_keys() :: String.t()
|
||||
defp create_keys() do
|
||||
key = :public_key.generate_key({:rsa, 2048, 65_537})
|
||||
entry = :public_key.pem_entry_encode(:RSAPrivateKey, key)
|
||||
[entry] |> :public_key.pem_encode() |> String.trim_trailing()
|
||||
end
|
||||
|
||||
@doc """
|
||||
Register user
|
||||
"""
|
||||
@spec register(map()) :: {:ok, Actor.t()} | {:error, String.t()}
|
||||
def register(%{email: email, password: password, username: username}) do
|
||||
key = :public_key.generate_key({:rsa, 2048, 65_537})
|
||||
entry = :public_key.pem_entry_encode(:RSAPrivateKey, key)
|
||||
pem = [entry] |> :public_key.pem_encode() |> String.trim_trailing()
|
||||
|
||||
with avatar <- gravatar(email),
|
||||
user_changeset <-
|
||||
User.registration_changeset(%User{}, %{
|
||||
@@ -526,7 +532,7 @@ defmodule Mobilizon.Actors do
|
||||
default_actor: %{
|
||||
preferred_username: username,
|
||||
domain: nil,
|
||||
keys: pem,
|
||||
keys: create_keys(),
|
||||
avatar_url: avatar
|
||||
}
|
||||
}),
|
||||
|
||||
Reference in New Issue
Block a user