Hash :
1f16488e
Author :
Thomas de Grivel
Date :
2021-11-29T07:27:06
recaptcha
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
defmodule Kmxgit.UserManager do
@moduledoc """
The UserManager context.
"""
import Ecto.Query, warn: false
alias Kmxgit.Repo
alias Kmxgit.SlugManager.Slug
alias Kmxgit.UserManager.User
alias Bcrypt
def list_users do
Repo.all from user in User, preload: :slug
end
def get_user!(id) do
user = Repo.one(from user in User,
where: [id: ^id],
preload: [:slug,
organisations: :slug,
owned_repositories: [organisation: :slug,
user: :slug]])
user || raise Ecto.NoResultsError
end
def get_user(id) do
Repo.one from user in User,
where: [id: ^id],
preload: [organisations: :slug],
preload: [owned_repositories: [organisation: :slug, user: :slug]],
preload: :slug
end
def get_user_by_slug(slug) do
Repo.one from u in User,
join: s in Slug,
on: s.user_id == u.id,
where: fragment("lower(?)", s.slug) == ^String.downcase(slug),
limit: 1,
preload: [:slug,
organisations: :slug,
owned_repositories: [organisation: :slug,
user: :slug]]
end
def create_user(attrs \\ %{}) do
%User{}
|> User.changeset(attrs)
|> Repo.insert()
end
def admin_create_user(attrs \\ %{}) do
%User{}
|> User.admin_changeset(attrs)
|> Repo.insert()
end
def update_user(%User{} = user, attrs) do
user
|> User.changeset(attrs)
|> Repo.update()
end
def admin_update_user(%User{} = user, attrs) do
user
|> User.admin_changeset(attrs)
|> Repo.update()
end
def delete_user(%User{} = user) do
user
|> change_user()
|> Repo.delete()
end
def change_user(%User{} = user) do
User.changeset(user, %{})
end
def authenticate_user(login, password) do
query = from u in User,
join: s in Slug,
on: s.user_id == u.id,
where: fragment("lower(?)", s.slug) == ^String.downcase(login) or fragment("lower(?)", u.email) == ^String.downcase(login),
limit: 1
case Repo.one(query) do
nil ->
Bcrypt.no_user_verify()
{:error, :invalid_credentials}
user ->
if Bcrypt.verify_pass(password, user.encrypted_password) do
{:ok, user}
else
{:error, :invalid_credentials}
end
end
end
def admin_user_present? do
if Repo.one(from user in User,
where: [is_admin: true],
limit: 1) do
true
else
false
end
end
end