More tests
This commit is contained in:
@@ -173,23 +173,9 @@ defmodule Eventos.Actors.Actor do
|
||||
|> put_change(:local, true)
|
||||
end
|
||||
|
||||
def get_or_fetch_by_url(url) do
|
||||
if user = Actors.get_actor_by_url(url) do
|
||||
user
|
||||
else
|
||||
case ActivityPub.make_actor_from_url(url) do
|
||||
{:ok, user} ->
|
||||
user
|
||||
|
||||
_ ->
|
||||
{:error, "Could not fetch by AP id"}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@spec get_public_key_for_url(String.t()) :: {:ok, String.t()}
|
||||
def get_public_key_for_url(url) do
|
||||
with %Actor{} = actor <- get_or_fetch_by_url(url) do
|
||||
with {:ok, %Actor{} = actor} <- Actors.get_or_fetch_by_url(url) do
|
||||
actor.keys
|
||||
|> Eventos.Service.ActivityPub.Utils.pem_to_public_key()
|
||||
else
|
||||
@@ -228,4 +214,44 @@ defmodule Eventos.Actors.Actor do
|
||||
)
|
||||
)
|
||||
end
|
||||
|
||||
def get_groups_member_of(%Actor{id: actor_id}) do
|
||||
Repo.all(
|
||||
from(
|
||||
a in Actor,
|
||||
join: m in Member,
|
||||
on: a.id == m.parent_id,
|
||||
where: m.actor_id == ^actor_id
|
||||
)
|
||||
)
|
||||
end
|
||||
|
||||
def get_members_for_group(%Actor{id: actor_id}) do
|
||||
Repo.all(
|
||||
from(
|
||||
a in Actor,
|
||||
join: m in Member,
|
||||
on: a.id == m.actor_id,
|
||||
where: m.parent_id == ^actor_id
|
||||
)
|
||||
)
|
||||
end
|
||||
|
||||
def follow(%Actor{} = follower, %Actor{} = followed) do
|
||||
# Check if actor is locked
|
||||
# Check if followed has blocked follower
|
||||
# Check if follower already follows followed
|
||||
cond do
|
||||
following?(follower, followed) ->
|
||||
{:error,
|
||||
"Could not follow actor: you are already following #{followed.preferred_username}"}
|
||||
|
||||
# true -> nil
|
||||
# Follow the person
|
||||
end
|
||||
end
|
||||
|
||||
def following?(%Actor{} = follower, %Actor{followers: followers}) do
|
||||
Enum.member?(followers, follower)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -265,13 +265,11 @@ defmodule Eventos.Actors do
|
||||
|
||||
def get_or_fetch_by_url(url) do
|
||||
if actor = get_actor_by_url(url) do
|
||||
actor
|
||||
{:ok, actor}
|
||||
else
|
||||
ap_try = ActivityPub.make_actor_from_url(url)
|
||||
|
||||
case ap_try do
|
||||
case ActivityPub.make_actor_from_url(url) do
|
||||
{:ok, actor} ->
|
||||
actor
|
||||
{:ok, actor}
|
||||
|
||||
_ ->
|
||||
{:error, "Could not fetch by AP id"}
|
||||
@@ -299,7 +297,7 @@ defmodule Eventos.Actors do
|
||||
@doc """
|
||||
Find actors by their name or displayed name
|
||||
"""
|
||||
def find_actors_by_username(username) do
|
||||
def find_actors_by_username_or_name(username) do
|
||||
Repo.all(
|
||||
from(
|
||||
a in Actor,
|
||||
@@ -320,7 +318,7 @@ defmodule Eventos.Actors do
|
||||
@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])?)*$/
|
||||
def search(name) do
|
||||
# find already saved accounts
|
||||
case find_actors_by_username(name) do
|
||||
case find_actors_by_username_or_name(name) do
|
||||
[] ->
|
||||
# no accounts found, let's test if it's an username@domain.tld
|
||||
with true <- Regex.match?(@email_regex, name),
|
||||
@@ -457,6 +455,24 @@ defmodule Eventos.Actors do
|
||||
|> Repo.insert()
|
||||
end
|
||||
|
||||
@doc """
|
||||
Gets an user by it's email
|
||||
|
||||
## Examples
|
||||
|
||||
iex> get_user_by_email(user, email)
|
||||
{:ok, %User{}}
|
||||
|
||||
iex> get_user_by_email(user, wrong_email)
|
||||
{:error, nil}
|
||||
"""
|
||||
def get_user_by_email(email) do
|
||||
case Repo.get_by(User, email: email) do
|
||||
nil -> {:error, nil}
|
||||
user -> {:ok, user}
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Updates a user.
|
||||
|
||||
@@ -548,10 +564,12 @@ defmodule Eventos.Actors do
|
||||
|
||||
"""
|
||||
def create_member(attrs \\ %{}) do
|
||||
%Member{}
|
||||
|> Member.changeset(attrs)
|
||||
|> Repo.insert!()
|
||||
|> Repo.preload([:actor, :parent])
|
||||
with {:ok, %Member{} = member} <-
|
||||
%Member{}
|
||||
|> Member.changeset(attrs)
|
||||
|> Repo.insert() do
|
||||
{:ok, Repo.preload(member, [:actor, :parent])}
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
|
||||
@@ -7,7 +7,6 @@ defmodule Eventos.Actors.Member do
|
||||
alias Eventos.Actors.Member
|
||||
alias Eventos.Actors.Actor
|
||||
|
||||
@primary_key false
|
||||
schema "members" do
|
||||
field(:approved, :boolean, default: true)
|
||||
# 0 : Member, 1 : Moderator, 2 : Admin
|
||||
@@ -23,5 +22,6 @@ defmodule Eventos.Actors.Member do
|
||||
member
|
||||
|> cast(attrs, [:role, :approved, :parent_id, :actor_id])
|
||||
|> validate_required([:parent_id, :actor_id])
|
||||
|> unique_constraint(:parent_id, name: :members_actor_parent_unique_index)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -11,16 +11,18 @@ defmodule Eventos.Actors.Service.ResetPassword do
|
||||
"""
|
||||
@spec check_reset_password_token(String.t(), String.t()) :: tuple
|
||||
def check_reset_password_token(password, token) do
|
||||
with %User{} = user <- Repo.get_by(User, reset_password_token: token) do
|
||||
Repo.update(
|
||||
User.password_reset_changeset(user, %{
|
||||
"password" => password,
|
||||
"reset_password_sent_at" => nil,
|
||||
"reset_password_token" => nil
|
||||
})
|
||||
)
|
||||
with %User{} = user <- Repo.get_by(User, reset_password_token: token),
|
||||
{:ok, %User{} = user} <-
|
||||
Repo.update(
|
||||
User.password_reset_changeset(user, %{
|
||||
"password" => password,
|
||||
"reset_password_sent_at" => nil,
|
||||
"reset_password_token" => nil
|
||||
})
|
||||
) do
|
||||
{:ok, Repo.preload(user, :actors)}
|
||||
else
|
||||
_err ->
|
||||
err ->
|
||||
{:error, :invalid_token}
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user