Change models, new migrations, fix front and make tests work
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -1,22 +1,23 @@
|
||||
defmodule Eventos.Accounts.Account do
|
||||
use Ecto.Schema
|
||||
import Ecto.Changeset
|
||||
alias Eventos.Accounts.{Account, GroupAccount, GroupRequest, Group, User}
|
||||
alias Eventos.Accounts.{Account, User}
|
||||
alias Eventos.Groups.{Group, Member, Request}
|
||||
alias Eventos.Events.Event
|
||||
|
||||
schema "accounts" do
|
||||
field :username, :string
|
||||
field :description, :string
|
||||
field :display_name, :string
|
||||
field :domain, :string, default: nil
|
||||
field :domain, :string
|
||||
field :private_key, :string
|
||||
field :public_key, :string
|
||||
field :suspended, :boolean, default: false
|
||||
field :uri, :string
|
||||
field :url, :string
|
||||
has_many :organized_events, Event
|
||||
many_to_many :groups, Group, join_through: GroupAccount
|
||||
has_many :group_request, GroupRequest
|
||||
field :username, :string
|
||||
has_many :organized_events, Event, [foreign_key: :organizer_id]
|
||||
many_to_many :groups, Group, join_through: Member
|
||||
has_many :group_request, Request
|
||||
has_one :user, User
|
||||
|
||||
timestamps()
|
||||
@@ -26,7 +27,14 @@ defmodule Eventos.Accounts.Account do
|
||||
def changeset(%Account{} = account, attrs) do
|
||||
account
|
||||
|> cast(attrs, [:username, :domain, :display_name, :description, :private_key, :public_key, :suspended, :uri, :url])
|
||||
|> validate_required([:username, :display_name, :description, :private_key, :public_key, :suspended])
|
||||
|> validate_required([:username, :public_key, :suspended, :uri, :url])
|
||||
|> unique_constraint(:username, name: :accounts_username_domain_index)
|
||||
end
|
||||
|
||||
def registration_changeset(%Account{} = account, attrs) do
|
||||
account
|
||||
|> cast(attrs, [:username, :domain, :display_name, :description, :private_key, :public_key, :suspended, :uri, :url])
|
||||
|> validate_required([:username, :public_key, :suspended, :uri, :url])
|
||||
|> unique_constraint(:username)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -4,130 +4,8 @@ defmodule Eventos.Accounts do
|
||||
"""
|
||||
|
||||
import Ecto.Query, warn: false
|
||||
import Logger
|
||||
alias Eventos.Repo
|
||||
|
||||
alias Eventos.Accounts.User
|
||||
|
||||
@doc """
|
||||
Returns the list of users.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> list_users()
|
||||
[%User{}, ...]
|
||||
|
||||
"""
|
||||
def list_users do
|
||||
Repo.all(User)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Gets a single user.
|
||||
|
||||
Raises `Ecto.NoResultsError` if the User does not exist.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> get_user!(123)
|
||||
%User{}
|
||||
|
||||
iex> get_user!(456)
|
||||
** (Ecto.NoResultsError)
|
||||
|
||||
"""
|
||||
def get_user!(id), do: Repo.get!(User, id)
|
||||
|
||||
|
||||
@doc """
|
||||
Get an user by email
|
||||
"""
|
||||
def find(email) do
|
||||
Repo.get_by!(User, email: email)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Authenticate user
|
||||
"""
|
||||
def authenticate(%{user: user, password: password}) do
|
||||
# Does password match the one stored in the database?
|
||||
Logger.debug(user.password_hash)
|
||||
Logger.debug(password)
|
||||
case Comeonin.Argon2.checkpw(password, user.password_hash) do
|
||||
true ->
|
||||
# Yes, create and return the token
|
||||
EventosWeb.Guardian.encode_and_sign(user)
|
||||
_ ->
|
||||
# No, return an error
|
||||
{:error, :unauthorized}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@doc """
|
||||
Creates a user.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> create_user(%{field: value})
|
||||
{:ok, %User{}}
|
||||
|
||||
iex> create_user(%{field: bad_value})
|
||||
{:error, %Ecto.Changeset{}}
|
||||
|
||||
"""
|
||||
def create_user(attrs \\ %{}) do
|
||||
%User{}
|
||||
|> User.changeset(attrs)
|
||||
|> Repo.insert()
|
||||
end
|
||||
|
||||
@doc """
|
||||
Updates a user.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> update_user(user, %{field: new_value})
|
||||
{:ok, %User{}}
|
||||
|
||||
iex> update_user(user, %{field: bad_value})
|
||||
{:error, %Ecto.Changeset{}}
|
||||
|
||||
"""
|
||||
def update_user(%User{} = user, attrs) do
|
||||
user
|
||||
|> User.changeset(attrs)
|
||||
|> Repo.update()
|
||||
end
|
||||
|
||||
@doc """
|
||||
Deletes a User.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> delete_user(user)
|
||||
{:ok, %User{}}
|
||||
|
||||
iex> delete_user(user)
|
||||
{:error, %Ecto.Changeset{}}
|
||||
|
||||
"""
|
||||
def delete_user(%User{} = user) do
|
||||
Repo.delete(user)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Returns an `%Ecto.Changeset{}` for tracking user changes.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> change_user(user)
|
||||
%Ecto.Changeset{source: %User{}}
|
||||
|
||||
"""
|
||||
def change_user(%User{} = user) do
|
||||
User.changeset(user, %{})
|
||||
end
|
||||
import Logger
|
||||
|
||||
alias Eventos.Accounts.Account
|
||||
|
||||
@@ -158,7 +36,14 @@ defmodule Eventos.Accounts do
|
||||
** (Ecto.NoResultsError)
|
||||
|
||||
"""
|
||||
def get_account!(id), do: Repo.get!(Account, id)
|
||||
def get_account!(id) do
|
||||
account = Repo.get!(Account, id)
|
||||
end
|
||||
|
||||
def get_account_with_everything!(id) do
|
||||
account = Repo.get!(Account, id)
|
||||
|> Repo.preload :organized_events
|
||||
end
|
||||
|
||||
@doc """
|
||||
Creates a account.
|
||||
@@ -225,291 +110,177 @@ defmodule Eventos.Accounts do
|
||||
Account.changeset(account, %{})
|
||||
end
|
||||
|
||||
alias Eventos.Accounts.Group
|
||||
alias Eventos.Accounts.User
|
||||
|
||||
@doc """
|
||||
Returns the list of groups.
|
||||
Returns the list of users.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> list_groups()
|
||||
[%Group{}, ...]
|
||||
iex> list_users()
|
||||
[%User{}, ...]
|
||||
|
||||
"""
|
||||
def list_groups do
|
||||
Repo.all(Group)
|
||||
def list_users do
|
||||
Repo.all(User)
|
||||
end
|
||||
|
||||
def list_users_with_accounts do
|
||||
Repo.all(User)
|
||||
|> Repo.preload :account
|
||||
end
|
||||
|
||||
@doc """
|
||||
Gets a single group.
|
||||
Gets a single user.
|
||||
|
||||
Raises `Ecto.NoResultsError` if the Group does not exist.
|
||||
Raises `Ecto.NoResultsError` if the User does not exist.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> get_group!(123)
|
||||
%Group{}
|
||||
iex> get_user!(123)
|
||||
%User{}
|
||||
|
||||
iex> get_group!(456)
|
||||
iex> get_user!(456)
|
||||
** (Ecto.NoResultsError)
|
||||
|
||||
"""
|
||||
def get_group!(id), do: Repo.get!(Group, id)
|
||||
def get_user!(id), do: Repo.get!(User, id)
|
||||
|
||||
def get_user_with_account!(id) do
|
||||
Repo.get!(User, id)
|
||||
|> Repo.preload :account
|
||||
end
|
||||
|
||||
@doc """
|
||||
Creates a group.
|
||||
Get an user by email
|
||||
"""
|
||||
def find_by_email(email) do
|
||||
user = Repo.get_by(User, email: email)
|
||||
|> Repo.preload :account
|
||||
end
|
||||
|
||||
@doc """
|
||||
Authenticate user
|
||||
"""
|
||||
def authenticate(%{user: user, password: password}) do
|
||||
# Does password match the one stored in the database?
|
||||
case Comeonin.Argon2.checkpw(password, user.password_hash) do
|
||||
true ->
|
||||
# Yes, create and return the token
|
||||
EventosWeb.Guardian.encode_and_sign(user)
|
||||
_ ->
|
||||
# No, return an error
|
||||
{:error, :unauthorized}
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Register user
|
||||
"""
|
||||
def register(%{email: email, password: password, username: username}) do
|
||||
{:ok, {privkey, pubkey}} = RsaEx.generate_keypair("4096")
|
||||
|
||||
|
||||
account = Eventos.Accounts.Account.registration_changeset(%Eventos.Accounts.Account{}, %{
|
||||
username: username,
|
||||
domain: nil,
|
||||
private_key: privkey,
|
||||
public_key: pubkey,
|
||||
uri: "h",
|
||||
url: "h"
|
||||
})
|
||||
|
||||
user = Eventos.Accounts.User.registration_changeset(%Eventos.Accounts.User{}, %{
|
||||
email: email,
|
||||
password: password
|
||||
})
|
||||
|
||||
|
||||
account_with_user = Ecto.Changeset.put_assoc(account, :user, user)
|
||||
|
||||
try do
|
||||
coucou = Eventos.Repo.insert!(account_with_user)
|
||||
user = find_by_email(email)
|
||||
{:ok, user}
|
||||
rescue
|
||||
e in Ecto.InvalidChangesetError ->
|
||||
Logger.debug(inspect e)
|
||||
{:error, e.changeset.changes.user.errors}
|
||||
end
|
||||
|
||||
# with {:ok, %Account{} = account} <- create_account(%{username: username, suspended: false, domain: nil, private_key: privkey, public_key: pubkey, uri: "h", url: "h"}) do
|
||||
# case create_user(%{email: email, password: password, account: account}) do
|
||||
# {:ok, %User{} = user } ->
|
||||
# {:ok, user}
|
||||
# {:error, %Ecto.Changeset{} = changeset} ->
|
||||
# {:error, changeset}
|
||||
# end
|
||||
# end
|
||||
end
|
||||
|
||||
|
||||
@doc """
|
||||
Creates a user.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> create_group(%{field: value})
|
||||
{:ok, %Group{}}
|
||||
iex> create_user(%{field: value})
|
||||
{:ok, %User{}}
|
||||
|
||||
iex> create_group(%{field: bad_value})
|
||||
iex> create_user(%{field: bad_value})
|
||||
{:error, %Ecto.Changeset{}}
|
||||
|
||||
"""
|
||||
def create_group(attrs \\ %{}) do
|
||||
%Group{}
|
||||
|> Group.changeset(attrs)
|
||||
def create_user(attrs \\ %{}) do
|
||||
%User{}
|
||||
|> User.registration_changeset(attrs)
|
||||
|> Repo.insert()
|
||||
end
|
||||
|
||||
@doc """
|
||||
Updates a group.
|
||||
Updates a user.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> update_group(group, %{field: new_value})
|
||||
{:ok, %Group{}}
|
||||
iex> update_user(user, %{field: new_value})
|
||||
{:ok, %User{}}
|
||||
|
||||
iex> update_group(group, %{field: bad_value})
|
||||
iex> update_user(user, %{field: bad_value})
|
||||
{:error, %Ecto.Changeset{}}
|
||||
|
||||
"""
|
||||
def update_group(%Group{} = group, attrs) do
|
||||
group
|
||||
|> Group.changeset(attrs)
|
||||
def update_user(%User{} = user, attrs) do
|
||||
user
|
||||
|> User.changeset(attrs)
|
||||
|> Repo.update()
|
||||
end
|
||||
|
||||
@doc """
|
||||
Deletes a Group.
|
||||
Deletes a User.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> delete_group(group)
|
||||
{:ok, %Group{}}
|
||||
iex> delete_user(user)
|
||||
{:ok, %User{}}
|
||||
|
||||
iex> delete_group(group)
|
||||
iex> delete_user(user)
|
||||
{:error, %Ecto.Changeset{}}
|
||||
|
||||
"""
|
||||
def delete_group(%Group{} = group) do
|
||||
Repo.delete(group)
|
||||
def delete_user(%User{} = user) do
|
||||
Repo.delete(user)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Returns an `%Ecto.Changeset{}` for tracking group changes.
|
||||
Returns an `%Ecto.Changeset{}` for tracking user changes.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> change_group(group)
|
||||
%Ecto.Changeset{source: %Group{}}
|
||||
iex> change_user(user)
|
||||
%Ecto.Changeset{source: %User{}}
|
||||
|
||||
"""
|
||||
def change_group(%Group{} = group) do
|
||||
Group.changeset(group, %{})
|
||||
end
|
||||
|
||||
alias Eventos.Accounts.GroupAccount
|
||||
|
||||
@doc """
|
||||
Returns the list of group_accounts.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> list_group_accounts()
|
||||
[%GroupAccount{}, ...]
|
||||
|
||||
"""
|
||||
def list_group_accounts do
|
||||
Repo.all(GroupAccount)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Gets a single group_account.
|
||||
|
||||
Raises `Ecto.NoResultsError` if the Group account does not exist.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> get_group_account!(123)
|
||||
%GroupAccount{}
|
||||
|
||||
iex> get_group_account!(456)
|
||||
** (Ecto.NoResultsError)
|
||||
|
||||
"""
|
||||
def get_group_account!(id), do: Repo.get!(GroupAccount, id)
|
||||
|
||||
@doc """
|
||||
Creates a group_account.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> create_group_account(%{field: value})
|
||||
{:ok, %GroupAccount{}}
|
||||
|
||||
iex> create_group_account(%{field: bad_value})
|
||||
{:error, %Ecto.Changeset{}}
|
||||
|
||||
"""
|
||||
def create_group_account(attrs \\ %{}) do
|
||||
%GroupAccount{}
|
||||
|> GroupAccount.changeset(attrs)
|
||||
|> Repo.insert()
|
||||
end
|
||||
|
||||
@doc """
|
||||
Updates a group_account.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> update_group_account(group_account, %{field: new_value})
|
||||
{:ok, %GroupAccount{}}
|
||||
|
||||
iex> update_group_account(group_account, %{field: bad_value})
|
||||
{:error, %Ecto.Changeset{}}
|
||||
|
||||
"""
|
||||
def update_group_account(%GroupAccount{} = group_account, attrs) do
|
||||
group_account
|
||||
|> GroupAccount.changeset(attrs)
|
||||
|> Repo.update()
|
||||
end
|
||||
|
||||
@doc """
|
||||
Deletes a GroupAccount.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> delete_group_account(group_account)
|
||||
{:ok, %GroupAccount{}}
|
||||
|
||||
iex> delete_group_account(group_account)
|
||||
{:error, %Ecto.Changeset{}}
|
||||
|
||||
"""
|
||||
def delete_group_account(%GroupAccount{} = group_account) do
|
||||
Repo.delete(group_account)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Returns an `%Ecto.Changeset{}` for tracking group_account changes.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> change_group_account(group_account)
|
||||
%Ecto.Changeset{source: %GroupAccount{}}
|
||||
|
||||
"""
|
||||
def change_group_account(%GroupAccount{} = group_account) do
|
||||
GroupAccount.changeset(group_account, %{})
|
||||
end
|
||||
|
||||
alias Eventos.Accounts.GroupRequest
|
||||
|
||||
@doc """
|
||||
Returns the list of group_request.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> list_group_requests()
|
||||
[%GroupRequest{}, ...]
|
||||
|
||||
"""
|
||||
def list_group_requests do
|
||||
Repo.all(GroupRequest)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Gets a single group_request.
|
||||
|
||||
Raises `Ecto.NoResultsError` if the Group request does not exist.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> get_group_request!(123)
|
||||
%GroupRequest{}
|
||||
|
||||
iex> get_group_request!(456)
|
||||
** (Ecto.NoResultsError)
|
||||
|
||||
"""
|
||||
def get_group_request!(id), do: Repo.get!(GroupRequest, id)
|
||||
|
||||
@doc """
|
||||
Creates a group_request.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> create_group_request(%{field: value})
|
||||
{:ok, %GroupRequest{}}
|
||||
|
||||
iex> create_group_request(%{field: bad_value})
|
||||
{:error, %Ecto.Changeset{}}
|
||||
|
||||
"""
|
||||
def create_group_request(attrs \\ %{}) do
|
||||
%GroupRequest{}
|
||||
|> GroupRequest.changeset(attrs)
|
||||
|> Repo.insert()
|
||||
end
|
||||
|
||||
@doc """
|
||||
Updates a group_request.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> update_group_request(group_request, %{field: new_value})
|
||||
{:ok, %GroupRequest{}}
|
||||
|
||||
iex> update_group_request(group_request, %{field: bad_value})
|
||||
{:error, %Ecto.Changeset{}}
|
||||
|
||||
"""
|
||||
def update_group_request(%GroupRequest{} = group_request, attrs) do
|
||||
group_request
|
||||
|> GroupRequest.changeset(attrs)
|
||||
|> Repo.update()
|
||||
end
|
||||
|
||||
@doc """
|
||||
Deletes a GroupRequest.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> delete_group_request(group_request)
|
||||
{:ok, %GroupRequest{}}
|
||||
|
||||
iex> delete_group_request(group_request)
|
||||
{:error, %Ecto.Changeset{}}
|
||||
|
||||
"""
|
||||
def delete_group_request(%GroupRequest{} = group_request) do
|
||||
Repo.delete(group_request)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Returns an `%Ecto.Changeset{}` for tracking group_request changes.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> change_group_request(group_request)
|
||||
%Ecto.Changeset{source: %GroupRequest{}}
|
||||
|
||||
"""
|
||||
def change_group_request(%GroupRequest{} = group_request) do
|
||||
GroupRequest.changeset(group_request, %{})
|
||||
def change_user(%User{} = user) do
|
||||
User.changeset(user, %{})
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
defmodule Eventos.Accounts.Group do
|
||||
use Ecto.Schema
|
||||
import Ecto.Changeset
|
||||
alias Eventos.Accounts.{Group, Account, GroupAccount, GroupRequest}
|
||||
|
||||
|
||||
schema "groups" do
|
||||
field :description, :string
|
||||
field :suspended, :boolean, default: false
|
||||
field :title, :string
|
||||
field :uri, :string
|
||||
field :url, :string
|
||||
many_to_many :accounts, Account, join_through: GroupAccount
|
||||
has_many :requests, GroupRequest
|
||||
|
||||
timestamps()
|
||||
end
|
||||
|
||||
@doc false
|
||||
def changeset(%Group{} = group, attrs) do
|
||||
group
|
||||
|> cast(attrs, [:title, :description, :suspended, :url, :uri])
|
||||
|> validate_required([:title, :description, :suspended, :url, :uri])
|
||||
end
|
||||
end
|
||||
@@ -1,21 +0,0 @@
|
||||
defmodule Eventos.Accounts.GroupAccount do
|
||||
use Ecto.Schema
|
||||
import Ecto.Changeset
|
||||
alias Eventos.Accounts.{GroupAccount, Account, Group}
|
||||
|
||||
@primary_key false
|
||||
schema "group_accounts" do
|
||||
field :role, :integer
|
||||
belongs_to :group, Group
|
||||
belongs_to :account, Account
|
||||
|
||||
timestamps()
|
||||
end
|
||||
|
||||
@doc false
|
||||
def changeset(%GroupAccount{} = group_account, attrs) do
|
||||
group_account
|
||||
|> cast(attrs, [:role])
|
||||
|> validate_required([:role])
|
||||
end
|
||||
end
|
||||
@@ -1,20 +0,0 @@
|
||||
defmodule Eventos.Accounts.GroupRequest do
|
||||
use Ecto.Schema
|
||||
import Ecto.Changeset
|
||||
alias Eventos.Accounts.{GroupRequest}
|
||||
|
||||
schema "group_requests" do
|
||||
field :state, :integer
|
||||
field :group_id, :integer
|
||||
field :account_id, :integer
|
||||
|
||||
timestamps()
|
||||
end
|
||||
|
||||
@doc false
|
||||
def changeset(%GroupRequest{} = group_request, attrs) do
|
||||
group_request
|
||||
|> cast(attrs, [:state])
|
||||
|> validate_required([:state])
|
||||
end
|
||||
end
|
||||
@@ -2,24 +2,22 @@ defmodule Eventos.Accounts.User do
|
||||
use Ecto.Schema
|
||||
import Ecto.Changeset
|
||||
alias Eventos.Accounts.{Account, User}
|
||||
alias Eventos.Repo
|
||||
|
||||
import Logger
|
||||
|
||||
schema "users" do
|
||||
field :email, :string
|
||||
field :role, :integer, default: 0
|
||||
field :password, :string, virtual: true
|
||||
field :password_hash, :string
|
||||
field :password, :string, virtual: true
|
||||
field :role, :integer, default: 0
|
||||
belongs_to :account, Account
|
||||
|
||||
timestamps()
|
||||
end
|
||||
|
||||
|
||||
@doc false
|
||||
def changeset(%User{} = user, attrs) do
|
||||
user
|
||||
|> cast(attrs, [:email, :password_hash])
|
||||
|> cast(attrs, [:email, :role, :password_hash, :account_id])
|
||||
|> validate_required([:email])
|
||||
|> unique_constraint(:email)
|
||||
|> validate_format(:email, ~r/@/)
|
||||
@@ -44,4 +42,5 @@ defmodule Eventos.Accounts.User do
|
||||
changeset
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user