Allow multiple identities (accounts actors) for one user.
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -68,7 +68,7 @@ defmodule Eventos.Actors.Actor do
|
||||
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
|
||||
has_one :user, User
|
||||
belongs_to :user, User
|
||||
|
||||
timestamps()
|
||||
end
|
||||
@@ -83,7 +83,7 @@ defmodule Eventos.Actors.Actor do
|
||||
|
||||
def registration_changeset(%Actor{} = actor, attrs) do
|
||||
actor
|
||||
|> Ecto.Changeset.cast(attrs, [:preferred_username, :domain, :name, :summary, :keys, :keys, :suspended, :url, :type, :avatar_url])
|
||||
|> Ecto.Changeset.cast(attrs, [:preferred_username, :domain, :name, :summary, :keys, :keys, :suspended, :url, :type, :avatar_url, :user_id])
|
||||
|> unique_constraint(:preferred_username, name: :actors_preferred_username_domain_index)
|
||||
|> put_change(:url, "#{EventosWeb.Endpoint.url()}/@#{attrs["prefered_username"]}")
|
||||
|> validate_required([:preferred_username, :keys, :suspended, :url, :type])
|
||||
|
||||
@@ -177,7 +177,7 @@ defmodule Eventos.Actors do
|
||||
|
||||
def list_users_with_actors do
|
||||
users = Repo.all(User)
|
||||
Repo.preload(users, :actor)
|
||||
Repo.preload(users, :actors)
|
||||
end
|
||||
|
||||
defp blank?(""), do: nil
|
||||
@@ -222,7 +222,7 @@ defmodule Eventos.Actors do
|
||||
|
||||
def get_user_with_actor!(id) do
|
||||
user = Repo.get!(User, id)
|
||||
Repo.preload(user, :actor)
|
||||
Repo.preload(user, :actors)
|
||||
end
|
||||
|
||||
def get_actor_by_url(url) do
|
||||
@@ -312,7 +312,7 @@ defmodule Eventos.Actors do
|
||||
Get an user by email
|
||||
"""
|
||||
def find_by_email(email) do
|
||||
case Repo.preload(Repo.get_by(User, email: email), :actor) do
|
||||
case Repo.preload(Repo.get_by(User, email: email), :actors) do
|
||||
nil ->
|
||||
{:error, nil}
|
||||
user ->
|
||||
|
||||
@@ -8,8 +8,9 @@ defmodule Eventos.Actors.Service.Activation do
|
||||
|
||||
@doc false
|
||||
def check_confirmation_token(token) when is_binary(token) do
|
||||
with %User{} = user <- Repo.get_by(User, confirmation_token: token) do
|
||||
Actors.update_user(user, %{"confirmed_at" => DateTime.utc_now(), "confirmation_sent_at" => nil, "confirmation_token" => nil})
|
||||
with %User{} = user <- Repo.get_by(User, confirmation_token: token),
|
||||
{:ok, %User{} = user} <- Actors.update_user(user, %{"confirmed_at" => DateTime.utc_now(), "confirmation_sent_at" => nil, "confirmation_token" => nil}) do
|
||||
{:ok, Repo.preload(user, :actors)}
|
||||
else
|
||||
_err ->
|
||||
{:error, "Invalid token"}
|
||||
|
||||
@@ -11,7 +11,7 @@ defmodule Eventos.Actors.User do
|
||||
field :password_hash, :string
|
||||
field :password, :string, virtual: true
|
||||
field :role, :integer, default: 0
|
||||
belongs_to :actor, Actor
|
||||
has_many :actors, Actor
|
||||
field :confirmed_at, :utc_datetime
|
||||
field :confirmation_sent_at, :utc_datetime
|
||||
field :confirmation_token, :string
|
||||
@@ -24,7 +24,7 @@ defmodule Eventos.Actors.User do
|
||||
@doc false
|
||||
def changeset(%User{} = user, attrs) do
|
||||
user
|
||||
|> cast(attrs, [:email, :role, :password_hash, :actor_id, :confirmed_at, :confirmation_sent_at, :confirmation_token, :reset_password_sent_at, :reset_password_token])
|
||||
|> cast(attrs, [:email, :role, :password_hash, :confirmed_at, :confirmation_sent_at, :confirmation_token, :reset_password_sent_at, :reset_password_token])
|
||||
|> validate_required([:email])
|
||||
|> unique_constraint(:email, [message: "registration.error.email_already_used"])
|
||||
|> validate_format(:email, ~r/@/)
|
||||
|
||||
@@ -20,7 +20,7 @@ defmodule EventosWeb.GroupController do
|
||||
conn
|
||||
|> put_status(:created)
|
||||
|> put_resp_header("location", actor_path(conn, :show, group))
|
||||
|> render(EventosWeb.ActorView, "acccount_basic.json", actor: group)
|
||||
|> render(EventosWeb.ActorView, "actor_basic.json", actor: group)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -92,7 +92,7 @@ defmodule EventosWeb.UserController do
|
||||
def show_current_actor(conn, _params) do
|
||||
user = conn
|
||||
|> Guardian.Plug.current_resource()
|
||||
|> Repo.preload(:actor)
|
||||
|> Repo.preload(:actors)
|
||||
render(conn, "show_simple.json", user: user)
|
||||
end
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ defmodule EventosWeb.ActorView do
|
||||
alias Eventos.Actors
|
||||
|
||||
def render("index.json", %{actors: actors}) do
|
||||
%{data: render_many(actors, ActorView, "acccount_basic.json")}
|
||||
%{data: render_many(actors, ActorView, "actor_basic.json")}
|
||||
end
|
||||
|
||||
def render("show.json", %{actor: actor}) do
|
||||
@@ -18,7 +18,7 @@ defmodule EventosWeb.ActorView do
|
||||
%{data: render_one(actor, ActorView, "actor_basic.json")}
|
||||
end
|
||||
|
||||
def render("acccount_basic.json", %{actor: actor}) do
|
||||
def render("actor_basic.json", %{actor: actor}) do
|
||||
%{id: actor.id,
|
||||
username: actor.preferred_username,
|
||||
domain: actor.domain,
|
||||
|
||||
@@ -53,8 +53,8 @@ defmodule EventosWeb.EventView do
|
||||
begins_on: event.begins_on,
|
||||
ends_on: event.ends_on,
|
||||
uuid: event.uuid,
|
||||
organizer: render_one(event.organizer_actor, ActorView, "acccount_basic.json"),
|
||||
participants: render_many(event.participants, ActorView, "acccount_basic.json"),
|
||||
organizer: render_one(event.organizer_actor, ActorView, "actor_basic.json"),
|
||||
participants: render_many(event.participants, ActorView, "actor_basic.json"),
|
||||
physical_address: render_one(event.physical_address, AddressView, "address.json"),
|
||||
type: "Event",
|
||||
address_type: event.address_type,
|
||||
|
||||
@@ -32,7 +32,7 @@ defmodule EventosWeb.GroupView do
|
||||
description: group.description,
|
||||
suspended: group.suspended,
|
||||
url: group.url,
|
||||
members: render_many(group.members, ActorView, "acccount_basic.json"),
|
||||
members: render_many(group.members, ActorView, "actor_basic.json"),
|
||||
events: render_many(group.organized_events, EventView, "event_simple.json")
|
||||
}
|
||||
end
|
||||
|
||||
@@ -16,8 +16,8 @@ defmodule EventosWeb.MemberView do
|
||||
def render("member.json", %{member: member}) do
|
||||
%{
|
||||
role: member.role,
|
||||
actor: render_one(member.actor, ActorView, "acccount_basic.json"),
|
||||
group: render_one(member.parent, ActorView, "acccount_basic.json")
|
||||
actor: render_one(member.actor, ActorView, "actor_basic.json"),
|
||||
group: render_one(member.parent, ActorView, "actor_basic.json")
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
@@ -9,7 +9,7 @@ defmodule EventosWeb.SearchView do
|
||||
%{
|
||||
data: %{
|
||||
events: render_many(events, EventView, "event_simple.json"),
|
||||
actors: render_many(actors, ActorView, "acccount_basic.json"),
|
||||
actors: render_many(actors, ActorView, "actor_basic.json"),
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
@@ -28,14 +28,14 @@ defmodule EventosWeb.UserView do
|
||||
def render("user_simple.json", %{user: user}) do
|
||||
%{id: user.id,
|
||||
role: user.role,
|
||||
actor: render_one(user.actor, ActorView, "acccount_basic.json")
|
||||
actors: render_many(user.actors, ActorView, "actor_basic.json")
|
||||
}
|
||||
end
|
||||
|
||||
def render("user.json", %{user: user}) do
|
||||
%{id: user.id,
|
||||
role: user.role,
|
||||
actor: render_one(user.actor, ActorView, "actor.json")
|
||||
actors: render_many(user.actors, ActorView, "actor.json")
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user