Allow multiple identities (accounts actors) for one user.

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2018-07-10 10:00:07 +02:00
parent a71b81af91
commit dee437e4f3
45 changed files with 155 additions and 156 deletions

View File

@@ -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])

View File

@@ -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 ->

View File

@@ -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"}

View File

@@ -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/@/)

View File

@@ -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

View File

@@ -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

View File

@@ -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,

View File

@@ -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,

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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