Stage 2
This commit is contained in:
93
src/core/core_user.erl
Normal file
93
src/core/core_user.erl
Normal file
@@ -0,0 +1,93 @@
|
||||
-module(core_user).
|
||||
|
||||
-include("records.hrl").
|
||||
|
||||
-export([create/2, get_by_id/1, get_by_email/1, update/2, delete/1]).
|
||||
-export([email_exists/1]).
|
||||
|
||||
%% Создание пользователя
|
||||
create(Email, Password) ->
|
||||
% Сначала проверяем, существует ли email
|
||||
case email_exists(Email) of
|
||||
true ->
|
||||
{error, email_exists};
|
||||
false ->
|
||||
Id = generate_id(),
|
||||
{ok, PasswordHash} = logic_auth:hash_password(Password),
|
||||
User = #user{
|
||||
id = Id,
|
||||
email = Email,
|
||||
password_hash = PasswordHash,
|
||||
role = user,
|
||||
status = active,
|
||||
created_at = calendar:universal_time(),
|
||||
updated_at = calendar:universal_time()
|
||||
},
|
||||
|
||||
F = fun() ->
|
||||
mnesia:write(User),
|
||||
{ok, User}
|
||||
end,
|
||||
|
||||
case mnesia:transaction(F) of
|
||||
{atomic, Result} -> Result;
|
||||
{aborted, Reason} -> {error, Reason}
|
||||
end
|
||||
end.
|
||||
|
||||
%% Получение пользователя по ID
|
||||
get_by_id(Id) ->
|
||||
case mnesia:dirty_read(user, Id) of
|
||||
[] -> {error, not_found};
|
||||
[User] -> {ok, User}
|
||||
end.
|
||||
|
||||
%% Получение пользователя по email (через индекс позже)
|
||||
get_by_email(Email) ->
|
||||
Match = #user{email = Email, _ = '_'},
|
||||
case mnesia:dirty_match_object(Match) of
|
||||
[] -> {error, not_found};
|
||||
[User] -> {ok, User}
|
||||
end.
|
||||
|
||||
%% Проверка существования email
|
||||
email_exists(Email) ->
|
||||
case get_by_email(Email) of
|
||||
{ok, _} -> true;
|
||||
{error, _} -> false
|
||||
end.
|
||||
|
||||
%% Обновление пользователя
|
||||
update(Id, Updates) ->
|
||||
F = fun() ->
|
||||
case mnesia:read(user, Id) of
|
||||
[] ->
|
||||
{error, not_found};
|
||||
[User] ->
|
||||
UpdatedUser = apply_updates(User, Updates),
|
||||
mnesia:write(UpdatedUser),
|
||||
{ok, UpdatedUser}
|
||||
end
|
||||
end,
|
||||
|
||||
case mnesia:transaction(F) of
|
||||
{atomic, Result} -> Result;
|
||||
{aborted, Reason} -> {error, Reason}
|
||||
end.
|
||||
|
||||
%% Удаление пользователя (soft delete)
|
||||
delete(Id) ->
|
||||
update(Id, [{status, deleted}]).
|
||||
|
||||
%% Внутренние функции
|
||||
generate_id() ->
|
||||
base64:encode(crypto:strong_rand_bytes(16)).
|
||||
|
||||
apply_updates(User, Updates) ->
|
||||
lists:foldl(fun({Field, Value}, U) -> set_field(Field, Value, U) end, User, Updates).
|
||||
|
||||
set_field(email, Value, User) -> User#user{email = Value, updated_at = calendar:universal_time()};
|
||||
set_field(password_hash, Value, User) -> User#user{password_hash = Value, updated_at = calendar:universal_time()};
|
||||
set_field(role, Value, User) -> User#user{role = Value, updated_at = calendar:universal_time()};
|
||||
set_field(status, Value, User) -> User#user{status = Value, updated_at = calendar:universal_time()};
|
||||
set_field(_, _, User) -> User.
|
||||
Reference in New Issue
Block a user